Go to the documentation of this file.00001
00002
00003 #include <math.h>
00004 #include <stdio.h>
00005 #include <stdlib.h>
00006 #include <unistd.h>
00007
00008 #define USAGE \
00009 "USAG: make_motes [-n <number> -p <base port> -f <pnm file>"\
00010 " -r <resolution> -s <scale> -i <base index>"\
00011 " -o <world_file> -g <swarm geometry>]"
00012
00013
00014
00015 typedef struct{
00016 double x;
00017 double y;
00018 double th;
00019 } pos_t;
00020
00021 pos_t *pos_list;
00022
00023 int num_nodes = 25;
00024 int base_index = 0;
00025 int base_port = 6660;
00026 float scale = 0.09;
00027 float res = 0.15;
00028 char shape_name[32] = "random";
00029 char world_filename[32] = "gts.world";
00030 char pnm_filename[32] = "simple.pnm";
00031
00032 FILE *world_file;
00033
00034
00035
00036 void parse_args(int argc, char** argv)
00037 {
00038 int i;
00039
00040 i=1;
00041 while(i<argc){
00042
00043 if(!strcmp(argv[i],"-g")){
00044 if(++i<argc){
00045 strcpy(shape_name,argv[i]);
00046 }
00047 else{
00048 puts(USAGE);
00049 exit(1);
00050 }
00051 }
00052
00053 else if(!strcmp(argv[i],"-o")){
00054 if(++i<argc)
00055 strcpy(world_filename,argv[i]);
00056 else{
00057 puts(USAGE);
00058 exit(1);
00059 }
00060 }
00061
00062 else if(!strcmp(argv[i],"-n")){
00063 if(++i<argc){
00064 num_nodes = atoi(argv[i]);
00065 }
00066 else{
00067 puts(USAGE);
00068 exit(1);
00069 }
00070 }
00071
00072 else if(!strcmp(argv[i],"-i")){
00073 if(++i<argc){
00074 base_index = atoi(argv[i]);
00075 }
00076 else{
00077 puts(USAGE);
00078 exit(1);
00079 }
00080 }
00081
00082 else if(!strcmp(argv[i],"-s")){
00083 if(++i<argc){
00084 scale = atof(argv[i]);
00085 }
00086 else{
00087 puts(USAGE);
00088 exit(1);
00089 }
00090 }
00091
00092 else if(!strcmp(argv[i],"-r")){
00093 if(++i<argc){
00094 res = atof(argv[i]);
00095 }
00096 else{
00097 puts(USAGE);
00098 exit(1);
00099 }
00100 }
00101
00102 else if(!strcmp(argv[i],"-p")){
00103 if(++i<argc)
00104 base_port = atoi(argv[i]);
00105 else{
00106 puts(USAGE);
00107 exit(1);
00108 }
00109 }
00110 else{
00111 puts(USAGE);
00112 exit(1);
00113 }
00114 i++;
00115 }
00116 }
00117
00118
00119
00120 #define X_BASE_OFFSET 15.0
00121 #define Y_BASE_OFFSET 15.0
00122 #define POS_SCALER 3.0
00123 #define DEG_SCALER 3.0
00124
00125 pos_t *make_wave(void)
00126 {
00127 int i, j, sq_side;
00128 sq_side =(int)sqrt((double)num_nodes);
00129
00130 for(j = 0 ; j < sq_side; j++){
00131 for(i = 0 ; i < sq_side; i++){
00132 pos_list[j*sq_side+i].x = i*POS_SCALER + X_BASE_OFFSET;
00133 pos_list[j*sq_side+i].y = j*POS_SCALER + Y_BASE_OFFSET;
00134 pos_list[j*sq_side+i].th = (j*sq_side + i) * DEG_SCALER;
00135 }
00136 }
00137
00138 return NULL;
00139 }
00140
00141
00142
00143 pos_t *make_random(void)
00144 {
00145 int i, j, sq_side;
00146 sq_side =(int)sqrt((double)num_nodes);
00147
00148 srand(time(NULL));
00149
00150 for(j = 0 ; j < sq_side; j++){
00151 for(i = 0 ; i < sq_side; i++){
00152 pos_list[j*sq_side+i].x = i*POS_SCALER + X_BASE_OFFSET;
00153 pos_list[j*sq_side+i].y = j*POS_SCALER + Y_BASE_OFFSET;
00154 pos_list[j*sq_side+i].th = rand()%360;
00155 }
00156 }
00157
00158 return NULL;
00159 }
00160
00161
00162
00163 pos_t *make_grid(void)
00164 {
00165 int i, j, sq_side;
00166 sq_side =(int)sqrt((double)num_nodes);
00167
00168 for(j = 0 ; j < sq_side; j++){
00169 for(i = 0 ; i < sq_side; i++){
00170 pos_list[j*sq_side+i].x = i*POS_SCALER + X_BASE_OFFSET;
00171 pos_list[j*sq_side+i].y = j*POS_SCALER + Y_BASE_OFFSET;
00172 pos_list[j*sq_side+i].th = 15;
00173 }
00174 }
00175
00176 return NULL;
00177 }
00178
00179
00180
00181 pos_t *build_pos_list(void)
00182 {
00183 pos_list = (pos_t*)malloc(sizeof(pos_t) * num_nodes);
00184
00185 if(!strcmp(shape_name, "random")) return make_random();
00186 if(!strcmp(shape_name, "wave")) return make_wave();
00187 if(!strcmp(shape_name, "grid")) return make_grid();
00188 printf("Unknown shape: %s!\n", shape_name);
00189 exit(3);
00190 }
00191
00192
00193
00194 int main(int argc, char** argv)
00195 {
00196 int i;
00197
00198 parse_args(argc, argv);
00199
00200 if((world_file = fopen(world_filename, "w")) == NULL){
00201 perror("opening world file");
00202 exit(1);
00203 }
00204
00205 build_pos_list();
00206
00207 fprintf(world_file, "begin environment\n"
00208 " file %s\n"
00209 " resolution %.3f\n"
00210 " scale %.3f\n"
00211 "end\n\n",
00212 pnm_filename, res, scale);
00213
00214 for(i = 0 ; i < num_nodes; i++){
00215 fprintf(world_file, "begin position_device\n"
00216 " port %d\n"
00217 " pose (%.1f %.1f %.1f)\n"
00218 " begin sonar_device\n"
00219 " end\n"
00220 " begin mote_device\n"
00221 " index %d\n"
00222 " end\n"
00223 " begin player_device\n"
00224 " end\n"
00225 "end\n\n",
00226 i+base_port, pos_list[i].x, pos_list[i].y,
00227 pos_list[i].th, i+base_index);
00228 }
00229
00230 printf("wrote world file: %s\n"
00231 " nodes: %d\n"
00232 " shape: %s\n"
00233 " base port: %d\n"
00234 " base index: %d\n"
00235 " .pnm file: %s\n"
00236 " resolution: %.3f\n"
00237 " scale: %.3f\n",
00238 world_filename, num_nodes, shape_name,
00239 base_port, base_index, pnm_filename, res, scale);
00240 }