Merge branch 'master' of gitosis@stbuehler.de:icfp11

Conflicts:

	src/wscript
This commit is contained in:
Stefan Bühler 2008-07-12 02:17:45 +02:00
commit b477e64c3e
4 changed files with 129 additions and 0 deletions

View File

@ -1,10 +1,12 @@
#include "control.h" #include "control.h"
#include "path.h"
#include <stdio.h> #include <stdio.h>
int main(int argc, char **argv) { int main(int argc, char **argv) {
trial *t; trial *t;
path *p;
if (argc <= 2) { if (argc <= 2) {
fprintf(stderr, "Syntax: %s hostname port\n", argv[0]); fprintf(stderr, "Syntax: %s hostname port\n", argv[0]);
@ -14,7 +16,16 @@ int main(int argc, char **argv) {
if (NULL == (t = trial_new(argv[1], argv[2]))) { if (NULL == (t = trial_new(argv[1], argv[2]))) {
return 2; return 2;
} }
/*create trivial path towards the origin*/
p = path_new(&t->map,&t->vehicle);
while(t->alive){
trial_wait_for_input(t);
path_execute(t,p);
}
path_free(p);
trial_free(t); trial_free(t);
return 0; return 0;

85
src/path.c Normal file
View File

@ -0,0 +1,85 @@
#include <math.h>
#include "path.h"
command *command_new(timestamp ts, accel_t a, turn_t t){
command* res;
res = g_slice_new(command);
res->ts = ts;
res->accel = a;
res->turn = t;
}
void command_free(command* c){
g_slice_free(command, c);
}
path *path_new(map* m,vehicle *v){
command* tmp;
path* res;
double angle, stop;
res->commands = g_queue_new();
/* Calculate a trivial path to the origin*/
/* Turn towards origin, take shorter direction*/
angle = atan(v->y/y->x);
stop = abs(angle - v->dir)/m->max_turn;
if(angle - v->dir > 0){
/*clockwise/left turn*/
tmp = command_new(0,BREAK,TURN_LEFT);
g_push_tail(res-commands,tmp);
tmp = command_new(stop,BREAK,TURN_RIGHT);
g_push_tail(res-commands,tmp);
else {
/*counterclockwise/right turn*/
tmp = command_new(0,BREAK,TURN_RIGHT);
g_push_tail(res-commands,tmp);
tmp = command_new(stop,BREAK,TURN_LEFT);
g_push_tail(res-commands,tmp);
}
/*start driving*/
tmp = command_new(stop,ACCEL,TURN_STRAIGHT);
g_push_tail(res-commands,tmp);
}
void path_execute(trial* t,path* p){
command* tmp;
tmp = (command*) g_queue_peek_head(p->commands);
/*magic number for latency, send messages that much earlier*/
while(tmp->ts - t->last_ts < 20){
tmp = (command*) g_queue_pop_head(p->commands);
switch(tmp->turn){
case TURN_HARD_LEFT: vehicle_hard_left(t); break;
case TURN_LEFT: vehicle_left(t); break;
case TURN_STRAIGHT: vehicle_straight(t); break;
case TURN_RIGHT: vehicle_right(t); break;
case TURN_HARD_RIGHT: vehicle_hard_right(t); break;
}
switch(tmp->accel){
case ACCEL: vehicle_accel(t); break;
case ROLL: vehicle_roll(t); break;
case BREAK: vehicle_break(t); break;
}
command_free(tmp);
tmp = (command*) g_queue_peek_head(p->commands);
}
}
void path_free(path* p){
int length;
command* tmp;
length = g_queue_get_length(p->commands);
if(length > 0){
fprintf(stderr,"freeing non-empty path\n");
while(g_queue_get_length(p->commands > 0)){
tmp = g_queue_pop_head(p->commands);
command_free(tmp);
}
}
g_queue_free(p->commands);
g_slice_free(path,p);
}

32
src/path.h Normal file
View File

@ -0,0 +1,32 @@
#ifndef _PATH_H
#define _PATH_H
#include "control.h"
struct path;
typedef struct path path;
struct command;
typedef struct command command;
struct command{
timestamp ts;
accel_t accel;
turn_t turn;
};
struct path {
GQueue* commands;
};
command *command_new(timestamp ts, accel_t a, turn_t t);
void command_free(command* c);
path *path_new(map* m,vehicle *c);
void path_execute(trial* t,path* p);
void path_free(path* p);
#endif

View File

@ -7,6 +7,7 @@ main_source = '''
main.c main.c
control.c control.c
control_parser.rl control_parser.rl
path.c
''' '''
def build(bld): def build(bld):