Mercurial > public > ostc4
changeset 244:c20c73b0d034
Merged in janlmulder/ostc4/div-fixes-5 (pull request #15)
Improvement SPI stability/recoverability and cleanup, and trivial bugfixes
author | heinrichsweikamp <bitbucket@heinrichsweikamp.com> |
---|---|
date | Tue, 09 Apr 2019 08:52:44 +0000 |
parents | ad6ddc4aabcd (current diff) b7b481df4f22 (diff) |
children | c282f9e88c66 ff0d23625cd5 |
files | |
diffstat | 11 files changed, 50 insertions(+), 95 deletions(-) [+] |
line wrap: on
line diff
--- a/Discovery/Inc/tInfoCompass.h Sat Apr 06 09:41:14 2019 +0200 +++ b/Discovery/Inc/tInfoCompass.h Tue Apr 09 08:52:44 2019 +0000 @@ -30,7 +30,7 @@ /* Exported functions --------------------------------------------------------*/ void openInfo_Compass(void); -void refreshInfo_Compass(void); +void refreshInfo_Compass(GFX_DrawCfgScreen s); #endif /* TINFO_COMPASS_H */
--- a/Discovery/Src/t3.c Sat Apr 06 09:41:14 2019 +0200 +++ b/Discovery/Src/t3.c Tue Apr 09 08:52:44 2019 +0000 @@ -37,7 +37,7 @@ #include "timer.h" #include "unit.h" -//* Importend function prototypes ---------------------------------------------*/ +//* Imported function prototypes ---------------------------------------------*/ extern uint8_t write_gas(char *text, uint8_t oxygen, uint8_t helium); /* Exported variables --------------------------------------------------------*/ @@ -799,7 +799,7 @@ t3_basics_colorscheme_mod(text); GFX_write_string(&FontT105,tXc1,text,1); } - else // NDL + else if(pDecoinfo->output_ndl_seconds) // NDL { snprintf(text,TEXTSIZE,"\032\f%c",TXT_Nullzeit); GFX_write_string(&FontT42,tXc1,text,0);
--- a/Discovery/Src/tInfo.c Sat Apr 06 09:41:14 2019 +0200 +++ b/Discovery/Src/tInfo.c Tue Apr 09 08:52:44 2019 +0000 @@ -210,7 +210,7 @@ if(inDebugMode()) tDebug_refresh(); else - refreshInfo_Compass(); + refreshInfo_Compass(tIscreen); if(inDebugMode() || (get_globalState() == StICOMPASS)) /* could be timeout and exitInfo */ GFX_SetFramesTopBottom(tIscreen.FBStartAdress, 0,480);
--- a/Discovery/Src/tInfoCompass.c Sat Apr 06 09:41:14 2019 +0200 +++ b/Discovery/Src/tInfoCompass.c Tue Apr 09 08:52:44 2019 +0000 @@ -27,11 +27,13 @@ ////////////////////////////////////////////////////////////////////////////// /* Includes ------------------------------------------------------------------*/ + +#include "gfx_engine.h" +#include "gfx_fonts.h" +#include "tHome.h" +#include "tInfo.h" #include "tInfoCompass.h" -#include "gfx_fonts.h" -#include "tInfo.h" - #include <string.h> /* Private variables ---------------------------------------------------------*/ @@ -59,8 +61,10 @@ /// @brief there is only compass_DX_f, compass_DY_f, compass_DZ_f output during this mode /// the accel is not called during this process // =============================================================================== -void refreshInfo_Compass(void) +void refreshInfo_Compass(GFX_DrawCfgScreen s) { + + tHome_show_lost_connection_count(&s); tInfoCompassTimeout--; if(tInfoCompassTimeout == 0) { @@ -94,7 +98,7 @@ } snprintf(text,80,"Time left: %u s",(tInfoCompassTimeout+9)/10); - tInfo_write_content_simple( 20,800, 20, &FontT42, text, CLUT_InfoCompass); + tInfo_write_content_simple( 20,800, 25, &FontT42, text, CLUT_InfoCompass); for(int i = 0; i<3;i ++) {
--- a/Small_CPU/Inc/scheduler.h Sat Apr 06 09:41:14 2019 +0200 +++ b/Small_CPU/Inc/scheduler.h Tue Apr 09 08:52:44 2019 +0000 @@ -60,7 +60,6 @@ _Bool demo_mode; uint8_t dataSendToSlaveIsValid; uint8_t dataSendToSlavePending; - uint8_t dataSendToSlaveStopEval; uint32_t sync_error_count; uint32_t check_sync_not_running; uint8_t ButtonResponsiveness[4]; @@ -70,7 +69,7 @@ uint8_t accidentFlag; uint32_t accidentRemainingSeconds; uint8_t sensorError[MAX_SENSORS]; - uint8_t I2C_SystemStatus; + HAL_StatusTypeDef I2C_SystemStatus; } SGlobal; typedef struct
--- a/Small_CPU/Src/baseCPU2.c Sat Apr 06 09:41:14 2019 +0200 +++ b/Small_CPU/Src/baseCPU2.c Tue Apr 09 08:52:44 2019 +0000 @@ -48,7 +48,7 @@ [..] HAL_SPI_TxRxCpltCallback() restarts DMA and will call scheduleSpecial_Evaluate_DataSendToSlave() only if it is not blocked - by I2C for example by setting global.dataSendToSlaveStopEval to 0. + by I2C. If the evaluation is blocked it has to be tested and executed afterwards. I2C is executed _without_ the usage of interrupts.
--- a/Small_CPU/Src/batteryGasGauge.c Sat Apr 06 09:41:14 2019 +0200 +++ b/Small_CPU/Src/batteryGasGauge.c Tue Apr 09 08:52:44 2019 +0000 @@ -71,6 +71,21 @@ I2C_Master_Transmit(DEVICE_BATTERYGAUGE, buffer, 2); } +static void disable_adc(void) +{ + uint8_t buffer[2]; + buffer[0] = 0x01; + + // according to the datasheet of the LTC2942, the adc shall + // be disabled when writing to the gauge registers + + // 0xF9 = 11111001: + // see init_battery_gas_gauge() + // Shutdown (1) + buffer[1] = 0xF9; + I2C_Master_Transmit(DEVICE_BATTERYGAUGE, buffer, 2); +} + void battery_gas_gauge_get_data(void) { @@ -104,6 +119,7 @@ void battery_gas_gauge_set_charge_full(void) { + disable_adc(); #ifdef OSTC_ON_DISCOVERY_HARDWARE return; #endif @@ -113,11 +129,14 @@ bufferSend[1] = 0xFF; bufferSend[2] = 0xFF; I2C_Master_Transmit( DEVICE_BATTERYGAUGE, bufferSend, 3); + init_battery_gas_gauge(); } void battery_gas_gauge_set(float percentage) { + + disable_adc(); #ifdef OSTC_ON_DISCOVERY_HARDWARE return; #endif @@ -135,6 +154,7 @@ bufferSend[1] = (uint8_t)(mAhSend / 256); bufferSend[2] = (uint8_t)(mAhSend & 0xFF); I2C_Master_Transmit( DEVICE_BATTERYGAUGE, bufferSend, 3); + init_battery_gas_gauge(); }
--- a/Small_CPU/Src/i2c.c Sat Apr 06 09:41:14 2019 +0200 +++ b/Small_CPU/Src/i2c.c Tue Apr 09 08:52:44 2019 +0000 @@ -23,12 +23,6 @@ } */ -HAL_StatusTypeDef I2C1_Status(void) -{ -return (HAL_StatusTypeDef)global.I2C_SystemStatus; -} - - GPIO_PinState HAL_I2C_Read_Data_PIN(void) { return HAL_GPIO_ReadPin(I2Cx_SDA_GPIO_PORT,I2Cx_SDA_PIN); @@ -66,21 +60,16 @@ I2cHandle.Init.GeneralCallMode = I2C_GENERALCALL_DISABLED; I2cHandle.Init.NoStretchMode = I2C_NOSTRETCH_DISABLED; I2cHandle.Init.OwnAddress1 = 0x01; - - global.dataSendToSlaveStopEval = 1; global.I2C_SystemStatus = HAL_I2C_Init(&I2cHandle); HAL_I2CEx_AnalogFilter_Config(&I2cHandle, I2C_ANALOGFILTER_ENABLED); HAL_I2CEx_ConfigDigitalFilter(&I2cHandle,0x0F); - - - global.dataSendToSlaveStopEval = 0; if(global.dataSendToSlavePending) { scheduleSpecial_Evaluate_DataSendToSlave(); } - return (HAL_StatusTypeDef)global.I2C_SystemStatus; + return global.I2C_SystemStatus; } @@ -89,84 +78,37 @@ HAL_I2C_DeInit(&I2cHandle); } - -uint8_t i2c_errors = 0; +static uint8_t i2c_errors = 0; void I2C_Error_count(void) { i2c_errors++; } - -HAL_StatusTypeDef I2C_Master_TransmitNoStop( uint16_t DevAddress, uint8_t *pData, uint16_t Size) -{ - if(global.I2C_SystemStatus != HAL_OK) - return (HAL_StatusTypeDef)global.I2C_SystemStatus; - - global.dataSendToSlaveStopEval = 1; - - global.I2C_SystemStatus = HAL_I2C_Master_Transmit(&I2cHandle, DevAddress, pData, Size, 0); - if(global.I2C_SystemStatus != HAL_OK) - { - I2C_Error_count(); - } - global.dataSendToSlaveStopEval = 0; - //TODO: REMOVE. -// if(global.dataSendToSlavePending) -// { -// scheduleSpecial_Evaluate_DataSendToSlave(); -// } - return (HAL_StatusTypeDef)global.I2C_SystemStatus; -} - - HAL_StatusTypeDef I2C_Master_Transmit( uint16_t DevAddress, uint8_t *pData, uint16_t Size) { if(global.I2C_SystemStatus != HAL_OK) - return (HAL_StatusTypeDef)(global.I2C_SystemStatus & 0x03); - - - global.dataSendToSlaveStopEval = 1; + return global.I2C_SystemStatus; global.I2C_SystemStatus = HAL_I2C_Master_Transmit(&I2cHandle, DevAddress, pData, Size, 2); if(global.I2C_SystemStatus != HAL_OK) { I2C_Error_count(); } - - global.dataSendToSlaveStopEval = 0; - //TODO: REMOVE. -// if(global.dataSendToSlavePending) -// { -// scheduleSpecial_Evaluate_DataSendToSlave(); -// } - return (HAL_StatusTypeDef)global.I2C_SystemStatus; + return global.I2C_SystemStatus; } - HAL_StatusTypeDef I2C_Master_Receive( uint16_t DevAddress, uint8_t *pData, uint16_t Size) { if(global.I2C_SystemStatus != HAL_OK) - return (HAL_StatusTypeDef)global.I2C_SystemStatus; - - uint8_t localHALstatusReturn = 0xFF; + return global.I2C_SystemStatus; - global.dataSendToSlaveStopEval = 1; - - localHALstatusReturn = HAL_I2C_Master_Receive(&I2cHandle, DevAddress, pData, Size, 10); - if(localHALstatusReturn != HAL_OK) + global.I2C_SystemStatus = HAL_I2C_Master_Receive(&I2cHandle, DevAddress, pData, Size, 10); + if(global.I2C_SystemStatus != HAL_OK) { I2C_Error_count(); } - global.dataSendToSlaveStopEval = 0; - //TODO: REMOVE. -// if(global.dataSendToSlavePending) -// { -// scheduleSpecial_Evaluate_DataSendToSlave(); -// } - - return (HAL_StatusTypeDef)localHALstatusReturn; + return global.I2C_SystemStatus; } -
--- a/Small_CPU/Src/pressure.c Sat Apr 06 09:41:14 2019 +0200 +++ b/Small_CPU/Src/pressure.c Tue Apr 09 08:52:44 2019 +0000 @@ -29,7 +29,7 @@ at the beginning of a dive the oldest value will be used */ - +#include "scheduler.h" #include "pressure.h" #include "i2c.h" #include "rtc.h" @@ -261,7 +261,7 @@ C2_x_2p16 = C[2] * 65536; C1_x_2p15 = C[1] * 32768; - if(I2C1_Status() == HAL_OK) + if(global.I2C_SystemStatus == HAL_OK) { pressureSensorInitSuccess = 1; } @@ -360,7 +360,7 @@ void pressure_calculation(void) { - if(I2C1_Status() != HAL_OK) + if(global.I2C_SystemStatus != HAL_OK) return; pressure_calculation_AN520_004_mod_MS5803_30BA__09_2015();
--- a/Small_CPU/Src/scheduler.c Sat Apr 06 09:41:14 2019 +0200 +++ b/Small_CPU/Src/scheduler.c Tue Apr 09 08:52:44 2019 +0000 @@ -48,10 +48,6 @@ /* Private types -------------------------------------------------------------*/ const SGas Air = {79,0,0,0,0}; -uint8_t testarrayindex = 0; -uint32_t testarray[256]; -uint32_t testarrayMain[256]; - /* Exported variables --------------------------------------------------------*/ SGlobal global; SDevice DeviceDataFlash; @@ -121,7 +117,7 @@ global.ButtonPICdata[2] = 0xFF; global.ButtonPICdata[3] = 0xFF; - global.I2C_SystemStatus = 0xFF; // 0x00 would be everything working + global.I2C_SystemStatus = HAL_ERROR; // 0x00 would be everything working global.lifeData.pressure_ambient_bar = INVALID_PREASURE_VALUE; global.lifeData.pressure_surface_bar = INVALID_PREASURE_VALUE; @@ -415,8 +411,8 @@ /* Try to start communication again. If exchange is stuck during execution for some reason the TX will be aborted by the * function error handler */ + Scheduler_Request_sync_with_SPI(SPI_SYNC_METHOD_SOFT); SPI_Start_single_TxRx_with_Master(); - Scheduler_Request_sync_with_SPI(SPI_SYNC_METHOD_SOFT); } } @@ -437,10 +433,8 @@ float lastPressure_bar = 0.0f; global.dataSendToMaster.mode = MODE_DIVE; global.deviceDataSendToMaster.mode = MODE_DIVE; - //uint16_t counterSecondsShallowDepth = 0; uint8_t counter_exit = 0; - Scheduler.tickstart = HAL_GetTick() - 1000; Scheduler.counterSPIdata100msec = 0; Scheduler.counterCompass100msec = 0; Scheduler.counterPressure100msec = 0; @@ -451,6 +445,7 @@ scheduleSetDate(&global.deviceData.diveCycles); global.lifeData.counterSecondsShallowDepth = 0; + Scheduler.tickstart = HAL_GetTick(); while(global.mode == MODE_DIVE) { schedule_check_resync(); @@ -1335,8 +1330,7 @@ //Supports threadsave copying!!! void copyPressureData(void) { - global.dataSendToMaster.sensorErrors = I2C1_Status(); - //uint8_t dataSendToMaster. + global.dataSendToMaster.sensorErrors = global.I2C_SystemStatus; uint8_t boolPressureData = !global.dataSendToMaster.boolPressureData; global.dataSendToMaster.data[boolPressureData].temperature = get_temperature(); global.dataSendToMaster.data[boolPressureData].pressure_mbar = get_pressure_mbar();
--- a/Small_CPU/Src/spi.c Sat Apr 06 09:41:14 2019 +0200 +++ b/Small_CPU/Src/spi.c Tue Apr 09 08:52:44 2019 +0000 @@ -382,10 +382,6 @@ global.dataSendToMaster.power_on_reset = 0; global.deviceDataSendToMaster.power_on_reset = 0; - //TODO:REMOVE - // if ( !global.dataSendToSlaveStopEval ) { - // scheduleSpecial_Evaluate_DataSendToSlave(); - // } scheduleSpecial_Evaluate_DataSendToSlave(); SPI_Start_single_TxRx_with_Master();