int doTestAndDie() { long x,y; float lat, lon,lat2,lon2; int lat_sign, lat_deg, lat_min; int lon_sign, lon_deg, lon_min; lat = 42.22; lon = -8.65; y = lat2y(lat); x = lon2x(lon); lat_sign=lat<0?1:0; lat_deg = lat_sign?-lat:lat; lat_min = GPS_ENCODE_LOCMIN(lat); lon_sign=lon<0?1:0; lon_deg = lon_sign?-lon:-lon; lon_min = GPS_ENCODE_LOCMIN(lon); lat2 = GPS_DECODE_LOC(lat_sign, lat_deg, lat_min); lon2 = GPS_DECODE_LOC(lon_sign, lon_deg, lon_min); printf("Test:\n\t Lat: %f\tLon:%f\n" "\t Lat: %d %d %d \n" "\t Lon: %d \%d \%d \n" "\t Lat2: %f\tLon2: %f\n", lat,lon,lat_sign,lat_deg,lat_min, lon_sign, lon_deg, lon_min,lat2,lon2); exit(0); }
static VALUE tile_for_point(VALUE self, VALUE lat, VALUE lon) { unsigned int x = lon2x(NUM2DBL(lon)); unsigned int y = lat2y(NUM2DBL(lat)); return UINT2NUM(xy2tile(x, y)); }
Datum tile_for_point(PG_FUNCTION_ARGS) { double lat = PG_GETARG_INT32(0) / 10000000.0; double lon = PG_GETARG_INT32(1) / 10000000.0; PG_RETURN_INT64(xy2tile(lon2x(lon), lat2y(lat))); }
static VALUE iterate_tiles_for_area(VALUE self, VALUE bbox) { unsigned int minx = lon2x(NUM2DBL(rb_iv_get(bbox, "@min_lon"))); unsigned int maxx = lon2x(NUM2DBL(rb_iv_get(bbox, "@max_lon"))); unsigned int miny = lat2y(NUM2DBL(rb_iv_get(bbox, "@min_lat"))); unsigned int maxy = lat2y(NUM2DBL(rb_iv_get(bbox, "@max_lat"))); tilelist_t tl = tilelist_for_area(minx, miny, maxx, maxy); if (tl.tilec > 0) { unsigned int first; unsigned int last; unsigned int t; VALUE a = rb_ary_new(); qsort(tl.tilev, tl.tilec, sizeof(unsigned int), tile_compare); first = last = tl.tilev[0]; for (t = 1; t < tl.tilec; t++) { unsigned int tile = tl.tilev[t]; if (tile == last + 1) { last = tile; } else { rb_ary_store(a, 0, UINT2NUM(first)); rb_ary_store(a, 1, UINT2NUM(last)); rb_yield(a); first = last = tile; } } rb_ary_store(a, 0, UINT2NUM(first)); rb_ary_store(a, 1, UINT2NUM(last)); rb_yield(a); } free(tl.tilev); return Qnil; }
static VALUE tiles_for_area(VALUE self, VALUE bbox) { unsigned int minx = lon2x(NUM2DBL(rb_iv_get(bbox, "@min_lon"))); unsigned int maxx = lon2x(NUM2DBL(rb_iv_get(bbox, "@max_lon"))); unsigned int miny = lat2y(NUM2DBL(rb_iv_get(bbox, "@min_lat"))); unsigned int maxy = lat2y(NUM2DBL(rb_iv_get(bbox, "@max_lat"))); tilelist_t tl = tilelist_for_area(minx, miny, maxx, maxy); VALUE tiles = rb_ary_new(); unsigned int t; for (t = 0; t < tl.tilec; t++) { rb_ary_push(tiles, UINT2NUM(tl.tilev[tl.tilec])); } free(tl.tilev); return tiles; }
int runSimulator(char *ip, int port) { int bear; int knots; int mps=0; int myTime =0; int lapse=defaultLapse; long x, y, d; float lat, lon; frm_cmd_gps_t gps; char buff[TRANS_MAX_BUFF_SIZE]; size_t transLen; int seq =0; int sckt; struct sockaddr_in server; // INIT SOCKET printf("Incializando...\n"); memset(&server,0,sizeof(server)); sckt= socket(AF_INET,SOCK_DGRAM,0); if (sckt<0) { die("Error en la creacion del socket"); } server.sin_family = AF_INET; server.sin_addr.s_addr = inet_addr(ip); server.sin_port = htons(port); y = lat2y(42.22); x = lon2x(-8.65); printf("Empezando simulacion...(lapso=%ds)\n\n",lapse); while (true) { if (myTime<=0) { myTime = rnd1(30); bear = rnd0(359); mps = rnd1(MAX_MPS); } d = mps * lapse; // Ojo origen de rumbo PI y += round( d * cos(bear * DEG_RAD)); x += round( d * sin(bear * DEG_RAD)); lat = y2lat(y); lon = x2lon(x); knots = mps * MPS_TO_KNOTS; // gps.cmd = 0x11; // gps.len =0; // gps.seq_l= seq++; // gps.seq_s=0; // gps.bearing = GPS_ENCODE_BEARING(bear); // gps.knots = knots; // gps.lat_sign = lat<0?1:0; // gps.lat_deg = gps.lat_sign?-lat:lat; // gps.lat_min =htons(GPS_ENCODE_LOCMIN(lat)); // gps.lon_sign = lon<0?1:0; // gps.lon_deg = gps.lon_sign?-lon:lon; // gps.lon_min = htons(GPS_ENCODE_LOCMIN(lon)); // // gps.fix = 1; // gps.hdop = rnd1(20); // gps.time.epoch = htonl(time(NULL)); int offset=0; transLen = sizeof(buff); frame_encode_gps(seq++,bear,knots,lat,lon,1,rnd1(20),0,buff,&transLen); offset +=transLen; if (addCnxFrame) { transLen = sizeof(buff) - offset; frame_encode_cnx("1234567890",0,1,0,buff+offset,&transLen); offset +=transLen; } transLen = sizeof(buff); if ( frame_encode_transport(1,NULL,offset,buff,&transLen) ) { // if (frame_test_transport(buff,transLen)) { // printf("Trama de transporte verificada\n"); // } printf("Enviando: %d lat=%f lon=%f bear=%d knots=%d time=%d\n",seq, lat,lon,bear,knots,ntohl(gps.time.epoch)); sendto(sckt,buff,transLen,0,(struct sockaddr *)&server,sizeof(server)); } myTime -=lapse; sleep(lapse); } close(sckt); return 0; }