# HG changeset patch # User Ideenmodellierer # Date 1673815413 -3600 # Node ID 2a801cfe23abf2304a259d9d18100b8ba5a55135 # Parent 9c65d226f4f6cd3f04e95c39f4c3ef747feaf202 Improvment sensor Autodetection: The sensor type optical has been introduce to enable the OSTC to completly switch of the external interface (voltage + ADC operation) The optical interface is handled via firmware. In addition some states have been added to reset the external power supply and to provide the ADC more time to do its conversation. diff -r 9c65d226f4f6 -r 2a801cfe23ab Small_CPU/Inc/externalInterface.h --- a/Small_CPU/Inc/externalInterface.h Sat Jan 14 20:49:40 2023 +0100 +++ b/Small_CPU/Inc/externalInterface.h Sun Jan 15 21:43:33 2023 +0100 @@ -41,7 +41,9 @@ { DETECTION_OFF = 0, /* no detection requested */ DETECTION_INIT, /* prepare external interface for operation if not already activated */ - DETECTION_ANALOG, /* check ADC channels for connected sensors */ + DETECTION_START, + DETECTION_ANALOG1, /* check ADC channels for connected sensors */ + DETECTION_ANALOG2, DETECTION_DIGO2, /* check UART channel for connected DigO2 sensor */ DETECTION_CO2, /* check UART channel for connected CO2 sensor */ DETECTION_DONE @@ -73,7 +75,7 @@ uint8_t externalInterface_GetSensorData(uint8_t* pDataStruct); void externalInterface_SetSensorData(uint8_t dataId, uint8_t* pDataStruct); void externalInface_SetSensorMap(uint8_t* pMap); -uint8_t* externalInterface_GetSensorMapPointer(void); +uint8_t* externalInterface_GetSensorMapPointer(uint8_t finalMap); void externalInterface_AutodetectSensor(void); void externalInterface_ExecuteCmd(uint16_t Cmd); diff -r 9c65d226f4f6 -r 2a801cfe23ab Small_CPU/Src/externalInterface.c --- a/Small_CPU/Src/externalInterface.c Sat Jan 14 20:49:40 2023 +0100 +++ b/Small_CPU/Src/externalInterface.c Sun Jan 15 21:43:33 2023 +0100 @@ -111,7 +111,7 @@ { uint8_t retval = EXTERNAL_ADC_NO_DATA; uint8_t nextChannel; - uint8_t* psensorMap = externalInterface_GetSensorMapPointer(); + uint8_t* psensorMap = externalInterface_GetSensorMapPointer(0); if(externalADC_On) { @@ -260,10 +260,13 @@ } else { - HAL_GPIO_WritePin(GPIOC,GPIO_PIN_7,GPIO_PIN_SET); - externalV33_On = 0; - externalInterface_SetCO2Value(0); - externalInterface_SetCO2SignalStrength(0); + if(externalAutoDetect == DETECTION_OFF) + { + HAL_GPIO_WritePin(GPIOC,GPIO_PIN_7,GPIO_PIN_SET); + externalV33_On = 0; + externalInterface_SetCO2Value(0); + externalInterface_SetCO2SignalStrength(0); + } } } } @@ -299,8 +302,8 @@ case 0: case (EXT_INTERFACE_UART_CO2 >> 8): case (EXT_INTERFACE_UART_O2 >> 8): - if((externalAutoDetect == DETECTION_OFF) || ((protocol == EXT_INTERFACE_UART_CO2 >> 8) && (externalAutoDetect == DETECTION_CO2)) - || ((protocol == EXT_INTERFACE_UART_O2 >> 8) && (externalAutoDetect == DETECTION_DIGO2))) + if((externalAutoDetect <= DETECTION_START) || ((protocol == EXT_INTERFACE_UART_CO2 >> 8) && (externalAutoDetect == DETECTION_CO2)) + || ((protocol == EXT_INTERFACE_UART_O2 >> 8) && (externalAutoDetect == DETECTION_DIGO2))) { sensorDataId = 0; externalUART_Protocol = protocol; @@ -382,11 +385,11 @@ } } -uint8_t* externalInterface_GetSensorMapPointer() +uint8_t* externalInterface_GetSensorMapPointer(uint8_t finalMap) { uint8_t* pret; - if(externalAutoDetect != DETECTION_OFF) + if((externalAutoDetect != DETECTION_OFF) && (!finalMap)) { pret = tmpSensorMap; } @@ -407,16 +410,37 @@ switch(externalAutoDetect) { case DETECTION_INIT: sensorIndex = 0; - tmpSensorMap[0] = SENSOR_ANALOG; - tmpSensorMap[1] = SENSOR_ANALOG; - tmpSensorMap[2] = SENSOR_ANALOG; + tmpSensorMap[0] = SENSOR_OPTIC; + tmpSensorMap[1] = SENSOR_OPTIC; + tmpSensorMap[2] = SENSOR_OPTIC; tmpSensorMap[3] = SENSOR_NONE; tmpSensorMap[4] = SENSOR_NONE; - externalInterface_SwitchADC(1); - externalAutoDetect = DETECTION_ANALOG; + if(externalInterfacePresent) + { + externalInterface_SwitchPower33(0); + externalInterface_SwitchUART(0); + for(index = 0; index < MAX_ADC_CHANNEL; index++) + { + externalChannel_mV[index] = 0; + } + externalAutoDetect = DETECTION_START; + } + else + { + externalAutoDetect = DETECTION_DONE; /* without external interface O2 values may only be received via optical port => return default sensor map */ + } break; - case DETECTION_ANALOG: for(index = 0; index < MAX_ADC_CHANNEL; index++) + case DETECTION_START: tmpSensorMap[0] = SENSOR_ANALOG; + tmpSensorMap[1] = SENSOR_ANALOG; + tmpSensorMap[2] = SENSOR_ANALOG; + externalInterface_SwitchPower33(1); + externalInterface_SwitchADC(1); + externalAutoDetect = DETECTION_ANALOG1; + break; + case DETECTION_ANALOG1: externalAutoDetect = DETECTION_ANALOG2; /* do a second loop to make sure all adc channels could be processed */ + break; + case DETECTION_ANALOG2: for(index = 0; index < MAX_ADC_CHANNEL; index++) { if(externalChannel_mV[index] > MIN_ADC_VOLTAGE_MV) { @@ -475,9 +499,26 @@ } externalAutoDetect = DETECTION_DONE; break; - case DETECTION_DONE: while(sensorIndex < 5) + case DETECTION_DONE: for(index = 0; index < EXT_INTERFACE_SENSOR_CNT; index++) + { + if(tmpSensorMap[index] != SENSOR_NONE) + { + break; + } + } + + if(index != EXT_INTERFACE_SENSOR_CNT) /* return default sensor map if no sensor at all has been detected */ { - tmpSensorMap[sensorIndex++] = SENSOR_NONE; + while(sensorIndex < EXT_INTERFACE_SENSOR_CNT) + { + tmpSensorMap[sensorIndex++] = SENSOR_NONE; + } + } + else + { + tmpSensorMap[0] = SENSOR_OPTIC; + tmpSensorMap[1] = SENSOR_OPTIC; + tmpSensorMap[2] = SENSOR_OPTIC; } memcpy(SensorMap, tmpSensorMap, sizeof(tmpSensorMap)); externalAutoDetect = DETECTION_OFF; diff -r 9c65d226f4f6 -r 2a801cfe23ab Small_CPU/Src/scheduler.c --- a/Small_CPU/Src/scheduler.c Sat Jan 14 20:49:40 2023 +0100 +++ b/Small_CPU/Src/scheduler.c Sun Jan 15 21:43:33 2023 +0100 @@ -1736,7 +1736,7 @@ global.dataSendToMaster.data[boolADCBuffer && DATA_BUFFER_ADC].extADC_voltage[channel] = value; } global.dataSendToMaster.data[boolADCBuffer && DATA_BUFFER_ADC].externalInterface_SensorID = externalInterface_GetSensorData((uint8_t*)&global.dataSendToMaster.data[boolADCBuffer && DATA_BUFFER_ADC].sensor_data); - memcpy(global.dataSendToMaster.data[boolADCBuffer && DATA_BUFFER_ADC].sensor_map,externalInterface_GetSensorMapPointer(),EXT_INTERFACE_SENSOR_CNT); + memcpy(global.dataSendToMaster.data[boolADCBuffer && DATA_BUFFER_ADC].sensor_map,externalInterface_GetSensorMapPointer(1),EXT_INTERFACE_SENSOR_CNT); global.dataSendToMaster.boolADCO2Data |= boolADCBuffer; } diff -r 9c65d226f4f6 -r 2a801cfe23ab Small_CPU/Src/uart.c --- a/Small_CPU/Src/uart.c Sat Jan 14 20:49:40 2023 +0100 +++ b/Small_CPU/Src/uart.c Sun Jan 15 21:43:33 2023 +0100 @@ -79,6 +79,7 @@ MX_USART1_DMA_Init(); + memset(rxBuffer,0,sizeof(rxBuffer)); rxReadIndex = 0; lastCmdIndex = 0; rxWriteIndex = 0;