comparison Small_CPU/Src/externalInterface.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 4a28402e4aca
children 01b3eb9d55c3
comparison
equal deleted inserted replaced
778:74253a41cf80 779:0b5f45448eb6
65 static uint8_t externalUART_Protocol = 0; 65 static uint8_t externalUART_Protocol = 0;
66 static uint16_t externalCO2Value; 66 static uint16_t externalCO2Value;
67 static uint16_t externalCO2SignalStrength; 67 static uint16_t externalCO2SignalStrength;
68 static uint16_t externalCO2Status = 0; 68 static uint16_t externalCO2Status = 0;
69 69
70 static uint8_t sensorDataId = 0; 70 static uint8_t lastSensorDataId = 0;
71 static SSensorDataDiveO2 sensorDataDiveO2; 71 static SSensorDataDiveO2 sensorDataDiveO2[MAX_ADC_CHANNEL];
72 static externalInterfaceAutoDetect_t externalAutoDetect = DETECTION_OFF; 72 static externalInterfaceAutoDetect_t externalAutoDetect = DETECTION_OFF;
73 static externalInterfaceSensorType SensorMap[EXT_INTERFACE_SENSOR_CNT] ={ SENSOR_OPTIC, SENSOR_OPTIC, SENSOR_OPTIC, SENSOR_NONE, SENSOR_NONE}; 73 static externalInterfaceSensorType SensorMap[EXT_INTERFACE_SENSOR_CNT] ={ SENSOR_OPTIC, SENSOR_OPTIC, SENSOR_OPTIC, SENSOR_NONE, SENSOR_NONE};
74 static externalInterfaceSensorType tmpSensorMap[EXT_INTERFACE_SENSOR_CNT]; 74 static externalInterfaceSensorType tmpSensorMap[EXT_INTERFACE_SENSOR_CNT];
75 static externalInterfaceSensorType MasterSensorMap[EXT_INTERFACE_SENSOR_CNT]; 75 static externalInterfaceSensorType MasterSensorMap[EXT_INTERFACE_SENSOR_CNT];
76 76
329 { 329 {
330 case 0: 330 case 0:
331 case (EXT_INTERFACE_UART_CO2 >> 8): 331 case (EXT_INTERFACE_UART_CO2 >> 8):
332 case (EXT_INTERFACE_UART_O2 >> 8): 332 case (EXT_INTERFACE_UART_O2 >> 8):
333 case (EXT_INTERFACE_UART_SENTINEL >> 8): 333 case (EXT_INTERFACE_UART_SENTINEL >> 8):
334 if((externalAutoDetect <= DETECTION_START) || ((protocol == EXT_INTERFACE_UART_O2 >> 8) && (externalAutoDetect == DETECTION_DIGO2)) 334 if((externalAutoDetect <= DETECTION_START)
335 || ((protocol == EXT_INTERFACE_UART_O2 >> 8) && (externalAutoDetect == DETECTION_DIGO2_0))
336 || ((protocol == EXT_INTERFACE_UART_O2 >> 8) && (externalAutoDetect == DETECTION_DIGO2_1))
337 || ((protocol == EXT_INTERFACE_UART_O2 >> 8) && (externalAutoDetect == DETECTION_DIGO2_2))
338 || ((protocol == EXT_INTERFACE_UART_O2 >> 8) && (externalAutoDetect == DETECTION_UARTMUX))
335 #ifdef ENABLE_CO2_SUPPORT 339 #ifdef ENABLE_CO2_SUPPORT
336 || ((protocol == EXT_INTERFACE_UART_CO2 >> 8) && (externalAutoDetect == DETECTION_CO2)) 340 || ((protocol == EXT_INTERFACE_UART_CO2 >> 8) && (externalAutoDetect == DETECTION_CO2))
337 #endif 341 #endif
338 #ifdef ENABLE_SENTINEL_MODE 342 #ifdef ENABLE_SENTINEL_MODE
339 || ((protocol == EXT_INTERFACE_UART_SENTINEL >> 8) && (externalAutoDetect == DETECTION_SENTINEL)) 343 || ((protocol == EXT_INTERFACE_UART_SENTINEL >> 8) && (externalAutoDetect == DETECTION_SENTINEL))
340 #endif 344 #endif
341 ) 345 )
342 { 346 {
343 sensorDataId = 0; 347 lastSensorDataId = 0;
344 externalUART_Protocol = protocol; 348 externalUART_Protocol = protocol;
345 MX_USART1_UART_DeInit(); 349 MX_USART1_UART_DeInit();
346 if( protocol != 0) 350 if( protocol != 0)
347 { 351 {
348 MX_USART1_UART_Init(); 352 MX_USART1_UART_Init();
402 { 406 {
403 return externalCO2Status; 407 return externalCO2Status;
404 } 408 }
405 409
406 410
407 uint8_t externalInterface_GetSensorData(uint8_t* pDataStruct) 411 uint8_t externalInterface_GetSensorData(uint8_t sensorId, uint8_t* pDataStruct)
408 { 412 {
409 413 uint8_t localId = sensorId;
410 if((pDataStruct != NULL) && sensorDataId != 0) 414 if(localId == 0)
411 { 415 {
412 memcpy(pDataStruct, &sensorDataDiveO2, sizeof(sensorDataDiveO2)); 416 localId = lastSensorDataId;
413 } 417 }
414 return sensorDataId; 418
419 if((pDataStruct != NULL) && (localId > 0) && (localId <= MAX_ADC_CHANNEL))
420 {
421 memcpy(pDataStruct, &sensorDataDiveO2[localId-1], sizeof(SSensorDataDiveO2));
422 }
423 return localId;
415 } 424 }
416 425
417 void externalInterface_SetSensorData(uint8_t dataId, uint8_t* pDataStruct) 426 void externalInterface_SetSensorData(uint8_t dataId, uint8_t* pDataStruct)
418 { 427 {
419 if(pDataStruct != NULL) 428 if(pDataStruct != NULL)
420 { 429 {
421 if(dataId != 0) 430 if((dataId != 0) && (dataId <= MAX_ADC_CHANNEL))
422 { 431 {
423 memcpy(&sensorDataDiveO2, pDataStruct, sizeof(sensorDataDiveO2)); 432 memcpy(&sensorDataDiveO2[dataId-1], pDataStruct, sizeof(SSensorDataDiveO2));
424 } 433 }
425 else 434 else
426 { 435 {
427 memset(&sensorDataDiveO2,0,sizeof(sensorDataDiveO2)); 436 memset(&sensorDataDiveO2,0,sizeof(sensorDataDiveO2));
428 } 437 }
429 sensorDataId = dataId; 438 lastSensorDataId = dataId;
430 } 439 }
431 } 440 }
432 441
433 void externalInface_SetSensorMap(uint8_t* pMap) 442 void externalInface_SetSensorMap(uint8_t* pMap)
434 { 443 {
453 return pret; 462 return pret;
454 } 463 }
455 464
456 void externalInterface_AutodetectSensor() 465 void externalInterface_AutodetectSensor()
457 { 466 {
458 static uint8_t sensorIndex = 0; 467 static uint8_t tmpMuxMapping[MAX_ADC_CHANNEL];
468 static uint8_t sensorIndex = 0;
469 static uint8_t uartMuxChannel = 0;
459 uint8_t index = 0; 470 uint8_t index = 0;
460 471
461 if(externalAutoDetect != DETECTION_OFF) 472 if(externalAutoDetect != DETECTION_OFF)
462 { 473 {
463 switch(externalAutoDetect) 474 switch(externalAutoDetect)
464 { 475 {
465 case DETECTION_INIT: sensorIndex = 0; 476 case DETECTION_INIT: sensorIndex = 0;
477 uartMuxChannel = 0;
466 tmpSensorMap[0] = SENSOR_OPTIC; 478 tmpSensorMap[0] = SENSOR_OPTIC;
467 tmpSensorMap[1] = SENSOR_OPTIC; 479 tmpSensorMap[1] = SENSOR_OPTIC;
468 tmpSensorMap[2] = SENSOR_OPTIC; 480 tmpSensorMap[2] = SENSOR_OPTIC;
469 tmpSensorMap[3] = SENSOR_NONE; 481 tmpSensorMap[3] = SENSOR_NONE;
470 tmpSensorMap[4] = SENSOR_NONE; 482 tmpSensorMap[4] = SENSOR_NONE;
471 483
484 for(index = 0; index < MAX_ADC_CHANNEL; index++)
485 {
486 UART_MapDigO2_Channel(index,index); /* request all addresses */
487 tmpMuxMapping[index] = 0xff;
488 }
472 if(externalInterfacePresent) 489 if(externalInterfacePresent)
473 { 490 {
474 externalInterface_SwitchPower33(0); 491 externalInterface_SwitchPower33(0);
475 externalInterface_SwitchUART(0); 492 externalInterface_SwitchUART(0);
476 for(index = 0; index < MAX_ADC_CHANNEL; index++) 493 for(index = 0; index < MAX_ADC_CHANNEL; index++)
502 else 519 else
503 { 520 {
504 tmpSensorMap[sensorIndex++] = SENSOR_NONE; 521 tmpSensorMap[sensorIndex++] = SENSOR_NONE;
505 } 522 }
506 } 523 }
507 externalAutoDetect = DETECTION_DIGO2; 524 externalAutoDetect = DETECTION_UARTMUX;
508 externalInterface_SwitchUART(EXT_INTERFACE_UART_O2 >> 8); 525 externalInterface_SwitchUART(EXT_INTERFACE_UART_O2 >> 8);
509 break; 526 UART_SetDigO2_Channel(3);
510 case DETECTION_DIGO2: if(UART_isDigO2Connected()) 527 break;
528 case DETECTION_UARTMUX: if(UART_isDigO2Connected())
529 {
530 uartMuxChannel = 1;
531 }
532 externalAutoDetect = DETECTION_DIGO2_0;
533 externalInterface_SwitchUART(EXT_INTERFACE_UART_O2 >> 8);
534 UART_SetDigO2_Channel(0);
535
536 break;
537 case DETECTION_DIGO2_0:
538 case DETECTION_DIGO2_1:
539 case DETECTION_DIGO2_2: if(UART_isDigO2Connected())
511 { 540 {
512 for(index = 0; index < 3; index++) /* lookup a channel which may be used by digO2 */ 541 for(index = 0; index < 3; index++) /* lookup a channel which may be used by digO2 */
513 { 542 {
514 if(tmpSensorMap[index] == SENSOR_NONE) 543 if(tmpSensorMap[index] == SENSOR_NONE)
515 { 544 {
521 tmpSensorMap[2] = SENSOR_DIGO2; /* digital sensor overwrites ADC */ 550 tmpSensorMap[2] = SENSOR_DIGO2; /* digital sensor overwrites ADC */
522 } 551 }
523 else 552 else
524 { 553 {
525 tmpSensorMap[index] = SENSOR_DIGO2; 554 tmpSensorMap[index] = SENSOR_DIGO2;
526 } 555 tmpMuxMapping[index] = externalAutoDetect - DETECTION_DIGO2_0;
527 556 }
528 UART_setTargetChannel(index); 557 UART_setTargetChannel(index);
558
529 /* tmpSensorMap[sensorIndex++] = SENSOR_DIGO2; */ 559 /* tmpSensorMap[sensorIndex++] = SENSOR_DIGO2; */
560 }
561 if(uartMuxChannel)
562 {
563 externalInterface_SwitchUART(EXT_INTERFACE_UART_O2 >> 8);
564 UART_SetDigO2_Channel(uartMuxChannel);
565 uartMuxChannel++;
566 }
567 else
568 {
569 externalAutoDetect = DETECTION_DIGO2_2; /* skip detection of other serial sensors */
530 } 570 }
531 externalAutoDetect++; 571 externalAutoDetect++;
532 #ifdef ENABLE_CO2_SUPPORT 572 #ifdef ENABLE_CO2_SUPPORT
533 externalInterface_SwitchUART(EXT_INTERFACE_UART_CO2 >> 8); 573 if(externalAutoDetect == DETECTION_CO2)
574 {
575 externalInterface_SwitchUART(EXT_INTERFACE_UART_CO2 >> 8);
576 }
534 break; 577 break;
535 case DETECTION_CO2: if(UART_isCO2Connected()) 578 case DETECTION_CO2: if(UART_isCO2Connected())
536 { 579 {
537 for(index = 0; index < 3; index++) /* lookup a channel which may be used by CO2*/ 580 for(index = 0; index < 3; index++) /* lookup a channel which may be used by CO2*/
538 { 581 {
552 595
553 } 596 }
554 externalAutoDetect++; 597 externalAutoDetect++;
555 #endif 598 #endif
556 #ifdef ENABLE_SENTINEL_MODE 599 #ifdef ENABLE_SENTINEL_MODE
557 externalInterface_SwitchUART(EXT_INTERFACE_UART_SENTINEL >> 8); 600 if(externalAutoDetect == DETECTION_SENTINEL)
558 UART_StartDMA_Receiption(); 601 {
602 externalInterface_SwitchUART(EXT_INTERFACE_UART_SENTINEL >> 8);
603 UART_StartDMA_Receiption();
604 }
559 break; 605 break;
560 606
561 case DETECTION_SENTINEL: 607 case DETECTION_SENTINEL:
562 case DETECTION_SENTINEL2: 608 case DETECTION_SENTINEL2:
563 if(UART_isSentinelConnected()) 609 if(UART_isSentinelConnected())
569 sensorIndex = 3; 615 sensorIndex = 3;
570 } 616 }
571 externalAutoDetect++; 617 externalAutoDetect++;
572 #endif 618 #endif
573 break; 619 break;
574 case DETECTION_DONE: for(index = 0; index < EXT_INTERFACE_SENSOR_CNT; index++) 620 case DETECTION_DONE: if(uartMuxChannel)
575 { 621 {
576 if(tmpSensorMap[index] != SENSOR_NONE) 622 tmpSensorMap[EXT_INTERFACE_SENSOR_CNT-1] = SENSOR_MUX;
577 { 623 }
578 break; 624 for(index = 0; index < MAX_ADC_CHANNEL; index++)
579 } 625 {
580 } 626 UART_MapDigO2_Channel(index,tmpMuxMapping[index]);
581 627 }
582 if(index != EXT_INTERFACE_SENSOR_CNT) /* return default sensor map if no sensor at all has been detected */ 628 externalAutoDetect = DETECTION_OFF;
583 { 629 externalInterface_SwitchUART(0);
584 while(sensorIndex < EXT_INTERFACE_SENSOR_CNT) 630 UART_SetDigO2_Channel(0);
585 {
586 tmpSensorMap[sensorIndex++] = SENSOR_NONE;
587 }
588 }
589 else
590 {
591 tmpSensorMap[0] = SENSOR_OPTIC;
592 tmpSensorMap[1] = SENSOR_OPTIC;
593 tmpSensorMap[2] = SENSOR_OPTIC;
594 }
595 memcpy(SensorMap, tmpSensorMap, sizeof(tmpSensorMap)); 631 memcpy(SensorMap, tmpSensorMap, sizeof(tmpSensorMap));
596 externalAutoDetect = DETECTION_OFF; 632
597 break; 633 break;
598 default: 634 default:
599 break; 635 break;
600 } 636 }
601 } 637 }