Mercurial > public > ostc4
comparison Discovery/Src/tMenuEdit.c @ 778:74253a41cf80
Zusammenf?hren
author | heinrichsweikamp |
---|---|
date | Mon, 22 May 2023 09:15:09 +0200 |
parents | 45b8f3c2acce |
children | c31237d20491 |
comparison
equal
deleted
inserted
replaced
777:6a8cf91e5b22 | 778:74253a41cf80 |
---|---|
25 /// You should have received a copy of the GNU General Public License | 25 /// You should have received a copy of the GNU General Public License |
26 /// along with this program. If not, see <http://www.gnu.org/licenses/>. | 26 /// along with this program. If not, see <http://www.gnu.org/licenses/>. |
27 ////////////////////////////////////////////////////////////////////////////// | 27 ////////////////////////////////////////////////////////////////////////////// |
28 | 28 |
29 /* Includes ------------------------------------------------------------------*/ | 29 /* Includes ------------------------------------------------------------------*/ |
30 #include <stdlib.h> | |
31 | |
30 #include "tMenuEdit.h" | 32 #include "tMenuEdit.h" |
31 | 33 |
32 #include "externLogbookFlash.h" | 34 #include "externLogbookFlash.h" |
33 #include "gfx_fonts.h" | 35 #include "gfx_fonts.h" |
34 #include "tHome.h" | 36 #include "tHome.h" |
58 | 60 |
59 typedef struct | 61 typedef struct |
60 { | 62 { |
61 char orgText[32]; | 63 char orgText[32]; |
62 char newText[32]; | 64 char newText[32]; |
63 uint16_t input[4]; | 65 uint32_t input[4]; |
64 uint16_t coord[3]; | 66 uint16_t coord[3]; |
65 int8_t begin[4], size[4]; | 67 int8_t begin[4], size[4]; |
66 tFont *fontUsed; | 68 tFont *fontUsed; |
67 uint32_t callerID; | 69 uint32_t callerID; |
68 uint8_t maintype; | 70 uint8_t maintype; |
78 FIELD_TOGGLE, | 80 FIELD_TOGGLE, |
79 FIELD_ON_OFF, | 81 FIELD_ON_OFF, |
80 FIELD_UDIGIT, | 82 FIELD_UDIGIT, |
81 FIELD_2DIGIT, | 83 FIELD_2DIGIT, |
82 FIELD_3DIGIT, | 84 FIELD_3DIGIT, |
85 FIELD_SDIGIT, | |
83 FIELD_FLOAT, | 86 FIELD_FLOAT, |
84 FIELD_END | 87 FIELD_END |
85 } SField; | 88 } SField; |
86 | 89 |
87 /* Private variables ---------------------------------------------------------*/ | 90 /* Private variables ---------------------------------------------------------*/ |
614 switch(ident[id].maintype) | 617 switch(ident[id].maintype) |
615 { | 618 { |
616 case FIELD_NUMBERS: | 619 case FIELD_NUMBERS: |
617 write_buttonTextline(TXT2BYTE_ButtonMinus,TXT2BYTE_ButtonEnter,TXT2BYTE_ButtonPlus); | 620 write_buttonTextline(TXT2BYTE_ButtonMinus,TXT2BYTE_ButtonEnter,TXT2BYTE_ButtonPlus); |
618 | 621 |
619 if(ident[id].subtype == FIELD_UDIGIT) | 622 switch (ident[id].subtype) { |
620 { | 623 case FIELD_UDIGIT: |
621 if((newContent >= '0') && (newContent <= '9')) | 624 if((newContent >= '0') && (newContent <= '9')) |
622 ident[id].newText[ident[id].begin[block] + subBlockPosition] = newContent; | 625 ident[id].newText[ident[id].begin[block] + subBlockPosition] = newContent; |
623 | 626 |
624 mark_new_digit_of_actual_id_block_and_subBlock(); | 627 mark_new_digit_of_actual_id_block_and_subBlock(); |
625 } | 628 |
626 else if(ident[id].subtype == FIELD_3DIGIT) | 629 break; |
627 { | 630 case FIELD_3DIGIT: |
628 if((newContent >= '0') && (newContent <= '0'+200)) | 631 if((newContent >= '0') && (newContent <= '0'+200)) |
629 { | 632 { |
630 split_Content_to_Digit_helper( newContent, &digit100, &digit10, &digit1); | 633 split_Content_to_Digit_helper( newContent, &digit100, &digit10, &digit1); |
631 ident[id].newText[ident[id].begin[block] + 0] = '0' + digit100; | 634 ident[id].newText[ident[id].begin[block] + 0] = '0' + digit100; |
632 ident[id].newText[ident[id].begin[block] + 1] = '0' + digit10; | 635 ident[id].newText[ident[id].begin[block] + 1] = '0' + digit10; |
633 ident[id].newText[ident[id].begin[block] + 2] = '0' + digit1; | 636 ident[id].newText[ident[id].begin[block] + 2] = '0' + digit1; |
634 mark_new_3digit_of_actual_id_block(); | 637 mark_new_3digit_of_actual_id_block(); |
635 } | 638 } |
636 } | 639 |
637 else // FIELD_2DIGIT | 640 break; |
638 { | 641 case FIELD_2DIGIT: |
639 if((newContent >= '0') && (newContent <= '0'+99)) | 642 if((newContent >= '0') && (newContent <= '0'+99)) |
640 { | 643 { |
641 ident[id].newText[ident[id].begin[block]] = '0' + (newContent - '0')/10; | 644 ident[id].newText[ident[id].begin[block]] = '0' + (newContent - '0')/10; |
642 ident[id].newText[ident[id].begin[block] + 1] = '0' + ((newContent - '0') - (10*((newContent - '0')/10))); | 645 ident[id].newText[ident[id].begin[block] + 1] = '0' + ((newContent - '0') - (10*((newContent - '0')/10))); |
643 mark_new_2digit_of_actual_id_block(); | 646 mark_new_2digit_of_actual_id_block(); |
644 } | 647 } |
648 | |
649 break; | |
650 case FIELD_SDIGIT: | |
651 if ((subBlockPosition == 0 && (newContent == '+' || newContent == '-')) || (subBlockPosition > 0 && newContent >= '0' && newContent <= '9')) { | |
652 ident[id].newText[ident[id].begin[block] + subBlockPosition] = newContent; | |
653 } | |
654 | |
655 mark_new_digit_of_actual_id_block_and_subBlock(); | |
656 | |
657 break; | |
645 } | 658 } |
646 break; | 659 break; |
647 case FIELD_BUTTON: | 660 case FIELD_BUTTON: |
648 set_globalState(menuID); | 661 set_globalState(menuID); |
649 break; | 662 break; |
756 else | 769 else |
757 if((ident[id].maintype == FIELD_NUMBERS) && (ident[id].subtype == FIELD_2DIGIT) && (action == ACTION_BUTTON_ENTER) &&(newContent >= '0') && (newContent <= '0' + 99)) | 770 if((ident[id].maintype == FIELD_NUMBERS) && (ident[id].subtype == FIELD_2DIGIT) && (action == ACTION_BUTTON_ENTER) &&(newContent >= '0') && (newContent <= '0' + 99)) |
758 { | 771 { |
759 ident[id].newText[ident[id].begin[block] + 0] = '0' + (newContent - '0')/10; | 772 ident[id].newText[ident[id].begin[block] + 0] = '0' + (newContent - '0')/10; |
760 ident[id].newText[ident[id].begin[block] + 1] = '0' + ((newContent - '0') - (10*((newContent - '0')/10))); | 773 ident[id].newText[ident[id].begin[block] + 1] = '0' + ((newContent - '0') - (10*((newContent - '0')/10))); |
774 } else if (ident[id].maintype == FIELD_NUMBERS && ident[id].subtype == FIELD_SDIGIT && action == ACTION_BUTTON_ENTER && subBlockPosition == 0) { | |
775 if (newContent == '+' || newContent == '-') { | |
776 ident[id].newText[ident[id].begin[block] + subBlockPosition] = newContent; | |
777 } | |
761 } | 778 } |
762 else | 779 else |
763 if((ident[id].maintype == FIELD_NUMBERS) && (action == ACTION_BUTTON_ENTER) && (newContent >= '0') && (newContent <= '9')) | 780 if((ident[id].maintype == FIELD_NUMBERS) && (action == ACTION_BUTTON_ENTER) && (newContent >= '0') && (newContent <= '9')) |
764 ident[id].newText[ident[id].begin[block] + subBlockPosition] = newContent; | 781 ident[id].newText[ident[id].begin[block] + subBlockPosition] = newContent; |
765 | 782 |
811 *outDigit1 = tempDigit; | 828 *outDigit1 = tempDigit; |
812 | 829 |
813 return CopyContent; | 830 return CopyContent; |
814 } | 831 } |
815 | 832 |
833 | |
834 static void checkUpdateSDigit(uint8_t newContent) | |
835 { | |
836 if ((subBlockPosition == 0 && (newContent == '+' || newContent == '-')) || (subBlockPosition > 0 && newContent >= '0' && newContent <= '9')) { | |
837 ident[id].newText[ident[id].begin[block] + subBlockPosition] = newContent; | |
838 } | |
839 } | |
840 | |
841 | |
816 void upMenuEditFieldDigit(void) | 842 void upMenuEditFieldDigit(void) |
817 { | 843 { |
818 uint8_t newContent; | 844 uint8_t newContent; |
819 uint8_t digit100; | 845 uint8_t digit100; |
820 uint8_t digit10; | 846 uint8_t digit10; |
841 ident[id].newText[ident[id].begin[block] + 1] = '0' + ((newContent - '0') - (10*((newContent - '0')/10))); | 867 ident[id].newText[ident[id].begin[block] + 1] = '0' + ((newContent - '0') - (10*((newContent - '0')/10))); |
842 mark_new_2digit_of_actual_id_block(); | 868 mark_new_2digit_of_actual_id_block(); |
843 return; | 869 return; |
844 } | 870 } |
845 | 871 |
846 if((ident[id].maintype == FIELD_NUMBERS) && (newContent >= '0') && (newContent <= '9')) | 872 if (ident[id].maintype == FIELD_NUMBERS && ident[id].subtype == FIELD_SDIGIT) { |
873 checkUpdateSDigit(newContent); | |
874 } else if (ident[id].maintype == FIELD_NUMBERS && newContent >= '0' && newContent <= '9') { | |
847 ident[id].newText[ident[id].begin[block] + subBlockPosition] = newContent; | 875 ident[id].newText[ident[id].begin[block] + subBlockPosition] = newContent; |
876 } | |
848 | 877 |
849 mark_new_digit_of_actual_id_block_and_subBlock(); | 878 mark_new_digit_of_actual_id_block_and_subBlock(); |
850 } | 879 } |
851 | 880 |
852 | 881 |
878 ident[id].newText[ident[id].begin[block] + 1] = '0' + ((newContent - '0') - (10*((newContent - '0')/10))); | 907 ident[id].newText[ident[id].begin[block] + 1] = '0' + ((newContent - '0') - (10*((newContent - '0')/10))); |
879 mark_new_2digit_of_actual_id_block(); | 908 mark_new_2digit_of_actual_id_block(); |
880 return; | 909 return; |
881 } | 910 } |
882 | 911 |
883 if((ident[id].maintype == FIELD_NUMBERS) && (newContent >= '0') && (newContent <= '9')) | 912 if (ident[id].maintype == FIELD_NUMBERS && ident[id].subtype == FIELD_SDIGIT) { |
913 checkUpdateSDigit(newContent); | |
914 } else if (ident[id].maintype == FIELD_NUMBERS && newContent >= '0' && newContent <= '9') { | |
884 ident[id].newText[ident[id].begin[block] + subBlockPosition] = newContent; | 915 ident[id].newText[ident[id].begin[block] + subBlockPosition] = newContent; |
916 } | |
885 | 917 |
886 mark_new_digit_of_actual_id_block_and_subBlock(); | 918 mark_new_digit_of_actual_id_block_and_subBlock(); |
887 } | 919 } |
888 | 920 |
889 | 921 |
890 void evaluateNewString(uint32_t editID, uint32_t *pNewValue1, uint32_t *pNewValue2, uint32_t *pNewValue3, uint32_t *pNewValue4) | 922 void evaluateNewString(uint32_t editID, uint32_t *pNewValue1, uint32_t *pNewValue2, uint32_t *pNewValue3, uint32_t *pNewValue4) |
891 { | 923 { |
892 if(editID != ident[id].callerID) | 924 if(editID != ident[id].callerID) |
893 return; | 925 return; |
926 | |
927 bool isSigned = ident[id].maintype == FIELD_NUMBERS && ident[id].subtype == FIELD_SDIGIT; | |
894 | 928 |
895 uint8_t i, digitCount, digit; | 929 uint8_t i, digitCount, digit; |
896 uint32_t sum[4], multiplier; | 930 uint32_t sum[4], multiplier; |
897 | 931 |
898 for(i=0;i<4;i++) | 932 for(i=0;i<4;i++) |
903 { | 937 { |
904 multiplier = 1; | 938 multiplier = 1; |
905 for(digitCount = 1; digitCount < ident[id].size[i]; digitCount++) | 939 for(digitCount = 1; digitCount < ident[id].size[i]; digitCount++) |
906 multiplier *= 10; | 940 multiplier *= 10; |
907 | 941 |
942 bool isNegative = false; | |
908 for(digitCount = 0; digitCount < ident[id].size[i]; digitCount++) | 943 for(digitCount = 0; digitCount < ident[id].size[i]; digitCount++) |
909 { | 944 { |
910 digit = ident[id].newText[ident[id].begin[i] + digitCount]; | 945 digit = ident[id].newText[ident[id].begin[i] + digitCount]; |
911 | 946 |
912 if(digit > '0') | 947 if (isSigned && digitCount == 0) { |
913 digit -= '0'; | 948 if (digit == '-') { |
914 else | 949 isNegative = true; |
915 digit = 0; | 950 } |
916 | 951 } else { |
917 if(digit > 9) | 952 if(digit > '0') |
918 digit = 9; | 953 digit -= '0'; |
919 | 954 else |
920 sum[i] += digit * multiplier; | 955 digit = 0; |
956 | |
957 if(digit > 9) | |
958 digit = 9; | |
959 | |
960 sum[i] += digit * multiplier; | |
961 } | |
921 | 962 |
922 if(multiplier >= 10) | 963 if(multiplier >= 10) |
923 multiplier /= 10; | 964 multiplier /= 10; |
924 else | 965 else |
925 multiplier = 0; | 966 multiplier = 0; |
926 } | 967 } |
968 | |
969 if (isSigned) { | |
970 int32_t value = sum[i]; | |
971 if (isNegative) { | |
972 value = -value; | |
973 } | |
974 sum[i] = ((input_u)value).uint32; | |
975 } | |
976 | |
927 i++; | 977 i++; |
928 } | 978 } |
929 | 979 |
930 *pNewValue1 = sum[0]; | 980 *pNewValue1 = sum[0]; |
931 *pNewValue2 = sum[1]; | 981 *pNewValue2 = sum[1]; |
1178 { | 1228 { |
1179 create_newText_for_actual_Id_and_field_select(); | 1229 create_newText_for_actual_Id_and_field_select(); |
1180 return; | 1230 return; |
1181 } | 1231 } |
1182 | 1232 |
1233 bool isSigned = ident[id].maintype == FIELD_NUMBERS && ident[id].subtype == FIELD_SDIGIT; | |
1234 | |
1183 uint8_t i, digitCount; | 1235 uint8_t i, digitCount; |
1184 uint32_t remainder, digit, divider; | 1236 uint32_t remainder, digit, divider; |
1185 | 1237 |
1186 i = 0; | 1238 i = 0; |
1187 while( ident[id].size[i] && (i < 4)) | 1239 while( ident[id].size[i] && (i < 4)) |
1188 { | 1240 { |
1189 remainder = ident[id].input[i]; | 1241 bool isNegative = false; |
1242 if (isSigned) { | |
1243 int32_t value = ((input_u)ident[id].input[i]).int32; | |
1244 if (value < 0) { | |
1245 isNegative = true; | |
1246 } | |
1247 remainder = abs(value); | |
1248 } else { | |
1249 remainder = ident[id].input[i]; | |
1250 } | |
1190 divider = 1; | 1251 divider = 1; |
1191 | 1252 |
1192 for(digitCount = 1; digitCount < ident[id].size[i]; digitCount++) | 1253 for(digitCount = 1; digitCount < ident[id].size[i]; digitCount++) |
1193 divider *= 10; | 1254 divider *= 10; |
1194 | 1255 |
1195 for(digitCount = 0; digitCount < ident[id].size[i]; digitCount++) | 1256 for(digitCount = 0; digitCount < ident[id].size[i]; digitCount++) |
1196 { | 1257 { |
1197 digit = remainder / divider; | 1258 if (isSigned && digitCount == 0) { |
1198 remainder -= digit * divider; | 1259 ident[id].newText[ident[id].begin[i] + digitCount] = isNegative ? '-' : '+'; |
1260 } else { | |
1261 digit = remainder / divider; | |
1262 remainder -= digit * divider; | |
1263 if(digit < 10) | |
1264 ident[id].newText[ident[id].begin[i] + digitCount] = digit + '0'; | |
1265 else | |
1266 ident[id].newText[ident[id].begin[i] + digitCount] = 'x'; | |
1267 } | |
1268 | |
1199 divider /= 10; | 1269 divider /= 10; |
1200 if(digit < 10) | |
1201 ident[id].newText[ident[id].begin[i] + digitCount] = digit + '0'; | |
1202 else | |
1203 ident[id].newText[ident[id].begin[i] + digitCount] = 'x'; | |
1204 } | 1270 } |
1205 i++; | 1271 i++; |
1206 } | 1272 } |
1207 } | 1273 } |
1208 | 1274 |
1308 void write_field_3digit(uint32_t editID, uint16_t XleftGimpStyle, uint16_t XrightGimpStyle, uint16_t YtopGimpStyle, const tFont *Font, const char *text, uint32_t int1, uint32_t int2, uint32_t int3, uint32_t int4) | 1374 void write_field_3digit(uint32_t editID, uint16_t XleftGimpStyle, uint16_t XrightGimpStyle, uint16_t YtopGimpStyle, const tFont *Font, const char *text, uint32_t int1, uint32_t int2, uint32_t int3, uint32_t int4) |
1309 { | 1375 { |
1310 write_field_udigit_and_2digit(FIELD_3DIGIT, editID,XleftGimpStyle,XrightGimpStyle,YtopGimpStyle,Font,text,int1,int2,int3,int4); | 1376 write_field_udigit_and_2digit(FIELD_3DIGIT, editID,XleftGimpStyle,XrightGimpStyle,YtopGimpStyle,Font,text,int1,int2,int3,int4); |
1311 } | 1377 } |
1312 | 1378 |
1313 /* | 1379 |
1314 void write_field_sdigit(uint32_t editID, uint16_t XleftGimpStyle, uint16_t XrightGimpStyle, uint16_t YtopGimpStyle, const tFont *Font, const char *text, int32_t int1, int32_t int2, int32_t int3, int32_t int4) | 1380 void write_field_sdigit(uint32_t editID, uint16_t XleftGimpStyle, uint16_t XrightGimpStyle, uint16_t YtopGimpStyle, const tFont *Font, const char *text, int32_t int1, int32_t int2, int32_t int3, int32_t int4) |
1315 { | 1381 { |
1316 } | 1382 write_field_udigit_and_2digit(FIELD_SDIGIT, editID, XleftGimpStyle, XrightGimpStyle, YtopGimpStyle, Font, text, ((input_u)int1).uint32, ((input_u)int2).uint32, ((input_u)int3).uint32, ((input_u)int4).uint32); |
1317 */ | 1383 } |
1384 | |
1318 | 1385 |
1319 void write_field_select(uint32_t editID, uint16_t XleftGimpStyle, uint16_t XrightGimpStyle, uint16_t YtopGimpStyle, const tFont *Font, const char *text, uint8_t int1, uint8_t int2, uint8_t int3, uint8_t int4) | 1386 void write_field_select(uint32_t editID, uint16_t XleftGimpStyle, uint16_t XrightGimpStyle, uint16_t YtopGimpStyle, const tFont *Font, const char *text, uint8_t int1, uint8_t int2, uint8_t int3, uint8_t int4) |
1320 { | 1387 { |
1321 if(id >= 9) | 1388 if(id >= 9) |
1322 return; | 1389 return; |