icfp11/src/control.h

228 lines
5.2 KiB
C
Raw Normal View History

2008-07-11 20:38:17 +00:00
#ifndef _CONTROL_H
#define _CONTROL_H
2008-07-12 00:17:29 +00:00
#include "config.h"
2008-07-11 22:20:05 +00:00
#include <unistd.h>
#include <sys/time.h>
2008-07-11 21:30:34 +00:00
#include <glib.h>
2008-07-12 08:49:48 +00:00
#include <stdio.h>
2008-07-11 20:38:17 +00:00
2008-07-11 22:11:41 +00:00
#define INLINE static inline
#define UNUSED(x) ((void)(x))
2008-07-12 14:00:47 +00:00
#define VEHICLE_RADIUS 0.5
#define HOMEBASE_RADIUS 5
#define MARTIAN_RADIUS 0.4
typedef enum { RUN_ERROR, RUN_DONE, RUN_GO_ON, RUN_FINISHED } run_t;
2008-07-12 10:12:18 +00:00
typedef enum { ACCEL, ROLL, BRAKE } accel_t;
2008-07-11 22:11:41 +00:00
typedef enum { TURN_HARD_LEFT, TURN_LEFT, TURN_STRAIGHT, TURN_RIGHT, TURN_HARD_RIGHT } turn_t;
2008-07-11 21:30:34 +00:00
typedef enum { BOLDER, CRATER, MARTIAN } object_t;
struct object;
typedef struct object object;
struct vehicle;
typedef struct vehicle vehicle;
struct telemetry;
typedef struct telemetry telemetry;
2008-07-12 15:50:24 +00:00
struct simulated;
typedef struct simulated simulated;
2008-07-11 21:30:34 +00:00
struct map;
typedef struct map map;
struct trial;
typedef struct trial trial;
typedef unsigned int timestamp;
2008-07-12 00:17:29 +00:00
#include "control_parser.h"
2008-07-11 21:30:34 +00:00
struct object {
object_t type;
double x, y, rad;
double dir, speed;
};
struct vehicle {
accel_t accel;
turn_t turn;
double x, y;
double dir, speed;
};
struct telemetry {
timestamp ts;
vehicle vehicle;
2008-07-11 22:11:41 +00:00
GArray *objects;
2008-07-11 21:30:34 +00:00
};
struct map {
float dx, dy;
timestamp limit;
float min_sensor, max_sensor;
2008-07-12 00:31:36 +00:00
float max_speed, max_turn, max_hard_turn;
2008-07-11 21:30:34 +00:00
2008-07-13 16:42:05 +00:00
GHashTable *solid_objects;
2008-07-11 21:30:34 +00:00
};
2008-07-12 15:50:24 +00:00
struct simulated {
2008-07-13 13:19:43 +00:00
telemetry tm;
guint steps;
2008-07-12 15:50:24 +00:00
};
2008-07-11 21:30:34 +00:00
struct trial {
map map;
timestamp last_ts;
2008-07-11 22:20:05 +00:00
GQueue telemetry;
2008-07-12 15:50:24 +00:00
vehicle vehicle;
int alive, finished;
2008-07-12 15:50:24 +00:00
simulated sim;
int runcnt;
2008-07-11 22:11:41 +00:00
/* internal */
2008-07-12 15:50:24 +00:00
struct timeval started;
2008-07-11 22:11:41 +00:00
int socket;
2008-07-12 00:17:29 +00:00
control_parser_ctx *parse_ctx;
2008-07-11 21:30:34 +00:00
};
2008-07-12 15:50:24 +00:00
/* extern */
2008-07-12 21:38:19 +00:00
void simulate(trial *t, timestamp ts);
2008-07-12 15:50:24 +00:00
void godown(trial *t);
2008-07-13 13:19:43 +00:00
void goradar(trial *t);
2008-07-12 15:50:24 +00:00
2008-07-11 21:30:34 +00:00
/* trial */
2008-07-11 22:55:36 +00:00
trial *trial_new(const char *hostname, const char *port);
2008-07-11 22:11:41 +00:00
void trial_reset_run(trial *t);
int trial_wait_for_start(trial *t);
int trial_check_input(trial *t);
int trial_wait_for_input(trial *t);
2008-07-11 22:11:41 +00:00
void trial_free(trial *t);
2008-07-13 16:42:05 +00:00
object* object_new(object_t type, double x, double y, double rad, double dir, double speed);
2008-07-12 01:10:38 +00:00
/* debugging stuff */
void object_print(object *o);
void vehicle_print(vehicle *v);
void telemetry_print(telemetry *t);
void trial_print(trial *t);
void trial_matlab(trial *t);
2008-07-12 01:10:38 +00:00
void map_print(map *m);
2008-07-11 22:11:41 +00:00
INLINE void vehicle_accel(trial *t);
INLINE void vehicle_roll(trial *t);
INLINE void vehicle_break(trial *t);
INLINE void vehicle_hard_left(trial *t);
INLINE void vehicle_left(trial *t);
INLINE void vehicle_straight(trial *t);
INLINE void vehicle_right(trial *t);
INLINE void vehicle_hard_right(trial *t);
INLINE timestamp getcurts(trial *t);
2008-07-12 01:29:24 +00:00
/* needed by parser */
telemetry* telemetry_new();
2008-07-11 22:11:41 +00:00
/* Inline functions */
2008-07-12 15:50:24 +00:00
#define SENDCMD(t, cmd) do { \
write(t->socket, cmd, sizeof(cmd)-1); \
/* write(1, cmd, sizeof(cmd)-1); */ \
} while(0)
2008-07-11 22:11:41 +00:00
INLINE void vehicle_accel(trial *t) {
switch (t->vehicle.accel) {
case ACCEL: return;
case ROLL: SENDCMD(t, "a;"); break;
2008-07-12 10:12:18 +00:00
case BRAKE: SENDCMD(t, "a;a;"); break;
2008-07-11 22:11:41 +00:00
}
t->vehicle.accel = ACCEL;
}
INLINE void vehicle_roll(trial *t) {
switch (t->vehicle.accel) {
case ACCEL: SENDCMD(t, "b;"); break;
case ROLL: return;
2008-07-12 10:12:18 +00:00
case BRAKE: SENDCMD(t, "a;"); break;
2008-07-11 22:11:41 +00:00
}
t->vehicle.accel = ROLL;
}
INLINE void vehicle_break(trial *t) {
switch (t->vehicle.accel) {
case ACCEL: SENDCMD(t, "b;b;"); break;
case ROLL: SENDCMD(t, "b;"); break;
2008-07-12 10:12:18 +00:00
case BRAKE: return;
2008-07-11 22:11:41 +00:00
}
2008-07-12 10:12:18 +00:00
t->vehicle.accel = BRAKE;
2008-07-11 22:11:41 +00:00
}
INLINE void vehicle_hard_left(trial *t) {
switch (t->vehicle.turn) {
case TURN_HARD_LEFT: return;
case TURN_LEFT: SENDCMD(t, "l;"); break;
case TURN_STRAIGHT: SENDCMD(t, "l;l;"); break;
case TURN_RIGHT: SENDCMD(t, "l;l;l;"); break;
case TURN_HARD_RIGHT: SENDCMD(t, "l;l;l;l;"); break;
}
t->vehicle.turn = TURN_HARD_LEFT;
}
INLINE void vehicle_left(trial *t) {
switch (t->vehicle.turn) {
case TURN_HARD_LEFT: SENDCMD(t, "r;"); break;
case TURN_LEFT: return;
case TURN_STRAIGHT: SENDCMD(t, "l;"); break;
case TURN_RIGHT: SENDCMD(t, "l;l;"); break;
case TURN_HARD_RIGHT: SENDCMD(t, "l;l;l;"); break;
}
t->vehicle.turn = TURN_LEFT;
}
INLINE void vehicle_straight(trial *t) {
switch (t->vehicle.turn) {
case TURN_HARD_LEFT: SENDCMD(t, "r;r;"); break;
case TURN_LEFT: SENDCMD(t, "r;"); break;
case TURN_STRAIGHT: return;
case TURN_RIGHT: SENDCMD(t, "l;"); break;
case TURN_HARD_RIGHT: SENDCMD(t, "l;l;"); break;
}
t->vehicle.turn = TURN_STRAIGHT;
}
INLINE void vehicle_right(trial *t) {
switch (t->vehicle.turn) {
case TURN_HARD_LEFT: SENDCMD(t, "r;r;r;"); break;
case TURN_LEFT: SENDCMD(t, "r;r;"); break;
case TURN_STRAIGHT: SENDCMD(t, "r;"); break;
case TURN_RIGHT: return;
case TURN_HARD_RIGHT: SENDCMD(t, "l;"); break;
}
t->vehicle.turn = TURN_RIGHT;
}
INLINE void vehicle_hard_right(trial *t) {
switch (t->vehicle.turn) {
case TURN_HARD_LEFT: SENDCMD(t, "r;r;r;r;"); break;
case TURN_LEFT: SENDCMD(t, "r;r;r;"); break;
case TURN_STRAIGHT: SENDCMD(t, "r;r;"); break;
case TURN_RIGHT: SENDCMD(t, "r;"); break;
case TURN_HARD_RIGHT: return;
}
t->vehicle.turn = TURN_HARD_RIGHT;
}
2008-07-11 20:38:17 +00:00
INLINE timestamp getcurts(trial *t) {
struct timeval tv;
gettimeofday(&tv, NULL);
2008-07-12 08:49:48 +00:00
timestamp ts = (tv.tv_sec - t->started.tv_sec) * 1000 + (tv.tv_usec - t->started.tv_usec) / 1000;
2008-07-12 09:02:49 +00:00
// printf("Timestamp: %u\n", ts);
2008-07-12 08:49:48 +00:00
return ts;
}
2008-07-11 20:38:17 +00:00
#endif