Merge branch 'master' of gitosis@stbuehler.de:icfp11
Conflicts: src/wscript
This commit is contained in:
commit
b477e64c3e
11
src/main.c
11
src/main.c
@ -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]);
|
||||||
@ -15,6 +17,15 @@ int main(int argc, char **argv) {
|
|||||||
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
85
src/path.c
Normal 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
32
src/path.h
Normal 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
|
@ -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):
|
||||||
|
Loading…
Reference in New Issue
Block a user