void writeLogs() { static const pm_char * error_displayed = NULL; if (isFunctionActive(FUNCTION_LOGS) && logDelay > 0) { tmr10ms_t tmr10ms = get_tmr10ms(); if (lastLogTime == 0 || (tmr10ms_t)(tmr10ms - lastLogTime) >= (tmr10ms_t)logDelay*10) { lastLogTime = tmr10ms; if (!g_oLogFile.fs) { const pm_char * result = openLogs(); if (result != NULL) { if (result != error_displayed) { error_displayed = result; POPUP_WARNING(result); } return; } } #if defined(RTCLOCK) { static struct gtm utm; static gtime_t lastRtcTime = 0; if ( g_rtcTime != lastRtcTime ) { lastRtcTime = g_rtcTime; gettime(&utm); } f_printf(&g_oLogFile, "%4d-%02d-%02d,%02d:%02d:%02d.%02d0,", utm.tm_year+1900, utm.tm_mon+1, utm.tm_mday, utm.tm_hour, utm.tm_min, utm.tm_sec, g_ms100); } #else f_printf(&g_oLogFile, "%d,", tmr10ms); #endif #if defined(FRSKY) #if !defined(CPUARM) f_printf(&g_oLogFile, "%d,%d,%d,", frskyStreaming, RAW_FRSKY_MINMAX(frskyData.rssi[0]), RAW_FRSKY_MINMAX(frskyData.rssi[1])); for (uint8_t i=0; i<MAX_FRSKY_A_CHANNELS; i++) { int16_t converted_value = applyChannelRatio(i, RAW_FRSKY_MINMAX(frskyData.analog[i])); f_printf(&g_oLogFile, "%d.%02d,", converted_value/100, converted_value%100); } #if defined(FRSKY_HUB) TELEMETRY_BARO_ALT_PREPARE(); if (IS_USR_PROTO_FRSKY_HUB()) { f_printf(&g_oLogFile, "%4d-%02d-%02d,%02d:%02d:%02d,%03d.%04d%c,%03d.%04d%c,%03d.%02d," TELEMETRY_GPS_SPEED_FORMAT TELEMETRY_GPS_ALT_FORMAT TELEMETRY_BARO_ALT_FORMAT TELEMETRY_VSPEED_FORMAT TELEMETRY_ASPEED_FORMAT "%d,%d,%d,%d," TELEMETRY_CELLS_FORMAT TELEMETRY_CURRENT_FORMAT "%d," TELEMETRY_VFAS_FORMAT "%d,%d,%d,", frskyData.hub.year+2000, frskyData.hub.month, frskyData.hub.day, frskyData.hub.hour, frskyData.hub.min, frskyData.hub.sec, frskyData.hub.gpsLongitude_bp, frskyData.hub.gpsLongitude_ap, frskyData.hub.gpsLongitudeEW ? frskyData.hub.gpsLongitudeEW : '-', frskyData.hub.gpsLatitude_bp, frskyData.hub.gpsLatitude_ap, frskyData.hub.gpsLatitudeNS ? frskyData.hub.gpsLatitudeNS : '-', frskyData.hub.gpsCourse_bp, frskyData.hub.gpsCourse_ap, TELEMETRY_GPS_SPEED_ARGS TELEMETRY_GPS_ALT_ARGS TELEMETRY_BARO_ALT_ARGS TELEMETRY_VSPEED_ARGS TELEMETRY_ASPEED_ARGS frskyData.hub.temperature1, frskyData.hub.temperature2, frskyData.hub.rpm, frskyData.hub.fuelLevel, TELEMETRY_CELLS_ARGS TELEMETRY_CURRENT_ARGS frskyData.hub.currentConsumption, TELEMETRY_VFAS_ARGS frskyData.hub.accelX, frskyData.hub.accelY, frskyData.hub.accelZ); } #endif #if defined(WS_HOW_HIGH) if (IS_USR_PROTO_WS_HOW_HIGH()) { f_printf(&g_oLogFile, "%d,", TELEMETRY_RELATIVE_BARO_ALT_BP); } #endif #endif #if defined(CPUARM) for (int i=0; i<MAX_SENSORS; i++) { TelemetrySensor & sensor = g_model.telemetrySensors[i]; TelemetryItem & telemetryItem = telemetryItems[i]; if (sensor.logs) { if (sensor.unit == UNIT_GPS) { if (telemetryItem.gps.longitudeEW && telemetryItem.gps.latitudeNS) f_printf(&g_oLogFile, "%03d.%04d%c %03d.%04d%c,", telemetryItem.gps.longitude_bp, telemetryItem.gps.longitude_ap, telemetryItem.gps.longitudeEW, telemetryItem.gps.latitude_bp, telemetryItem.gps.latitude_ap, telemetryItem.gps.latitudeNS); else f_printf(&g_oLogFile, ","); } else if (sensor.unit == UNIT_DATETIME) { if (telemetryItem.datetime.datestate) f_printf(&g_oLogFile, "%4d-%02d-%02d %02d:%02d:%02d,", telemetryItem.datetime.year, telemetryItem.datetime.month, telemetryItem.datetime.day, telemetryItem.datetime.hour, telemetryItem.datetime.min, telemetryItem.datetime.sec); else f_printf(&g_oLogFile, ","); } else if (sensor.prec == 2) { div_t qr = div(telemetryItem.value, 100); if (telemetryItem.value < 0) f_printf(&g_oLogFile, "-"); f_printf(&g_oLogFile, "%d.%02d,", abs(qr.quot), abs(qr.rem)); } else if (sensor.prec == 1) { div_t qr = div(telemetryItem.value, 10); if (telemetryItem.value < 0) f_printf(&g_oLogFile, "-"); f_printf(&g_oLogFile, "%d.%d,", abs(qr.quot), abs(qr.rem)); } else { f_printf(&g_oLogFile, "%d,", telemetryItem.value); } } } #endif #endif for (uint8_t i=0; i<NUM_STICKS+NUM_POTS; i++) { f_printf(&g_oLogFile, "%d,", calibratedStick[i]); } #if defined(PCBTARANIS) int result = f_printf(&g_oLogFile, "%d,%d,%d,%d,%d,%d,%d,%d\n", get3PosState(SA), get3PosState(SB), get3PosState(SC), get3PosState(SD), get3PosState(SE), get2PosState(SF), get3PosState(SG), get2PosState(SH)); #endif if (result<0 && !error_displayed) { error_displayed = STR_SDCARD_ERROR; POPUP_WARNING(STR_SDCARD_ERROR); closeLogs(); } } } else { error_displayed = NULL; if (g_oLogFile.fs) { closeLogs(); } } }
// TODO test when disk full void writeLogs() { static const pm_char * error_displayed = NULL; if (isFunctionActive(FUNCTION_LOGS) && logDelay > 0) { tmr10ms_t tmr10ms = get_tmr10ms(); if (lastLogTime == 0 || (tmr10ms_t)(tmr10ms - lastLogTime) >= (tmr10ms_t)logDelay*10) { lastLogTime = tmr10ms; if (!g_oLogFile.fs) { const pm_char * result = openLogs(); if (result != NULL) { if (result != error_displayed) { error_displayed = result; POPUP_WARNING(result); } return; } } #if defined(RTCLOCK) struct gtm utm; gettime(&utm); f_printf(&g_oLogFile, "%4d-%02d-%02d,%02d:%02d:%02d.%02d0,", utm.tm_year+1900, utm.tm_mon+1, utm.tm_mday, utm.tm_hour, utm.tm_min, utm.tm_sec, g_ms100); #else f_printf(&g_oLogFile, "%d,", tmr10ms); #endif #if defined(FRSKY) #if defined(PCBTARANIS) && defined(REVPLUS) f_printf(&g_oLogFile, "%d,", RAW_FRSKY_MINMAX(frskyData.rssi[0])); #elif defined(CPUARM) f_printf(&g_oLogFile, "%d,%d,", RAW_FRSKY_MINMAX(frskyData.swr), RAW_FRSKY_MINMAX(frskyData.rssi[0])); #else f_printf(&g_oLogFile, "%d,%d,%d,", frskyStreaming, RAW_FRSKY_MINMAX(frskyData.rssi[0]), RAW_FRSKY_MINMAX(frskyData.rssi[1])); #endif for (uint8_t i=0; i<MAX_FRSKY_A_CHANNELS; i++) { int16_t converted_value = applyChannelRatio(i, RAW_FRSKY_MINMAX(frskyData.analog[i])); f_printf(&g_oLogFile, "%d.%02d,", converted_value/100, converted_value%100); } #endif #if defined(FRSKY_HUB) TELEMETRY_BARO_ALT_PREPARE(); if (IS_USR_PROTO_FRSKY_HUB()) { f_printf(&g_oLogFile, "%4d-%02d-%02d,%02d:%02d:%02d,%03d.%04d%c,%03d.%04d%c,%03d.%02d," TELEMETRY_GPS_SPEED_FORMAT TELEMETRY_GPS_ALT_FORMAT TELEMETRY_BARO_ALT_FORMAT TELEMETRY_VSPEED_FORMAT TELEMETRY_ASPEED_FORMAT "%d,%d,%d,%d," TELEMETRY_CELLS_FORMAT TELEMETRY_CURRENT_FORMAT "%d," TELEMETRY_VFAS_FORMAT "%d,%d,%d,", frskyData.hub.year+2000, frskyData.hub.month, frskyData.hub.day, frskyData.hub.hour, frskyData.hub.min, frskyData.hub.sec, frskyData.hub.gpsLongitude_bp, frskyData.hub.gpsLongitude_ap, frskyData.hub.gpsLongitudeEW ? frskyData.hub.gpsLongitudeEW : '-', frskyData.hub.gpsLatitude_bp, frskyData.hub.gpsLatitude_ap, frskyData.hub.gpsLatitudeNS ? frskyData.hub.gpsLatitudeNS : '-', frskyData.hub.gpsCourse_bp, frskyData.hub.gpsCourse_ap, TELEMETRY_GPS_SPEED_ARGS TELEMETRY_GPS_ALT_ARGS TELEMETRY_BARO_ALT_ARGS TELEMETRY_VSPEED_ARGS TELEMETRY_ASPEED_ARGS frskyData.hub.temperature1, frskyData.hub.temperature2, frskyData.hub.rpm, frskyData.hub.fuelLevel, TELEMETRY_CELLS_ARGS TELEMETRY_CURRENT_ARGS frskyData.hub.currentConsumption, TELEMETRY_VFAS_ARGS frskyData.hub.accelX, frskyData.hub.accelY, frskyData.hub.accelZ); } #endif #if defined(WS_HOW_HIGH) if (IS_USR_PROTO_WS_HOW_HIGH()) { f_printf(&g_oLogFile, "%d,", TELEMETRY_RELATIVE_BARO_ALT_BP); } #endif for (uint8_t i=0; i<NUM_STICKS+NUM_POTS; i++) { f_printf(&g_oLogFile, "%d,", calibratedStick[i]); } #if defined(PCBTARANIS) int result = f_printf(&g_oLogFile, "%d,%d,%d,%d,%d,%d,%d,%d\n", get3PosState(SA), get3PosState(SB), get3PosState(SC), get3PosState(SD), get3PosState(SE), get2PosState(SF), get3PosState(SG), get2PosState(SH)); #else int result = f_printf(&g_oLogFile, "%d,%d,%d,%d,%d,%d,%d\n", get2PosState(THR), get2PosState(RUD), get2PosState(ELE), get3PosState(ID), get2PosState(AIL), get2PosState(GEA), get2PosState(TRN)); #endif if (result<0 && !error_displayed) { error_displayed = STR_SDCARD_ERROR; POPUP_WARNING(STR_SDCARD_ERROR); closeLogs(); } } } else { error_displayed = NULL; if (g_oLogFile.fs) { closeLogs(); } } }