/* sonar, Copyright (c) 1998-2012 Jamie Zawinski and Stephen Martin
 *
 * Permission to use, copy, modify, distribute, and sell this software and its
 * documentation for any purpose is hereby granted without fee, provided that
 * the above copyright notice appear in all copies and that both that
 * copyright notice and this permission notice appear in supporting
 * documentation.  No representations are made about the suitability of this
 * software for any purpose.  It is provided "as is" without express or 
 * implied warranty.
 */

#ifndef __SONAR_XSCREENSAVER_H__
#define __SONAR_XSCREENSAVER_H__

typedef struct sonar_sensor_data sonar_sensor_data;
typedef struct sonar_bogie sonar_bogie;

struct sonar_bogie {
  void *closure;
  char *name;		/* bogie name, e.g., host name */
  char *desc;		/* second line of text, e.g., ping time */
  double r;		/* distance, 0 - 1.0 */
  double th;		/* heading, 0 - 2 pi */
  double ttl;		/* time to live, 0 - 2 pi */
  sonar_bogie *next;	/* next one in the list */
};

struct sonar_sensor_data {
  void *closure;

  /* Called frequently (every time the sweep moves).
     Returns a list of new bogies to be added to the display list 
     once the sweep comes around to their position.
   */
  sonar_bogie *(*scan_cb) (sonar_sensor_data *);

  /* Called when a bogie is freed, to free bogie->closure */
  void (*free_bogie_cb) (sonar_sensor_data *, void *closure);

  /* Called at exit, to free ssd->closure */
  void (*free_data_cb) (sonar_sensor_data *, void *closure);
};

/* frees bogie and its contents, including calling the free_bogie_cb. */
extern void sonar_free_bogie (sonar_sensor_data *ssd, sonar_bogie *b);

/* makes a copy of the bogie, not including the 'closure' data. */
extern sonar_bogie *sonar_copy_bogie (sonar_sensor_data *,
                                      const sonar_bogie *);


/* Set up and return sensor state for ICMP pings. */
extern sonar_sensor_data *sonar_init_ping (Display *dpy, 
                                           char **error_ret,
                                           char **desc_ret,
                                           const char *subnets,
                                           int ping_timeout,
                                           Bool resolve_p, Bool times_p,
                                           Bool debug_p);

/* Set up and return sensor state for the simulation. */
extern sonar_sensor_data *sonar_init_simulation (Display *dpy,
                                                 char **error_ret,
                                                 char **desc_ret,
                                                 const char *team_a_name, 
                                                 const char *team_b_name,
                                                 int team_a_count, 
                                                 int team_b_count,
                                                 Bool debug_p);

#endif /* __SONAR_XSCREENSAVER_H__ */
