From 49e70dbf1299f6ebe91f693eb2454ed09fe05c86 Mon Sep 17 00:00:00 2001 From: Damjan Adamic Date: Sun, 20 Mar 2016 08:10:54 +0100 Subject: [PATCH 1/7] simulator fixes --- radio/src/dmafifo.h | 3 +++ radio/src/sbus.cpp | 2 ++ radio/src/sbus.h | 1 - 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/radio/src/dmafifo.h b/radio/src/dmafifo.h index f74aada04..d4aaef4d3 100644 --- a/radio/src/dmafifo.h +++ b/radio/src/dmafifo.h @@ -45,6 +45,9 @@ class DMAFifo bool isEmpty() { +#if defined(SIMU) + return true; +#endif return (ridx == N - stream->NDTR); } diff --git a/radio/src/sbus.cpp b/radio/src/sbus.cpp index ace6d7060..f2cddc188 100644 --- a/radio/src/sbus.cpp +++ b/radio/src/sbus.cpp @@ -73,6 +73,7 @@ void processSbusFrame(uint8_t * sbus, int16_t * pulses, uint32_t size) void processSbusInput() { +#if !defined(SIMU) uint8_t rxchar; uint32_t active = 0; while (sbusGetByte(&rxchar)) { @@ -94,4 +95,5 @@ void processSbusInput() } } } +#endif } diff --git a/radio/src/sbus.h b/radio/src/sbus.h index 4ab46a084..5ef7359a5 100644 --- a/radio/src/sbus.h +++ b/radio/src/sbus.h @@ -26,6 +26,5 @@ #define SBUS_MAX_FRAME_SIZE 28 void processSbusInput(); -void processSbusFrame(uint8_t * sbus, int16_t * pulses, uint32_t size); #endif // _SBUS_H_ From a3af63edad5f1a1fdb402f396889ce83f137a003 Mon Sep 17 00:00:00 2001 From: Damjan Adamic Date: Sun, 20 Mar 2016 16:05:17 +0100 Subject: [PATCH 2/7] Re #3371: tx battery measuring code moved to board_xxx.cpp, battery check code rewritten for ARM platforms, Horus battery calibrated. --- .../src/gui/taranis/menu_general_diaganas.cpp | 8 +-- radio/src/main_arm.cpp | 67 ++++++++++++++++++- radio/src/opentx.cpp | 3 + radio/src/simu.cpp | 10 ++- radio/src/targets/horus/board_horus.cpp | 6 ++ radio/src/targets/horus/board_horus.h | 7 +- radio/src/targets/taranis/board_taranis.cpp | 8 +++ radio/src/targets/taranis/board_taranis.h | 1 + 8 files changed, 95 insertions(+), 15 deletions(-) diff --git a/radio/src/gui/taranis/menu_general_diaganas.cpp b/radio/src/gui/taranis/menu_general_diaganas.cpp index 19f453a0c..99bc08cf3 100644 --- a/radio/src/gui/taranis/menu_general_diaganas.cpp +++ b/radio/src/gui/taranis/menu_general_diaganas.cpp @@ -42,11 +42,7 @@ void menuGeneralDiagAna(uint8_t event) } lcd_putsLeft(MENU_HEADER_HEIGHT+1+6*FH, STR_BATT_CALIB); - static int32_t adcBatt; - adcBatt = ((adcBatt * 7) + anaIn(TX_VOLTAGE)) / 8; - uint32_t batCalV = (adcBatt + (adcBatt*g_eeGeneral.txVoltageCalibration)/128) * BATT_SCALE; - batCalV >>= 11; - batCalV += 2; // because of the diode - putsVolts(LEN_CALIB_FIELDS*FW+4*FW, MENU_HEADER_HEIGHT+1+6*FH, batCalV, s_editMode > 0 ? BLINK|INVERS : INVERS); + uint32_t batCalV = getBatteryVoltage(); + putsVolts(LEN_CALIB_FIELDS*FW+4*FW, MENU_HEADER_HEIGHT+1+6*FH, getBatteryVoltage(), (s_editMode > 0 ? BLINK : 0) | INVERS | PREC2); if (s_editMode > 0) CHECK_INCDEC_GENVAR(event, g_eeGeneral.txVoltageCalibration, -127, 127); } diff --git a/radio/src/main_arm.cpp b/radio/src/main_arm.cpp index 9b64283a4..6b5103aee 100644 --- a/radio/src/main_arm.cpp +++ b/radio/src/main_arm.cpp @@ -98,6 +98,71 @@ void checkEeprom() } #endif +#define BAT_AVG_SAMPLES 8 + +void checkBatteryAlarms() +{ + // TRACE("checkBatteryAlarms()"); + if (IS_TXBATT_WARNING() && g_vbat100mV>50) { + AUDIO_TX_BATTERY_LOW(); + // TRACE("checkBatteryAlarms(): battery low"); + } +#if defined(PCBSKY9X) + else if (g_eeGeneral.temperatureWarn && getTemperature() >= g_eeGeneral.temperatureWarn) { + AUDIO_TX_TEMP_HIGH(); + } + else if (g_eeGeneral.mAhWarn && (g_eeGeneral.mAhUsed + Current_used * (488 + g_eeGeneral.txCurrentCalibration)/8192/36) / 500 >= g_eeGeneral.mAhWarn) { // TODO move calculation into board file + AUDIO_TX_MAH_HIGH(); + } +#endif +} + +void checkBattery() +{ + static uint32_t batSum; + static uint8_t sampleCount; + // filter battery voltage by averaging it + if (g_vbat100mV == 0) { + g_vbat100mV = (getBatteryVoltage() + 5) / 10; + batSum = 0; + sampleCount = 0; + } + else { + batSum += getBatteryVoltage(); + // TRACE("checkBattery(): sampled = %d", getBatteryVoltage()); + if (++sampleCount >= BAT_AVG_SAMPLES) { + g_vbat100mV = (batSum + BAT_AVG_SAMPLES * 5 ) / (BAT_AVG_SAMPLES * 10); + batSum = 0; + sampleCount = 0; + // TRACE("checkBattery(): g_vbat100mV = %d", g_vbat100mV); + } + } +} + +void periodicTick_1s() +{ + checkBattery(); +} + +void periodicTick_10s() +{ + checkBatteryAlarms(); +} + +void periodicTick() +{ + static uint8_t count10s; + static uint32_t lastTime; + if ( (get_tmr10ms() - lastTime) >= 100 ) { + lastTime += 100; + periodicTick_1s(); + if (++count10s >= 10) { + count10s = 0; + periodicTick_10s(); + } + } +} + #if defined(GUI) && defined(COLORLCD) void guiMain(evt_t evt) { @@ -328,7 +393,7 @@ void perMain() writeLogs(); handleUsbConnection(); checkTrainerSettings(); - checkBattery(); + periodicTick(); evt_t evt = getEvent(false); if (evt && (g_eeGeneral.backlightMode & e_backlight_mode_keys)) backlightOn(); // on keypress turn the light on diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 83cdc4cff..f7336b4a6 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -2153,6 +2153,7 @@ uint8_t getSticksNavigationEvent() } #endif +#if !defined(CPUARM) void checkBattery() { static uint8_t counter = 0; @@ -2222,6 +2223,8 @@ void checkBattery() } } } +#endif // #if !defined(CPUARM) + #if !defined(SIMU) && !defined(CPUARM) diff --git a/radio/src/simu.cpp b/radio/src/simu.cpp index 911eb7f52..57f7c4201 100644 --- a/radio/src/simu.cpp +++ b/radio/src/simu.cpp @@ -544,9 +544,15 @@ uint16_t anaIn(uint8_t chan) return th9xSim->sliders[chan]->getValue(); else if (chanknobs[chan-NUM_STICKS]->getValue(); -#if defined(PCBTARANIS) || defined(PCBFLAMENCO) || defined(PCBHORUS) +#if defined(PCBHORUS) else if (chan == TX_VOLTAGE) - return 1000; + return 1737; //~10.6V +#elif (defined(PCBTARANIS) && defined(REV9E)) + else if (chan == TX_VOLTAGE) + return 1420; //~10.6V +#elif defined(PCBTARANIS) || defined(PCBFLAMENCO) + else if (chan == TX_VOLTAGE) + return 1000; //~7.4V #elif defined(PCBSKY9X) else if (chan == TX_VOLTAGE) return 5.1*1500/11.3; diff --git a/radio/src/targets/horus/board_horus.cpp b/radio/src/targets/horus/board_horus.cpp index 9898f2a47..f930c45bf 100644 --- a/radio/src/targets/horus/board_horus.cpp +++ b/radio/src/targets/horus/board_horus.cpp @@ -266,3 +266,9 @@ void checkTrainerSettings() } } } + +uint16_t getBatteryVoltage() +{ + int32_t instant_vbat = anaIn(TX_VOLTAGE); // using filtered ADC value on purpose + return (uint16_t)((instant_vbat * (1000 + g_eeGeneral.txVoltageCalibration) ) / 1637); +} diff --git a/radio/src/targets/horus/board_horus.h b/radio/src/targets/horus/board_horus.h index 031e272b0..7ee5498cb 100644 --- a/radio/src/targets/horus/board_horus.h +++ b/radio/src/targets/horus/board_horus.h @@ -242,12 +242,7 @@ extern uint16_t adcValues[NUMBER_ANALOG]; void adcInit(void); void adcRead(void); uint16_t getAnalogValue(uint8_t index); - -#if defined(REV3) - #define BATT_SCALE 120 -#else - #define BATT_SCALE 150 -#endif +uint16_t getBatteryVoltage(); // returns current battery voltage in 10mV steps #if defined(__cplusplus) && !defined(SIMU) extern "C" { diff --git a/radio/src/targets/taranis/board_taranis.cpp b/radio/src/targets/taranis/board_taranis.cpp index 09344fb8c..9894d1379 100644 --- a/radio/src/targets/taranis/board_taranis.cpp +++ b/radio/src/targets/taranis/board_taranis.cpp @@ -316,3 +316,11 @@ void checkTrainerSettings() } } } + +uint16_t getBatteryVoltage() +{ + int32_t instant_vbat = anaIn(TX_VOLTAGE); // using filtered ADC value on purpose + instant_vbat = (instant_vbat * BATT_SCALE * (128 + g_eeGeneral.txVoltageCalibration) ) / 26214; + instant_vbat += 20; // add 0.2V because of the diode TODO check if this is needed, but removal will beak existing calibrations!!! + return (uint16_t)instant_vbat; +} diff --git a/radio/src/targets/taranis/board_taranis.h b/radio/src/targets/taranis/board_taranis.h index 8f7adf706..00b28505f 100644 --- a/radio/src/targets/taranis/board_taranis.h +++ b/radio/src/targets/taranis/board_taranis.h @@ -268,6 +268,7 @@ void adcInit(void); void adcRead(void); extern uint16_t adcValues[NUMBER_ANALOG]; uint16_t getAnalogValue(uint8_t index); +uint16_t getBatteryVoltage(); // returns current battery voltage in 10mV steps #define BATT_SCALE 150 From e31768797322e4df1ae7bb03b361981639ca5f16 Mon Sep 17 00:00:00 2001 From: Damjan Adamic Date: Sun, 20 Mar 2016 16:02:23 +0100 Subject: [PATCH 3/7] Fixes #3371: Battery calibration menu item added for Horus --- radio/src/gui/horus/menu_general_hardware.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/radio/src/gui/horus/menu_general_hardware.cpp b/radio/src/gui/horus/menu_general_hardware.cpp index e9775468f..291da19f1 100644 --- a/radio/src/gui/horus/menu_general_hardware.cpp +++ b/radio/src/gui/horus/menu_general_hardware.cpp @@ -46,6 +46,7 @@ enum menuGeneralHwItems { ITEM_SETUP_HW_SH, ITEM_SETUP_HW_BLUETOOTH, // ITEM_SETUP_HW_UART3_MODE, + ITEM_SETUP_HW_BAT_CAL, ITEM_SETUP_HW_MAX }; @@ -175,6 +176,12 @@ bool menuGeneralHardware(evt_t event) } break; #endif + + case ITEM_SETUP_HW_BAT_CAL: + lcdDrawText(MENUS_MARGIN_LEFT, y, "Battery cal."); + lcdDrawNumber(HW_SETTINGS_COLUMN, y, getBatteryVoltage(), attr|LEFT|PREC2, 0, NULL, "V"); + if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.txVoltageCalibration, -127, 127); + break; } } From 43e7680c9b00a0b6b55ff1f427ce560d2b3bd22f Mon Sep 17 00:00:00 2001 From: Damjan Adamic Date: Sun, 20 Mar 2016 17:00:58 +0100 Subject: [PATCH 4/7] Re #3371: ARM stuff removed from AVR version of checkBattery() --- radio/src/opentx.cpp | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index f7336b4a6..90aed8420 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -2167,14 +2167,7 @@ void checkBattery() if (counter-- == 0) { counter = 10; int32_t instant_vbat = anaIn(TX_VOLTAGE); -#if defined(PCBTARANIS) || defined(PCBFLAMENCO) || defined(PCBHORUS) - instant_vbat = (instant_vbat + instant_vbat*(g_eeGeneral.txVoltageCalibration)/128) * BATT_SCALE; - instant_vbat >>= 11; - instant_vbat += 2; // because of the diode -#elif defined(PCBSKY9X) - instant_vbat = (instant_vbat + instant_vbat*(g_eeGeneral.txVoltageCalibration)/128) * 4191; - instant_vbat /= 55296; -#elif defined(CPUM2560) +#if defined(CPUM2560) instant_vbat = (instant_vbat*1112 + instant_vbat*g_eeGeneral.txVoltageCalibration + (BandGap<<2)) / (BandGap<<3); #else instant_vbat = (instant_vbat*16 + instant_vbat*g_eeGeneral.txVoltageCalibration/8) / BandGap; @@ -2212,14 +2205,6 @@ void checkBattery() if (IS_TXBATT_WARNING() && g_vbat100mV>50) { AUDIO_TX_BATTERY_LOW(); } -#if defined(PCBSKY9X) - else if (g_eeGeneral.temperatureWarn && getTemperature() >= g_eeGeneral.temperatureWarn) { - AUDIO_TX_TEMP_HIGH(); - } - else if (g_eeGeneral.mAhWarn && (g_eeGeneral.mAhUsed + Current_used * (488 + g_eeGeneral.txCurrentCalibration)/8192/36) / 500 >= g_eeGeneral.mAhWarn) { - AUDIO_TX_MAH_HIGH(); - } -#endif } } } From a25b20a1e75f76a2f3bfb818d4339e18c816c2ad Mon Sep 17 00:00:00 2001 From: Damjan Adamic Date: Sun, 20 Mar 2016 17:01:17 +0100 Subject: [PATCH 5/7] Re #3371: Sky9X fixed --- radio/src/targets/sky9x/board_sky9x.cpp | 7 +++++++ radio/src/targets/sky9x/board_sky9x.h | 1 + 2 files changed, 8 insertions(+) diff --git a/radio/src/targets/sky9x/board_sky9x.cpp b/radio/src/targets/sky9x/board_sky9x.cpp index 4f8249077..1398a4888 100644 --- a/radio/src/targets/sky9x/board_sky9x.cpp +++ b/radio/src/targets/sky9x/board_sky9x.cpp @@ -590,3 +590,10 @@ void checkTrainerSettings() } } +uint16_t getBatteryVoltage() +{ + int32_t instant_vbat = anaIn(TX_VOLTAGE); // using filtered ADC value on purpose + instant_vbat = (instant_vbat + instant_vbat*(g_eeGeneral.txVoltageCalibration)/128) * 4191; + instant_vbat /= 5530; + return (uint16_t)instant_vbat; +} diff --git a/radio/src/targets/sky9x/board_sky9x.h b/radio/src/targets/sky9x/board_sky9x.h index 72a7033aa..258cde686 100644 --- a/radio/src/targets/sky9x/board_sky9x.h +++ b/radio/src/targets/sky9x/board_sky9x.h @@ -228,6 +228,7 @@ enum Analogs { void adcInit(); void adcRead(void); uint16_t getAnalogValue(uint8_t index); +uint16_t getBatteryVoltage(); // returns current battery voltage in 10mV steps void setSticksGain(uint8_t gains); // Buzzer driver From af2cd301462dabc3f138fc99076799f09506b9a0 Mon Sep 17 00:00:00 2001 From: Damjan Adamic Date: Sun, 20 Mar 2016 17:13:23 +0100 Subject: [PATCH 6/7] Re #3371: Battery warning range fix for Horus --- radio/src/gui/horus/menu_general_setup.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/gui/horus/menu_general_setup.cpp b/radio/src/gui/horus/menu_general_setup.cpp index 542c8526b..b13f9b21c 100644 --- a/radio/src/gui/horus/menu_general_setup.cpp +++ b/radio/src/gui/horus/menu_general_setup.cpp @@ -329,7 +329,7 @@ bool menuGeneralSetup(evt_t event) case ITEM_SETUP_BATTERY_WARNING: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_BATTERYWARNING); putsValueWithUnit(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.vBatWarn, UNIT_VOLTS, attr|PREC1|LEFT); - if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.vBatWarn, 27, 42); // 2.7-4.2V + if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.vBatWarn, 40, 120); //4-12V break; #if 0 From 3a064b15ed1221ab2d20673b8ef17e1b1ad3aca1 Mon Sep 17 00:00:00 2001 From: Damjan Adamic Date: Sun, 20 Mar 2016 17:24:30 +0100 Subject: [PATCH 7/7] Simu fixes for 9X --- radio/src/opentx.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 90aed8420..0f082dff7 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -2734,6 +2734,11 @@ int main() if ((shutdown_state=pwrCheck()) > e_power_trainer) break; #endif +#if defined(SIMU) + sleep(5/*ms*/); + if (main_thread_running == 0) + return 0; +#endif perMain();