Mercurial > public > ostc4
comparison Discovery/Src/show_logbook.c @ 696:cc542448fb28
Merge
author | heinrichsweikamp |
---|---|
date | Fri, 19 Aug 2022 11:30:24 +0200 |
parents | 1b995079c045 |
children | aa6006975e76 |
comparison
equal
deleted
inserted
replaced
661:87bee7cc77b3 | 696:cc542448fb28 |
---|---|
33 #include "gfx_fonts.h" | 33 #include "gfx_fonts.h" |
34 #include "show_logbook.h" | 34 #include "show_logbook.h" |
35 #include "unit.h" | 35 #include "unit.h" |
36 #include "configuration.h" | 36 #include "configuration.h" |
37 #include "logbook_miniLive.h" | 37 #include "logbook_miniLive.h" |
38 #include "text_multilanguage.h" | |
38 | 39 |
39 #include <stdint.h> | 40 #include <stdint.h> |
40 #include <stdio.h> | 41 #include <stdio.h> |
41 #include <stdlib.h> // for abs() | 42 #include <stdlib.h> // for abs() |
42 | 43 |
513 | 514 |
514 //Print Dive Mode (OC/CCR/...) | 515 //Print Dive Mode (OC/CCR/...) |
515 switch(logbookHeader.diveMode) | 516 switch(logbookHeader.diveMode) |
516 { | 517 { |
517 case DIVEMODE_OC: | 518 case DIVEMODE_OC: |
518 snprintf(text,20,"open circuit"); | 519 snprintf(text,20,"%c",TXT_OpenCircuit); |
519 break; | 520 break; |
520 case DIVEMODE_CCR: | 521 case DIVEMODE_CCR: |
521 snprintf(text,20,"closed circuit"); | 522 snprintf(text,20,"%c",TXT_ClosedCircuit); |
522 break; | 523 break; |
523 case DIVEMODE_Gauge: | 524 case DIVEMODE_Gauge: |
524 snprintf(text,20,"Gauge"); | 525 snprintf(text,20,"%c",TXT_Gauge); |
525 break; | 526 break; |
526 case DIVEMODE_Apnea: | 527 case DIVEMODE_Apnea: |
527 snprintf(text,20,"Apnea"); | 528 snprintf(text,20,"%c",TXT_Apnoe); |
529 break; | |
530 case DIVEMODE_PSCR: | |
531 snprintf(text,20,"%c",TXT_PSClosedCircuit); | |
528 break; | 532 break; |
529 } | 533 } |
530 Gfx_write_label_var(hgfx, 30, 250,60, &FontT42,CLUT_GasSensor4,text); | 534 Gfx_write_label_var(hgfx, 30, 250,60, &FontT42,CLUT_GasSensor4,text); |
531 | 535 |
532 // Decomodel | 536 // Decomodel |
884 | 888 |
885 static void show_logbook_logbook_show_log_page3(GFX_DrawCfgScreen *hgfx, uint8_t StepBackwards) | 889 static void show_logbook_logbook_show_log_page3(GFX_DrawCfgScreen *hgfx, uint8_t StepBackwards) |
886 { | 890 { |
887 SWindowGimpStyle wintemp; | 891 SWindowGimpStyle wintemp; |
888 SWindowGimpStyle winsmal; | 892 SWindowGimpStyle winsmal; |
893 uint8_t gasWasUsed[NUM_GASES * 2]; | |
894 int16_t index = 0; | |
895 uint8_t loopMode = 0; | |
896 | |
889 wintemp.left = 50; | 897 wintemp.left = 50; |
890 wintemp.right = 799 - wintemp.left; | 898 wintemp.right = 799 - wintemp.left; |
891 wintemp.top = 50; | 899 wintemp.top = 50; |
892 wintemp.bottom = 479 - 40; | 900 wintemp.bottom = 479 - 40; |
893 | 901 |
897 uint16_t dataLength = 0; | 905 uint16_t dataLength = 0; |
898 uint16_t depthdata[1000]; | 906 uint16_t depthdata[1000]; |
899 uint8_t gasdata[1000]; | 907 uint8_t gasdata[1000]; |
900 dataLength = logbook_readSampleData(StepBackwards, 1000, depthdata,gasdata, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); | 908 dataLength = logbook_readSampleData(StepBackwards, 1000, depthdata,gasdata, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); |
901 | 909 |
910 char msg[15]; | |
911 char gas_name[15]; | |
912 int j = 0; | |
913 | |
914 loopMode = isLoopMode(logbookHeader.diveMode); | |
915 | |
916 /* check if gas was used, independent from its active state */ | |
917 for(index = 0; index < NUM_GASES * 2; index++) | |
918 { | |
919 gasWasUsed[index] = 0; | |
920 } | |
921 for(index = 0; index < dataLength; index++) | |
922 { | |
923 if(loopMode) | |
924 { | |
925 if(gasdata[index] < NUM_GASES) /* the log entry starts with a ID in range 1..4 independend if diluent is used at start */ | |
926 { | |
927 gasdata[index] += NUM_GASES; | |
928 } | |
929 else | |
930 { | |
931 loopMode = 0; /* after the first gas change, no matter if diluent or bailout, the correct ID will be stored */ | |
932 } | |
933 } | |
934 if(gasdata[index] > 0) | |
935 { | |
936 gasWasUsed[gasdata[index]-1] = 1; /* The ID stored in the samples is starting with 1 (array[0] = gasID1) */ | |
937 } | |
938 else | |
939 { | |
940 gasWasUsed[0] = 1; | |
941 } | |
942 } | |
943 | |
902 //--- print coordinate system & depth graph with gaschanges --- | 944 //--- print coordinate system & depth graph with gaschanges --- |
903 show_logbook_draw_depth_graph(hgfx, StepBackwards, &wintemp, 1, dataLength, depthdata, gasdata, NULL); | 945 show_logbook_draw_depth_graph(hgfx, StepBackwards, &wintemp, 1, dataLength, depthdata, gasdata, NULL); |
904 | 946 |
905 //--- print gas list --- | 947 //--- print gas list --- |
906 winsmal.left = wintemp.right - 190; | 948 winsmal.left = wintemp.right - 190; |
907 winsmal.right = winsmal.left + 150; | 949 winsmal.right = winsmal.left + 150; |
908 | 950 |
909 char msg[15]; | 951 loopMode = isLoopMode(logbookHeader.diveMode); |
910 char gas_name[15]; | 952 for(index = (2 * NUM_GASES) -1; index >= 0; index--) |
911 int j = 0; | 953 { |
912 for(int i = 4;i >= 0;i--) | 954 if(gasWasUsed[index]) |
913 { | |
914 if(logbookHeader.gasordil[i].note.ub.active > 0) | |
915 { | 955 { |
916 j++; | 956 j++; |
957 if(j > 5) /* limit number of gases displayed to 5 */ | |
958 { | |
959 break; | |
960 } | |
917 winsmal.top = wintemp.bottom - 5 - j * 26 ; | 961 winsmal.top = wintemp.bottom - 5 - j * 26 ; |
918 winsmal.bottom = winsmal.top + 21 ; | 962 winsmal.bottom = winsmal.top + 21 ; |
919 uint8_t color = get_colour(i); | 963 uint8_t color = get_colour(index); |
920 | 964 |
921 print_gas_name(gas_name,15,logbookHeader.gasordil[i].oxygen_percentage,logbookHeader.gasordil[i].helium_percentage); | 965 if(loopMode) |
922 snprintf(msg,15,"G%i: %s",i + 1, gas_name); | 966 { |
923 //msg[10] = 0; | 967 if(index < NUM_GASES) /* Switch to Bailout is not covered by log gas list */ |
968 { | |
969 snprintf(gas_name,15,"Bailout"); | |
970 snprintf(msg,15,"G%d: %s",index +1, gas_name); | |
971 } | |
972 else | |
973 { | |
974 print_gas_name(gas_name,15,logbookHeader.gasordil[index-NUM_GASES].oxygen_percentage,logbookHeader.gasordil[index-NUM_GASES].helium_percentage); | |
975 snprintf(msg,15,"D%d: %s",index +1 - NUM_GASES, gas_name); | |
976 } | |
977 } | |
978 else | |
979 { | |
980 print_gas_name(gas_name,15,logbookHeader.gasordil[index].oxygen_percentage,logbookHeader.gasordil[index].helium_percentage); | |
981 snprintf(msg,15,"G%d: %s",index +1, gas_name); | |
982 } | |
924 Gfx_write_label_var(hgfx, winsmal.left, winsmal.right,winsmal.top, &FontT24,color,msg); | 983 Gfx_write_label_var(hgfx, winsmal.left, winsmal.right,winsmal.top, &FontT24,color,msg); |
925 } | 984 } |
926 } | 985 } |
927 | 986 |
928 //--- define buttons --- | 987 //--- define buttons --- |
929 /*if(*ghost_char_logfile_oxydata) | 988 /*if(*ghost_char_logfile_oxydata) |
930 button_start_single_action(surf1_menu_logbook_current_page, surf1_menu_logbook_show_log_page4, surf1_menu_logbook_show_log_next); | 989 button_start_single_action(surf1_menu_logbook_current_page, surf1_menu_logbook_show_log_page4, surf1_menu_logbook_show_log_next); |
931 else | 990 else |
932 button_start_single_action(surf1_menu_logbook_current_page, surf1_menu_logbook_show_log_page1, surf1_menu_logbook_show_log_next); | 991 button_start_single_action(surf1_menu_logbook_current_page, surf1_menu_logbook_show_log_page1, surf1_menu_logbook_show_log_next); |
933 */ | 992 */ |
993 } | |
994 | |
995 static uint8_t check_data_array_empty(uint16_t* pdata) | |
996 { | |
997 uint8_t ret = 0; | |
998 uint8_t index = 0; | |
999 uint8_t emptyCnt = 0; | |
1000 | |
1001 for (index=0; index < 10; index++) /* read the first 10 data points. If all are 0 then the array is rated as empty */ | |
1002 { | |
1003 if(*(pdata+index) == 0) | |
1004 { | |
1005 emptyCnt++; | |
1006 } | |
1007 } | |
1008 if(emptyCnt == 10) | |
1009 { | |
1010 ret = 1; | |
1011 } | |
1012 return ret; | |
934 } | 1013 } |
935 | 1014 |
936 static void show_logbook_logbook_show_log_page4(GFX_DrawCfgScreen *hgfx, uint8_t StepBackwards) | 1015 static void show_logbook_logbook_show_log_page4(GFX_DrawCfgScreen *hgfx, uint8_t StepBackwards) |
937 { SWindowGimpStyle wintemp; | 1016 { SWindowGimpStyle wintemp; |
938 SWindowGimpStyle winsmal; | 1017 SWindowGimpStyle winsmal; |
948 uint16_t depthdata[1000]; | 1027 uint16_t depthdata[1000]; |
949 uint8_t gasdata[1000]; | 1028 uint8_t gasdata[1000]; |
950 uint16_t ppO2data[1000]; | 1029 uint16_t ppO2data[1000]; |
951 uint16_t sensor2[1000]; | 1030 uint16_t sensor2[1000]; |
952 uint16_t sensor3[1000]; | 1031 uint16_t sensor3[1000]; |
953 uint16_t *setpoint = ppO2data; | 1032 uint16_t *setpoint = ppO2data; |
954 uint16_t *sensor1 = ppO2data; | 1033 uint16_t *sensor1 = ppO2data; |
955 | 1034 uint8_t sensorDataAvailable[] = {0,0,0}; |
956 | 1035 |
957 if(logbookHeader.diveMode != DIVEMODE_CCR) | 1036 |
1037 if(!isLoopMode(logbookHeader.diveMode)) | |
958 dataLength = logbook_readSampleData(StepBackwards, 1000, depthdata,gasdata, NULL, ppO2data, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); | 1038 dataLength = logbook_readSampleData(StepBackwards, 1000, depthdata,gasdata, NULL, ppO2data, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); |
959 else | 1039 else |
960 { | 1040 { |
961 if(logbookHeader.CCRmode == CCRMODE_FixedSetpoint) | 1041 switch(logbookHeader.CCRmode) |
962 dataLength = logbook_readSampleData(StepBackwards, 1000, depthdata, gasdata, NULL, NULL, setpoint, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); | 1042 { |
963 else | 1043 case CCRMODE_FixedSetpoint: |
964 dataLength = logbook_readSampleData(StepBackwards, 1000, depthdata, gasdata, NULL, NULL, NULL, sensor1, sensor2, sensor3, NULL, NULL, NULL, NULL, NULL); | 1044 default: dataLength = logbook_readSampleData(StepBackwards, 1000, depthdata, gasdata, NULL, NULL, setpoint, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); |
1045 break; | |
1046 case CCRMODE_Sensors: dataLength = logbook_readSampleData(StepBackwards, 1000, depthdata, gasdata, NULL, NULL, NULL, sensor1, sensor2, sensor3, NULL, NULL, NULL, NULL, NULL); | |
1047 if(!check_data_array_empty(sensor1)) | |
1048 { | |
1049 sensorDataAvailable[0] = 1; | |
1050 } | |
1051 if(!check_data_array_empty(sensor2)) | |
1052 { | |
1053 sensorDataAvailable[1] = 1; | |
1054 } | |
1055 if(!check_data_array_empty(sensor3)) | |
1056 { | |
1057 sensorDataAvailable[2] = 1; | |
1058 } | |
1059 if((logbookHeader.diveMode == DIVEMODE_PSCR) && (sensorDataAvailable[0] + sensorDataAvailable[1] + sensorDataAvailable[2] != 3)) /*insert sim data if not all three sensors are in use*/ | |
1060 { | |
1061 if(sensorDataAvailable[0] == 0) | |
1062 { | |
1063 logbook_readSampleData(StepBackwards, 1000, depthdata,gasdata, NULL, sensor1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); | |
1064 sensorDataAvailable[0] = 1; | |
1065 } | |
1066 else if(sensorDataAvailable[1] == 0) | |
1067 { | |
1068 logbook_readSampleData(StepBackwards, 1000, depthdata,gasdata, NULL, sensor2, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); | |
1069 sensorDataAvailable[1] = 1; | |
1070 } | |
1071 else if(sensorDataAvailable[2] == 0) | |
1072 { | |
1073 logbook_readSampleData(StepBackwards, 1000, depthdata,gasdata, NULL, sensor3, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); | |
1074 sensorDataAvailable[2] = 1; | |
1075 } | |
1076 } | |
1077 break; | |
1078 case CCRMODE_Simulation: dataLength = logbook_readSampleData(StepBackwards, 1000, depthdata,gasdata, NULL, ppO2data, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); | |
1079 break; | |
1080 } | |
965 } | 1081 } |
966 | 1082 |
967 | 1083 |
968 //--- print coordinate system & depth graph with bailout--- | 1084 //--- print coordinate system & depth graph with bailout--- |
969 show_logbook_draw_depth_graph(hgfx, StepBackwards, &wintemp, 0, dataLength, depthdata, gasdata, NULL); | 1085 show_logbook_draw_depth_graph(hgfx, StepBackwards, &wintemp, 0, dataLength, depthdata, gasdata, NULL); |
997 | 1113 |
998 } | 1114 } |
999 winsmal.left = 799 - 67;//wintemp.right -67; | 1115 winsmal.left = 799 - 67;//wintemp.right -67; |
1000 winsmal.right = winsmal.left;// + 45; | 1116 winsmal.right = winsmal.left;// + 45; |
1001 | 1117 |
1002 color = CLUT_LogbookTemperature;//LOGBOOK_GRAPH_DEPTH; | 1118 color = CLUT_LogbookTemperature; |
1003 if(logbookHeader.diveMode != DIVEMODE_CCR) | 1119 |
1120 if(!isLoopMode(logbookHeader.diveMode)) | |
1121 { | |
1004 Gfx_write_label_var(hgfx, winsmal.left, winsmal.right,winsmal.top, &FontT24,color,"\002PP O2"); | 1122 Gfx_write_label_var(hgfx, winsmal.left, winsmal.right,winsmal.top, &FontT24,color,"\002PP O2"); |
1005 else | 1123 } |
1006 if(logbookHeader.CCRmode != CCRMODE_Sensors) | 1124 else |
1007 Gfx_write_label_var(hgfx, winsmal.left, winsmal.right,winsmal.top, &FontT24,color,"\002SETPOINT"); | 1125 { |
1008 else | 1126 switch(logbookHeader.CCRmode) |
1009 Gfx_write_label_var(hgfx, winsmal.left, winsmal.right,winsmal.top, &FontT24,color,"\002SENSORS"); | 1127 { |
1128 case CCRMODE_FixedSetpoint: | |
1129 default: Gfx_write_label_var(hgfx, winsmal.left, winsmal.right,winsmal.top, &FontT24,color,"\002SETPOINT"); | |
1130 break; | |
1131 case CCRMODE_Sensors: Gfx_write_label_var(hgfx, winsmal.left, winsmal.right,winsmal.top, &FontT24,color,"\002SENSORS"); | |
1132 break; | |
1133 case CCRMODE_Simulation: Gfx_write_label_var(hgfx, winsmal.left, winsmal.right,winsmal.top, &FontT24,color,"\002SIM PPO2"); | |
1134 break; | |
1135 } | |
1136 } | |
1010 | 1137 |
1011 //*** PP O2 **************************************************** | 1138 //*** PP O2 **************************************************** |
1012 //calc lines and labels | 1139 //calc lines and labels |
1013 int datamax = 0; | 1140 int datamax = 0; |
1014 int datamin = 10000; | 1141 int datamin = 10000; |
1017 if(ppO2data[i]>datamax) | 1144 if(ppO2data[i]>datamax) |
1018 datamax = ppO2data[i]; | 1145 datamax = ppO2data[i]; |
1019 if(ppO2data[i]<datamin) | 1146 if(ppO2data[i]<datamin) |
1020 datamin = ppO2data[i]; | 1147 datamin = ppO2data[i]; |
1021 } | 1148 } |
1022 if((logbookHeader.diveMode == DIVEMODE_CCR) && (logbookHeader.CCRmode == CCRMODE_Sensors)) | 1149 if(isLoopMode(logbookHeader.diveMode) && (logbookHeader.CCRmode == CCRMODE_Sensors)) |
1023 { | 1150 { |
1024 for(int i=1;i<dataLength;i++) | 1151 for(int i=1;i<dataLength;i++) |
1025 { | 1152 { |
1026 if(sensor2[i]>datamax) | 1153 if(sensor2[i]>datamax) |
1027 datamax = sensor2[i]; | 1154 datamax = sensor2[i]; |
1075 if((ftmp - (int)ftmp) >= 0.5f) | 1202 if((ftmp - (int)ftmp) >= 0.5f) |
1076 wintemp.top++; | 1203 wintemp.top++; |
1077 wintemp.top = MaxU32LOG(wintemp.top ,0); | 1204 wintemp.top = MaxU32LOG(wintemp.top ,0); |
1078 if(wintemp.top < wintemp.bottom) | 1205 if(wintemp.top < wintemp.bottom) |
1079 { | 1206 { |
1080 if((logbookHeader.diveMode == DIVEMODE_CCR) && (logbookHeader.CCRmode == CCRMODE_Sensors)) | 1207 if(isLoopMode(logbookHeader.diveMode) && (logbookHeader.CCRmode == CCRMODE_Sensors)) |
1081 { | 1208 { |
1082 GFX_graph_print(hgfx,&wintemp,0,1,datamax,datamin, ppO2data,dataLength,CLUT_LogbookTemperature, NULL); | 1209 if(sensorDataAvailable[0]) |
1083 GFX_graph_print(hgfx,&wintemp,0,1,datamax,datamin, sensor2,dataLength,CLUT_LogbookTemperature, NULL); | 1210 { |
1084 GFX_graph_print(hgfx,&wintemp,0,1,datamax,datamin, sensor3,dataLength,CLUT_LogbookTemperature, NULL); | 1211 GFX_graph_print(hgfx,&wintemp,0,1,datamax,datamin, ppO2data,dataLength,CLUT_GasSensor2, NULL); |
1212 } | |
1213 if(sensorDataAvailable[1]) | |
1214 { | |
1215 GFX_graph_print(hgfx,&wintemp,0,1,datamax,datamin, sensor2,dataLength,CLUT_GasSensor3, NULL); | |
1216 } | |
1217 if(sensorDataAvailable[2]) | |
1218 { | |
1219 GFX_graph_print(hgfx,&wintemp,0,1,datamax,datamin, sensor3,dataLength,CLUT_GasSensor4, NULL); | |
1220 } | |
1085 } | 1221 } |
1086 else | 1222 else |
1087 GFX_graph_print(hgfx,&wintemp,0,1,datamax,datamin, ppO2data,dataLength,CLUT_LogbookTemperature, NULL); | 1223 GFX_graph_print(hgfx,&wintemp,0,1,datamax,datamin, ppO2data,dataLength,CLUT_LogbookTemperature, NULL); |
1088 } | 1224 } |
1089 else | 1225 else |