static uint8_t model_save_xml (char *name, float x, float y, int8_t button, float data, uint8_t action) { reset_buttons(); FILE *fr; char tmp_str[128]; sprintf(tmp_str, "mkdir -p %s/models", get_datadirectory()); system(tmp_str); sprintf(tmp_str, "%s/models/%s", get_datadirectory(), name); fr = fopen(tmp_str, "wb"); if (fr != 0) { fprintf(fr, "<rcflow>\n"); fprintf(fr, " <name>%s</name>\n", ModelData[ModelActive].name); fprintf(fr, " <image>%s</image>\n", ModelData[ModelActive].image); fprintf(fr, " <type>%s</type>\n", dronetypes[ModelData[ModelActive].dronetype]); fprintf(fr, " <telemetry>\n"); fprintf(fr, " <type>%s</type>\n", teletypes[ModelData[ModelActive].teletype]); fprintf(fr, " <device>%s</device>\n", ModelData[ModelActive].telemetry_port); fprintf(fr, " <baud>%i</baud>\n", ModelData[ModelActive].telemetry_baud); if (strstr(ModelData[ModelActive].telemetry_port, "rfcomm") > 0) { fprintf(fr, " <bluetooth_addr>%s</bluetooth_addr>\n", ModelData[ModelActive].telebtaddr); fprintf(fr, " <bluetooth_pin>%s</bluetooth_pin>\n", ModelData[ModelActive].telebtpin); } fprintf(fr, " </telemetry>\n"); mavlink_xml_save(ModelActive, fr); mwi21_xml_save(ModelActive, fr); openpilot_xml_save(fr); fprintf(fr, "</rcflow>\n"); fclose(fr); } return 0; }
static uint8_t model_load (char *name, float x, float y, int8_t button, float data, uint8_t action) { reset_buttons(); char tmp_str[128]; sprintf(tmp_str, "%s/models", get_datadirectory()); filesystem_set_dir(tmp_str); filesystem_set_callback(model_load_xml); filesystem_reset_filter(); filesystem_add_filter(".xml\0"); filesystem_set_mode(setup.view_mode); return 0; }
void mavlink_param_xml_meta_load (void) { char filename[1024]; sprintf(filename, "%s/mavlink/ParameterMetaData-%s.xml", get_datadirectory(), teletypes[ModelData.teletype]); if (file_exists(filename) != 0) { mavlink_parseDoc(filename); return; } sprintf(filename, "%s/mavlink/ParameterMetaData-%s.xml", BASE_DIR, teletypes[ModelData.teletype]); if (file_exists(filename) != 0) { mavlink_parseDoc(filename); return; } }
int16_t get_altitude (float lat, float lon) { char file[100]; int8_t n = 0; int8_t alt_num = -1; int8_t old_num = -1; uint32_t atime_min = time(0); int16_t px = 0; int16_t py = 0; int16_t lat_m = (int)lat; int16_t lon_m = (int)lon; int8_t flag = 0; char LON[128]; char LAT[128]; if (lat_m < 0) { sprintf(LAT, "S%02i", lat_m * -1 + 1); } else { sprintf(LAT, "N%02i", lat_m); } if (lon_m < 0) { sprintf(LON, "W%03i", lon_m * -1 + 1); } else { sprintf(LON, "E%03i", lon_m); } sprintf(file, "%s/MAPS/%s%s.hgt", get_datadirectory(), LAT, LON); for (n = 0; n < 8; n++) { if (strcmp(AltCache[n].name, file) == 0) { alt_num = n; } else if (AltCache[n].atime < atime_min) { old_num = n; atime_min = AltCache[n].atime; } } if (alt_num == -1) { for (n = 0; n < MAX_ALTCACHE; n++) { if (AltCache[n].name[0] == 0) { alt_num = n; break; } } if (old_num == -1) { old_num = 0; } if (alt_num == -1) { alt_num = old_num; SDL_Log("remove srtm %s from cache %i (%i)\n", AltCache[alt_num].name, old_num, AltCache[alt_num].atime); // Delete; AltCache[alt_num].name[0] = 0; } if (alt_num != -1) { // SDL_Log("loading srtm %s in to alt-cache %i %i\n", file, alt_num, AltCache[alt_num].atime); FILE *fr; fr = fopen(file, "rb"); if (fr != 0) { strncpy(AltCache[alt_num].name, file, 1023); AltCache[alt_num].atime = time(0); for (py = 0; py < 1201; py++) { for (px = 0; px < 1201; px++) { uint8_t val1 = 0; uint8_t val2 = 0; int16_t val = 0; fread(&val1, 1, 1, fr); fread(&val2, 1, 1, fr); val = (val1<<8) + val2; if (lat_m < 0) { if (lon_m < 0) { AltCache[alt_num].data[py][1200 - px] = val; } else { AltCache[alt_num].data[py][px] = val; } } else { if (lon_m < 0) { AltCache[alt_num].data[1200 - py][1200 - px] = val; } else { AltCache[alt_num].data[1200 - py][px] = val; } } } } fclose(fr); } else { flag = 1; } } } if (flag == 0) { AltCache[alt_num].atime = time(0); // SDL_Log("# using Alt-Cache: %s\n", AltCache[alt_num].name); // geting all field-points float fy = 0.0; float fx = 0.0; int16_t y1 = 0; int16_t x1 = 0; int16_t y2 = 0; int16_t x2 = 0; if (lat_m < 0) { lat_m *= -1; lat *= -1.0; } if (lon_m < 0) { lon_m *= -1; lon *= -1.0; } y1 = (int)((lat - (float)lat_m) * 1201.0); y2 = y1 + 1; fy = ((lat - (float)lat_m) * 1201.0); x1 = (int)((lon - (float)lon_m) * 1201.0); x2 = x1 + 1; fx = ((lon - (float)lon_m) * 1201.0); #ifndef SDLGL return AltCache[alt_num].data[y1][x1]; #else // geting alt-values of field-points int16_t vx1a = AltCache[alt_num].data[y1][x1]; int16_t vx2a = AltCache[alt_num].data[y1][x2]; int16_t vx1b = AltCache[alt_num].data[y2][x1]; int16_t vx2b = AltCache[alt_num].data[y2][x2]; if (vx1a == -32768) { uint16_t tn = 0; for (tn = 0; tn < 10; tn++) { vx1a = AltCache[alt_num].data[y1 + tn][x1 + tn]; if (vx1a != -32768) { break; } vx1a = AltCache[alt_num].data[y1 - tn][x1 - tn]; if (vx1a != -32768) { break; } } } if (vx2a == -32768) { uint16_t tn = 0; for (tn = 0; tn < 10; tn++) { vx2a = AltCache[alt_num].data[y1 + tn][x2 + tn]; if (vx2a != -32768) { break; } vx2a = AltCache[alt_num].data[y1 - tn][x2 - tn]; if (vx2a != -32768) { break; } } } if (vx1b == -32768) { uint16_t tn = 0; for (tn = 0; tn < 10; tn++) { vx1b = AltCache[alt_num].data[y2 + tn][x1 + tn]; if (vx1b != -32768) { break; } vx1b = AltCache[alt_num].data[y2 - tn][x1 - tn]; if (vx1b != -32768) { break; } } } if (vx2b == -32768) { uint16_t tn = 0; for (tn = 0; tn < 10; tn++) { vx2b = AltCache[alt_num].data[y2 + tn][x2 + tn]; if (vx2b != -32768) { break; } vx2b = AltCache[alt_num].data[y2 - tn][x2 - tn]; if (vx2b != -32768) { break; } } } // geting alt-values of avarages (x1,y1->x2,y1 and x1,y2->x2,y2) int16_t vxa = (float)(vx2a - vx1a) * (fx - (float)x1) + (float)vx1a; int16_t vxb = (float)(vx2b - vx1b) * (fx - (float)x1) + (float)vx1b; // geting alt-values avarages (xy1->xy2) int16_t alt = (vxb - vxa) * (fy - (float)y1) + vxa; return alt; #endif } return 0; }