Mercurial > public > ostc4
comparison Small_CPU/Src/uart.c @ 779:0b5f45448eb6
Added UART multiplexer support for DiveO2:
The existing autodetect function now includes a UART multiplexer. The datastructures and protocol handling has been adapted to support several DiveO2 sensors connected to the UART.
author | Ideenmodellierer |
---|---|
date | Tue, 23 May 2023 21:45:34 +0200 |
parents | df0d43da1614 |
children | 01b3eb9d55c3 |
comparison
equal
deleted
inserted
replaced
778:74253a41cf80 | 779:0b5f45448eb6 |
---|---|
26 | 26 |
27 /* Private variables ---------------------------------------------------------*/ | 27 /* Private variables ---------------------------------------------------------*/ |
28 | 28 |
29 #define CHUNK_SIZE (25u) /* the DMA will handle chunk size transfers */ | 29 #define CHUNK_SIZE (25u) /* the DMA will handle chunk size transfers */ |
30 #define CHUNKS_PER_BUFFER (5u) | 30 #define CHUNKS_PER_BUFFER (5u) |
31 #define COMMAND_TX_DELAY (30u) /* The time the sensor needs to recover from a invalid command request */ | |
31 UART_HandleTypeDef huart1; | 32 UART_HandleTypeDef huart1; |
32 | 33 |
33 DMA_HandleTypeDef hdma_usart1_rx; | 34 DMA_HandleTypeDef hdma_usart1_rx; |
34 | 35 |
35 uint8_t rxBuffer[CHUNK_SIZE * CHUNKS_PER_BUFFER]; /* The complete buffer has a X * chunk size to allow fariations in buffer read time */ | 36 uint8_t rxBuffer[CHUNK_SIZE * CHUNKS_PER_BUFFER]; /* The complete buffer has a X * chunk size to allow fariations in buffer read time */ |
40 static uint8_t digO2Connected = 0; /* Binary indicator if a sensor is connected or not */ | 41 static uint8_t digO2Connected = 0; /* Binary indicator if a sensor is connected or not */ |
41 static uint8_t CO2Connected = 0; /* Binary indicator if a sensor is connected or not */ | 42 static uint8_t CO2Connected = 0; /* Binary indicator if a sensor is connected or not */ |
42 static uint8_t SentinelConnected = 0; /* Binary indicator if a sensor is connected or not */ | 43 static uint8_t SentinelConnected = 0; /* Binary indicator if a sensor is connected or not */ |
43 static uint8_t ppO2TargetChannel = 0; /* The OSTC4 supports three slots for visualization of the ppo2. This one is reserved for the digital sensor */ | 44 static uint8_t ppO2TargetChannel = 0; /* The OSTC4 supports three slots for visualization of the ppo2. This one is reserved for the digital sensor */ |
44 | 45 |
45 static SSensorDataDiveO2 sensorDataDiveO2; /* intermediate storage for additional sensor data */ | 46 static SSensorDataDiveO2 tmpSensorDataDiveO2; /* intermediate storage for additional sensor data */ |
46 | 47 |
47 char tmpRxBuf[30]; | 48 char tmpRxBuf[30]; |
48 uint8_t tmpRxIdx = 0; | 49 uint8_t tmpRxIdx = 0; |
49 | 50 |
50 static uartO2Status_t Comstatus_O2 = UART_O2_INIT; | 51 static uartO2Status_t Comstatus_O2 = UART_O2_INIT; |
52 static uint8_t activeSensor = 0; | |
53 static uint8_t sensorMapping[MAX_ADC_CHANNEL]; /* The mapping is used to assign the visible sensor channel to the mux address (DiveO2) */ | |
51 | 54 |
52 float LED_Level = 0.0; /* Normalized LED value which may be used as indication for the health status of the sensor */ | 55 float LED_Level = 0.0; /* Normalized LED value which may be used as indication for the health status of the sensor */ |
53 float LED_ZeroOffset = 0.0; | 56 float LED_ZeroOffset = 0.0; |
54 float pCO2 = 0.0; | 57 float pCO2 = 0.0; |
55 /* Exported functions --------------------------------------------------------*/ | 58 /* Exported functions --------------------------------------------------------*/ |
121 /* DMA interrupt init */ | 124 /* DMA interrupt init */ |
122 HAL_NVIC_SetPriority(DMA2_Stream5_IRQn, 0, 0); | 125 HAL_NVIC_SetPriority(DMA2_Stream5_IRQn, 0, 0); |
123 HAL_NVIC_EnableIRQ(DMA2_Stream5_IRQn); | 126 HAL_NVIC_EnableIRQ(DMA2_Stream5_IRQn); |
124 } | 127 } |
125 | 128 |
129 | |
130 void DigitalO2_SelectSensor(uint8_t channel) | |
131 { | |
132 uint8_t indexstr[4]; | |
133 uint8_t muxAddress = 0; | |
134 indexstr[0] = '~'; | |
135 indexstr[1] = '1'; | |
136 indexstr[2] = 0x0D; | |
137 indexstr[3] = 0x0A; | |
138 | |
139 if((channel < MAX_ADC_CHANNEL) && (sensorMapping[channel] != 0xff)) | |
140 { | |
141 muxAddress = sensorMapping[channel]; | |
142 } | |
143 else | |
144 { | |
145 muxAddress = MAX_ADC_CHANNEL; /* default to mux */ | |
146 } | |
147 indexstr[1] = '0' + muxAddress; | |
148 HAL_UART_Transmit(&huart1,indexstr,4,10); | |
149 } | |
126 | 150 |
127 void DigitalO2_SetupCmd(uint8_t O2State, uint8_t *cmdString, uint8_t *cmdLength) | 151 void DigitalO2_SetupCmd(uint8_t O2State, uint8_t *cmdString, uint8_t *cmdLength) |
128 { | 152 { |
129 switch (O2State) | 153 switch (O2State) |
130 { | 154 { |
461 static uint8_t curAlive = 0; | 485 static uint8_t curAlive = 0; |
462 | 486 |
463 static uint8_t cmdLength = 0; | 487 static uint8_t cmdLength = 0; |
464 static uint8_t cmdString[10]; | 488 static uint8_t cmdString[10]; |
465 static uint8_t cmdReadIndex = 0; | 489 static uint8_t cmdReadIndex = 0; |
466 | 490 static uint32_t tickToTX = 0; |
491 static uint32_t delayStartTick = 0; | |
492 | |
493 uint8_t switchChannel = 0; | |
494 uint8_t index = 0; | |
467 uint32_t tmpO2 = 0; | 495 uint32_t tmpO2 = 0; |
468 uint32_t tmpData = 0; | 496 uint32_t tmpData = 0; |
469 uint8_t localRX = rxReadIndex; | 497 uint8_t localRX = rxReadIndex; |
470 uint32_t tick = HAL_GetTick(); | 498 uint32_t tick = HAL_GetTick(); |
471 | 499 |
472 | 500 uint8_t *pmap = externalInterface_GetSensorMapPointer(0); |
473 if(Comstatus_O2 == UART_O2_INIT) | 501 |
474 { | 502 /* The channel switch will cause the sensor to respond with an error message. */ |
475 memset((char*)&rxBuffer[rxWriteIndex],(int)0,CHUNK_SIZE); | 503 /* The sensor needs ~30ms to recover before he is ready to receive the next command => transmission delay needed */ |
476 memset((char*) &sensorDataDiveO2, 0, sizeof(sensorDataDiveO2)); | 504 if((tickToTX) && (time_elapsed_ms(delayStartTick,tick) >= tickToTX )) |
477 externalInterface_SetSensorData(0,(uint8_t*)&sensorDataDiveO2); | 505 { |
478 | |
479 lastAlive = 0; | |
480 curAlive = 0; | |
481 | |
482 Comstatus_O2 = UART_O2_CHECK; | |
483 DigitalO2_SetupCmd(Comstatus_O2,cmdString,&cmdLength); | |
484 HAL_UART_Transmit(&huart1,cmdString,cmdLength,10); | 506 HAL_UART_Transmit(&huart1,cmdString,cmdLength,10); |
485 | 507 tickToTX = 0; |
486 rxState = O2RX_CONFIRM; | 508 } |
487 cmdReadIndex = 0; | 509 else |
488 lastO2ReqTick = tick; | 510 { |
489 | 511 if(Comstatus_O2 == UART_O2_INIT) |
490 UART_StartDMA_Receiption(); | 512 { |
491 } | 513 memset((char*)&rxBuffer[rxWriteIndex],(int)0,CHUNK_SIZE); |
492 if(time_elapsed_ms(lastO2ReqTick,tick) > 1000) /* repeat request once per second */ | 514 memset((char*) &tmpSensorDataDiveO2, 0, sizeof(tmpSensorDataDiveO2)); |
493 { | 515 externalInterface_SetSensorData(0,(uint8_t*)&tmpSensorDataDiveO2); |
494 lastO2ReqTick = tick; | 516 |
495 if(Comstatus_O2 == UART_O2_IDLE) /* cyclic request of o2 value */ | 517 lastAlive = 0; |
496 { | 518 curAlive = 0; |
497 Comstatus_O2 = UART_O2_REQ_RAW; | 519 |
520 Comstatus_O2 = UART_O2_CHECK; | |
521 DigitalO2_SetupCmd(Comstatus_O2,cmdString,&cmdLength); | |
522 DigitalO2_SelectSensor(activeSensor); | |
523 if(activeSensor < MAX_ADC_CHANNEL) | |
524 { | |
525 externalInterface_GetSensorData(activeSensor + 1, (uint8_t*)&tmpSensorDataDiveO2); | |
526 } | |
527 delayStartTick = tick; | |
528 tickToTX = COMMAND_TX_DELAY; | |
529 | |
498 rxState = O2RX_CONFIRM; | 530 rxState = O2RX_CONFIRM; |
499 } | 531 cmdReadIndex = 0; |
500 DigitalO2_SetupCmd(Comstatus_O2,cmdString,&cmdLength); | 532 lastO2ReqTick = tick; |
501 | 533 |
502 HAL_UART_Transmit(&huart1,cmdString,cmdLength,10); | 534 UART_StartDMA_Receiption(); |
503 } | 535 } |
504 | 536 if(time_elapsed_ms(lastO2ReqTick,tick) > 1000) /* repeat request once per second */ |
505 while((rxBuffer[localRX]!=0)) | 537 { |
506 { | 538 lastO2ReqTick = tick; |
507 | 539 index = activeSensor; |
508 lastReceiveTick = tick; | 540 if(Comstatus_O2 == UART_O2_IDLE) /* cyclic request of o2 value */ |
509 switch(rxState) | 541 { |
510 { | 542 if(pmap[EXT_INTERFACE_SENSOR_CNT-1] == SENSOR_MUX) /* select next sensor if mux is connected */ |
511 case O2RX_CONFIRM: if(rxBuffer[localRX] == '#') | 543 { |
512 { | 544 if(activeSensor < MAX_ADC_CHANNEL) |
513 cmdReadIndex = 0; | 545 { |
514 } | 546 do |
515 if(rxBuffer[localRX] == cmdString[cmdReadIndex]) | 547 { |
516 { | 548 index++; |
517 cmdReadIndex++; | 549 if(index == MAX_ADC_CHANNEL) |
518 if(cmdReadIndex == cmdLength - 1) | 550 { |
519 { | 551 index = 0; |
520 digO2Connected = 1; | 552 } |
521 tmpRxIdx = 0; | 553 if(pmap[index] == SENSOR_DIGO2) |
522 memset((char*) tmpRxBuf, 0, sizeof(tmpRxBuf)); | 554 { |
523 switch (Comstatus_O2) | 555 activeSensor = index; |
556 switchChannel = 1; | |
557 break; | |
558 } | |
559 } while(index != activeSensor); | |
560 } | |
561 } | |
562 | |
563 Comstatus_O2 = UART_O2_REQ_RAW; | |
564 rxState = O2RX_CONFIRM; | |
565 } | |
566 if(switchChannel) | |
567 { | |
568 delayStartTick = tick; | |
569 DigitalO2_SelectSensor(activeSensor); | |
570 externalInterface_GetSensorData(activeSensor + 1, (uint8_t*)&tmpSensorDataDiveO2); | |
571 tickToTX = COMMAND_TX_DELAY; | |
572 if(tmpSensorDataDiveO2.sensorId == 0) | |
573 { | |
574 Comstatus_O2 = UART_O2_REQ_ID; | |
575 } | |
576 } | |
577 else | |
578 { | |
579 HAL_UART_Transmit(&huart1,cmdString,cmdLength,10); | |
580 } | |
581 DigitalO2_SetupCmd(Comstatus_O2,cmdString,&cmdLength); | |
582 } | |
583 | |
584 while((rxBuffer[localRX]!=0)) | |
585 { | |
586 lastReceiveTick = tick; | |
587 switch(rxState) | |
588 { | |
589 case O2RX_CONFIRM: if(rxBuffer[localRX] == '#') | |
524 { | 590 { |
525 case UART_O2_CHECK: Comstatus_O2 = UART_O2_REQ_ID; | 591 cmdReadIndex = 0; |
526 rxState = O2RX_CONFIRM; | 592 } |
527 DigitalO2_SetupCmd(Comstatus_O2,cmdString,&cmdLength); | 593 if(rxBuffer[localRX] == cmdString[cmdReadIndex]) |
528 HAL_UART_Transmit(&huart1,cmdString,cmdLength,10); | 594 { |
529 break; | 595 cmdReadIndex++; |
530 case UART_O2_REQ_ID: rxState = O2RX_GETNR; | 596 if(cmdReadIndex == cmdLength - 1) |
531 break; | 597 { |
532 case UART_O2_REQ_INFO: rxState = O2RX_GETTYPE; | 598 digO2Connected = 1; |
533 break; | 599 tmpRxIdx = 0; |
534 case UART_O2_REQ_RAW: | 600 memset((char*) tmpRxBuf, 0, sizeof(tmpRxBuf)); |
535 case UART_O2_REQ_O2: rxState = O2RX_GETO2; | 601 switch (Comstatus_O2) |
536 break; | 602 { |
537 default: Comstatus_O2 = UART_O2_IDLE; | 603 case UART_O2_CHECK: Comstatus_O2 = UART_O2_IDLE; |
538 rxState = O2RX_IDLE; | |
539 break; | 604 break; |
540 } | 605 case UART_O2_REQ_ID: rxState = O2RX_GETNR; |
541 } | 606 break; |
542 } | 607 case UART_O2_REQ_INFO: rxState = O2RX_GETTYPE; |
543 break; | 608 break; |
544 | 609 case UART_O2_REQ_RAW: |
545 case O2RX_GETSTATUS: | 610 case UART_O2_REQ_O2: rxState = O2RX_GETO2; |
546 case O2RX_GETTEMP: | 611 break; |
547 case O2RX_GETTYPE: | 612 default: Comstatus_O2 = UART_O2_IDLE; |
548 case O2RX_GETVERSION: | 613 rxState = O2RX_IDLE; |
549 case O2RX_GETCHANNEL: | |
550 case O2RX_GETSUBSENSORS: | |
551 case O2RX_GETO2: | |
552 case O2RX_GETNR: | |
553 case O2RX_GETDPHI: | |
554 case O2RX_INTENSITY: | |
555 case O2RX_AMBIENTLIGHT: | |
556 case O2RX_PRESSURE: | |
557 case O2RX_HUMIDITY: | |
558 if(rxBuffer[localRX] != 0x0D) | |
559 { | |
560 if(rxBuffer[localRX] != ' ') | |
561 { | |
562 tmpRxBuf[tmpRxIdx++] = rxBuffer[localRX]; | |
563 } | |
564 else | |
565 { | |
566 if(tmpRxIdx != 0) | |
567 { | |
568 switch(rxState) | |
569 { | |
570 case O2RX_GETCHANNEL: StringToInt(tmpRxBuf,&tmpData); | |
571 rxState = O2RX_GETVERSION; | |
572 break; | 614 break; |
573 case O2RX_GETVERSION: StringToInt(tmpRxBuf,&tmpData); | |
574 rxState = O2RX_GETSUBSENSORS; | |
575 break; | |
576 case O2RX_GETTYPE: StringToInt(tmpRxBuf,&tmpData); | |
577 rxState = O2RX_GETCHANNEL; | |
578 break; | |
579 | |
580 case O2RX_GETO2: StringToInt(tmpRxBuf,&tmpO2); | |
581 setExternalInterfaceChannel(ppO2TargetChannel,(float)(tmpO2 / 10000.0)); | |
582 rxState = O2RX_GETTEMP; | |
583 break; | |
584 case O2RX_GETTEMP: StringToInt(tmpRxBuf,(uint32_t*)&sensorDataDiveO2.temperature); | |
585 rxState = O2RX_GETSTATUS; | |
586 break; | |
587 case O2RX_GETSTATUS: StringToInt(tmpRxBuf,&sensorDataDiveO2.status); /* raw data cycle */ | |
588 rxState = O2RX_GETDPHI; | |
589 break; | |
590 case O2RX_GETDPHI: /* ignored to save memory and most likly irrelevant for diver */ | |
591 rxState = O2RX_INTENSITY; | |
592 break; | |
593 case O2RX_INTENSITY: StringToInt(tmpRxBuf,(uint32_t*)&sensorDataDiveO2.intensity); /* raw data cycle */ | |
594 rxState = O2RX_AMBIENTLIGHT; | |
595 break; | |
596 case O2RX_AMBIENTLIGHT: StringToInt(tmpRxBuf,(uint32_t*)&sensorDataDiveO2.ambient); /* raw data cycle */ | |
597 rxState = O2RX_PRESSURE; | |
598 break; | |
599 case O2RX_PRESSURE: StringToInt(tmpRxBuf,(uint32_t*)&sensorDataDiveO2.pressure); /* raw data cycle */ | |
600 rxState = O2RX_HUMIDITY; | |
601 break; | |
602 default: | |
603 break; | |
604 } | |
605 memset((char*) tmpRxBuf, 0, tmpRxIdx); | |
606 tmpRxIdx = 0; | |
607 } | 615 } |
608 } | 616 } |
609 } | 617 } |
610 else | 618 break; |
611 { | 619 |
612 switch (rxState) | 620 case O2RX_GETSTATUS: |
621 case O2RX_GETTEMP: | |
622 case O2RX_GETTYPE: | |
623 case O2RX_GETVERSION: | |
624 case O2RX_GETCHANNEL: | |
625 case O2RX_GETSUBSENSORS: | |
626 case O2RX_GETO2: | |
627 case O2RX_GETNR: | |
628 case O2RX_GETDPHI: | |
629 case O2RX_INTENSITY: | |
630 case O2RX_AMBIENTLIGHT: | |
631 case O2RX_PRESSURE: | |
632 case O2RX_HUMIDITY: | |
633 if(rxBuffer[localRX] != 0x0D) | |
613 { | 634 { |
614 case O2RX_GETSTATUS: StringToInt(tmpRxBuf,&sensorDataDiveO2.status); | 635 if(rxBuffer[localRX] != ' ') /* the following data entities are placed within the data stream => no need to store data at the end */ |
615 externalInterface_SetSensorData(1,(uint8_t*)&sensorDataDiveO2); | 636 { |
616 Comstatus_O2 = UART_O2_IDLE; | 637 tmpRxBuf[tmpRxIdx++] = rxBuffer[localRX]; |
617 rxState = O2RX_IDLE; | 638 } |
639 else | |
640 { | |
641 if(tmpRxIdx != 0) | |
642 { | |
643 switch(rxState) | |
644 { | |
645 case O2RX_GETCHANNEL: StringToInt(tmpRxBuf,&tmpData); | |
646 rxState = O2RX_GETVERSION; | |
647 break; | |
648 case O2RX_GETVERSION: StringToInt(tmpRxBuf,&tmpData); | |
649 rxState = O2RX_GETSUBSENSORS; | |
650 break; | |
651 case O2RX_GETTYPE: StringToInt(tmpRxBuf,&tmpData); | |
652 rxState = O2RX_GETCHANNEL; | |
653 break; | |
654 | |
655 case O2RX_GETO2: StringToInt(tmpRxBuf,&tmpO2); | |
656 setExternalInterfaceChannel(activeSensor,(float)(tmpO2 / 10000.0)); | |
657 rxState = O2RX_GETTEMP; | |
658 break; | |
659 case O2RX_GETTEMP: StringToInt(tmpRxBuf,(uint32_t*)&tmpSensorDataDiveO2.temperature); | |
660 rxState = O2RX_GETSTATUS; | |
661 break; | |
662 case O2RX_GETSTATUS: StringToInt(tmpRxBuf,&tmpSensorDataDiveO2.status); /* raw data cycle */ | |
663 rxState = O2RX_GETDPHI; | |
664 break; | |
665 case O2RX_GETDPHI: /* ignored to save memory and most likly irrelevant for diver */ | |
666 rxState = O2RX_INTENSITY; | |
667 break; | |
668 case O2RX_INTENSITY: StringToInt(tmpRxBuf,(uint32_t*)&tmpSensorDataDiveO2.intensity); /* raw data cycle */ | |
669 rxState = O2RX_AMBIENTLIGHT; | |
670 break; | |
671 case O2RX_AMBIENTLIGHT: StringToInt(tmpRxBuf,(uint32_t*)&tmpSensorDataDiveO2.ambient); /* raw data cycle */ | |
672 rxState = O2RX_PRESSURE; | |
673 break; | |
674 case O2RX_PRESSURE: StringToInt(tmpRxBuf,(uint32_t*)&tmpSensorDataDiveO2.pressure); /* raw data cycle */ | |
675 rxState = O2RX_HUMIDITY; | |
676 break; | |
677 default: | |
678 break; | |
679 } | |
680 memset((char*) tmpRxBuf, 0, tmpRxIdx); | |
681 tmpRxIdx = 0; | |
682 } | |
683 } | |
684 } | |
685 else | |
686 { /* the following data items are the last of a sensor respond => store temporal data */ | |
687 switch (rxState) | |
688 { | |
689 case O2RX_GETSTATUS: StringToInt(tmpRxBuf,&tmpSensorDataDiveO2.status); | |
690 externalInterface_SetSensorData(activeSensor+1,(uint8_t*)&tmpSensorDataDiveO2); | |
691 Comstatus_O2 = UART_O2_IDLE; | |
692 rxState = O2RX_IDLE; | |
693 break; | |
694 case O2RX_GETSUBSENSORS: StringToInt(tmpRxBuf,&tmpData); | |
695 Comstatus_O2 = UART_O2_IDLE; | |
696 rxState = O2RX_IDLE; | |
697 break; | |
698 case O2RX_HUMIDITY: StringToInt(tmpRxBuf,(uint32_t*)&tmpSensorDataDiveO2.humidity); /* raw data cycle */ | |
699 externalInterface_SetSensorData(activeSensor+1,(uint8_t*)&tmpSensorDataDiveO2); | |
700 Comstatus_O2 = UART_O2_IDLE; | |
701 rxState = O2RX_IDLE; | |
702 break; | |
703 case O2RX_GETNR: StringToUInt64((char*)tmpRxBuf,&tmpSensorDataDiveO2.sensorId); | |
704 externalInterface_SetSensorData(activeSensor+1,(uint8_t*)&tmpSensorDataDiveO2); | |
705 index = activeSensor; | |
706 | |
707 if(switchChannel == 0) | |
708 { | |
709 Comstatus_O2 = UART_O2_IDLE; | |
710 rxState = O2RX_IDLE; | |
711 } | |
618 break; | 712 break; |
619 case O2RX_GETSUBSENSORS: StringToInt(tmpRxBuf,&tmpData); | 713 default: Comstatus_O2 = UART_O2_IDLE; |
620 Comstatus_O2 = UART_O2_IDLE; | 714 rxState = O2RX_IDLE; |
621 rxState = O2RX_IDLE; | |
622 break; | 715 break; |
623 case O2RX_HUMIDITY: StringToInt(tmpRxBuf,(uint32_t*)&sensorDataDiveO2.humidity); /* raw data cycle */ | 716 } |
624 externalInterface_SetSensorData(1,(uint8_t*)&sensorDataDiveO2); | |
625 Comstatus_O2 = UART_O2_IDLE; | |
626 rxState = O2RX_IDLE; | |
627 break; | |
628 case O2RX_GETNR: StringToUInt64((char*)tmpRxBuf,&sensorDataDiveO2.sensorId); | |
629 /* no break */ | |
630 default: Comstatus_O2 = UART_O2_IDLE; | |
631 rxState = O2RX_IDLE; | |
632 break; | |
633 } | 717 } |
634 } | 718 break; |
635 break; | 719 default: rxState = O2RX_IDLE; |
636 default: rxState = O2RX_IDLE; | 720 break; |
637 break; | 721 |
638 | 722 } |
639 } | 723 rxBuffer[localRX] = 0; |
640 rxBuffer[localRX] = 0; | 724 localRX++; |
641 localRX++; | 725 rxReadIndex++; |
642 rxReadIndex++; | 726 if(rxReadIndex >= CHUNK_SIZE * CHUNKS_PER_BUFFER) |
643 if(rxReadIndex >= CHUNK_SIZE * CHUNKS_PER_BUFFER) | 727 { |
644 { | 728 localRX = 0; |
645 localRX = 0; | 729 rxReadIndex = 0; |
646 rxReadIndex = 0; | 730 } |
647 } | 731 } |
648 } | 732 |
649 | 733 if((digO2Connected) && time_elapsed_ms(lastReceiveTick,HAL_GetTick()) > 4000) /* check for communication timeout */ |
650 if((digO2Connected) && time_elapsed_ms(lastReceiveTick,HAL_GetTick()) > 4000) /* check for communication timeout */ | 734 { |
651 { | 735 digO2Connected = 0; |
652 digO2Connected = 0; | 736 if(curAlive == lastAlive) |
653 if(curAlive == lastAlive) | 737 { |
654 { | 738 setExternalInterfaceChannel(ppO2TargetChannel,0.0); |
655 setExternalInterfaceChannel(ppO2TargetChannel,0.0); | 739 } |
656 } | 740 lastAlive = curAlive; |
657 lastAlive = curAlive; | 741 } |
658 } | 742 if((dmaActive == 0) && (externalInterface_isEnabledPower33())) /* Should never happen in normal operation => restart in case of communication error */ |
659 if((dmaActive == 0) && (externalInterface_isEnabledPower33())) /* Should never happen in normal operation => restart in case of communication error */ | 743 { |
660 { | 744 UART_StartDMA_Receiption(); |
661 UART_StartDMA_Receiption(); | 745 } |
746 } | |
747 } | |
748 | |
749 void UART_SetDigO2_Channel(uint8_t channel) | |
750 { | |
751 if(channel <= MAX_ADC_CHANNEL) | |
752 { | |
753 activeSensor = channel; | |
754 } | |
755 } | |
756 void UART_MapDigO2_Channel(uint8_t channel, uint8_t muxAddress) | |
757 { | |
758 if((channel < MAX_ADC_CHANNEL) && (muxAddress < MAX_ADC_CHANNEL)) | |
759 { | |
760 sensorMapping[channel] = muxAddress; | |
662 } | 761 } |
663 } | 762 } |
664 | 763 |
665 uint8_t UART_isDigO2Connected() | 764 uint8_t UART_isDigO2Connected() |
666 { | 765 { |