From a67da85f55ebaa97b8008f5dc29e28ca7720c27b Mon Sep 17 00:00:00 2001 From: Edward Emelianov Date: Sun, 14 May 2023 22:05:36 +0300 Subject: [PATCH] display modes: window and menu; check ADC - wery good --- F3:F303/NitrogenFlooding/ADUvsR | 34 ++++++++ F3:F303/NitrogenFlooding/buttons.c | 2 +- F3:F303/NitrogenFlooding/hardware.h | 4 + F3:F303/NitrogenFlooding/indication.c | 34 +++++--- F3:F303/NitrogenFlooding/menu.c | 117 ++++++++++++++++++++------ F3:F303/NitrogenFlooding/menu.h | 4 +- F3:F303/NitrogenFlooding/nitrogen.bin | Bin 32324 -> 32748 bytes F3:F303/NitrogenFlooding/proto.c | 4 +- F3:F303/NitrogenFlooding/spi.c | 2 +- F3:F303/NitrogenFlooding/version.inc | 2 +- 10 files changed, 155 insertions(+), 48 deletions(-) create mode 100644 F3:F303/NitrogenFlooding/ADUvsR diff --git a/F3:F303/NitrogenFlooding/ADUvsR b/F3:F303/NitrogenFlooding/ADUvsR new file mode 100644 index 0000000..2432c8d --- /dev/null +++ b/F3:F303/NitrogenFlooding/ADUvsR @@ -0,0 +1,34 @@ +1. interchannel difference (with ommeter influence) + +Rx 0 1 2 3 4 5 6 7 8 9 +106 388 387 387 386 385 385 386 384 384 384 +425 1064 1063 1064 1064 1063 1064 1063 1063 1062 1062 +1001 1471 1470 1469 1471 1470 1469 1471 1470 1469 1469 +2500 1763 1765 1765 1763 1765 1763 1763 1762 1763 1763 +5020 1888 1888 1888 1888 1889 1888 1889 1888 1890 1889 +1007 1958 1956 1957 1958 1959 1956 1957 1956 1957 1956 + +2. ADU vs R (pure: without ommeter influence) +Rx ADU +44 173 +103 380 +143 507 +236 778 +356 1073 +481 1329 +723 1718 +814 1836 +913 1952 +1010 2056 +1145 2181 +1340 2341 +1519 2464 +1701 2574 +2040 2745 +2910 3046 +3760 3231 +4710 3373 +5960 3502 +7420 3603 +8600 3663 +10060 3720 \ No newline at end of file diff --git a/F3:F303/NitrogenFlooding/buttons.c b/F3:F303/NitrogenFlooding/buttons.c index a1a0231..4344fcd 100644 --- a/F3:F303/NitrogenFlooding/buttons.c +++ b/F3:F303/NitrogenFlooding/buttons.c @@ -61,7 +61,7 @@ void process_keys(){ } } } - if(e != k->event){ + if(e != k->event || e == EVT_HOLD){ k->lastTms = Tms; lastUnsleep = Tms; } diff --git a/F3:F303/NitrogenFlooding/hardware.h b/F3:F303/NitrogenFlooding/hardware.h index fee3b5e..a1eaebc 100644 --- a/F3:F303/NitrogenFlooding/hardware.h +++ b/F3:F303/NitrogenFlooding/hardware.h @@ -86,11 +86,15 @@ // refresh interval for screen windows #define WINDOW_REFRESH_TIMEOUT (1000) +typedef uint16_t btnevtmask; // event mask: less 8 - press, high 8 - hold // buttons masks bit0 - button0 etc #define BTN_ESC_MASK (1<<0) #define BTN_LEFT_MASK (1<<1) #define BTN_RIGHT_MASK (1<<2) #define BTN_SEL_MASK (1<<3) +#define BTN_PRESS(e, mask) ((e) & (mask)) +#define BTN_HOLD(e, mask) ((e) & ((mask) << 8)) +#define BTN_PRESSHOLD(e, mask) ((e) & ((mask) | ((mask)<<8))) // global sensors' data extern float Temperature, Pressure, Humidity, Dewpoint; diff --git a/F3:F303/NitrogenFlooding/indication.c b/F3:F303/NitrogenFlooding/indication.c index c61d0d3..1bbbdf6 100644 --- a/F3:F303/NitrogenFlooding/indication.c +++ b/F3:F303/NitrogenFlooding/indication.c @@ -40,8 +40,8 @@ static uint32_t ledT[LEDS_AMOUNT] = {0}; static uint32_t ledH[LEDS_AMOUNT] = {199, 0, 0, 0}; static uint32_t ledL[LEDS_AMOUNT] = {799, 1, 1, 1}; -static void refresh_mainwin(uint8_t evtmask); -static void refresh_menu(uint8_t evtmask); +static void refresh_mainwin(btnevtmask evtmask); +static void refresh_menu(btnevtmask evtmask); // current menu static menu *curmenu = &mainmenu; @@ -81,17 +81,17 @@ TRUE_INLINE void leds_proc(){ } } -static void refresh_mainwin(uint8_t evtmask){ // ask all parameters and refresh main window with new values - if(evtmask & BTN_ESC_MASK){ // force refresh +static void refresh_mainwin(btnevtmask evtmask){ // ask all parameters and refresh main window with new values + if(BTN_PRESS(evtmask, BTN_ESC_MASK)){ // force refresh Sens_measured_time = Tms - SENSORS_DATA_TIMEOUT*2; // force refresh lastTupd = Tms; return; // just start measurements } - if(evtmask & BTN_SEL_MASK){ // switch to menu + if(BTN_PRESS(evtmask, BTN_SEL_MASK)){ // switch to menu init_menu(&mainmenu); return; } - if(evtmask) return; // left/right buttons - do nothing + if(evtmask) return; // left/right buttons press, any hold - do nothing cls(); SetFontScale(1); // small menu items labels setBGcolor(COLOR_BLACK); setFGcolor(COLOR_LIGHTGREEN); @@ -141,19 +141,19 @@ void init_menu(menu *m){ refresh_menu(0); } -static void refresh_menu(uint8_t evtmask){ // refresh menu with changed selection +static void refresh_menu(btnevtmask evtmask){ // refresh menu with changed selection DBG("REFRESH menu"); if(!curmenu){ init_window(refresh_mainwin); return; } - if(evtmask & BTN_ESC_MASK){ // escape to level upper or to main window + if(BTN_PRESS(evtmask, BTN_ESC_MASK)){ // escape to level upper or to main window if(curmenu) curmenu = curmenu->parent; if(!curmenu){ init_window(refresh_mainwin); return; } - } else if(evtmask & BTN_SEL_MASK){ + } else if(BTN_PRESS(evtmask, BTN_SEL_MASK)){ menuitem *selitem = &curmenu->items[curmenu->selected]; menu *sub = selitem->submenu; void (*action)() = selitem->action; @@ -161,9 +161,9 @@ static void refresh_menu(uint8_t evtmask){ // refresh menu with changed selectio if(sub){ // change to submenu curmenu = sub; } else return; - } else if(evtmask & BTN_LEFT_MASK){ // up + } else if(BTN_PRESSHOLD(evtmask, BTN_LEFT_MASK)){ // up if(curmenu->selected) --curmenu->selected; - } else if(evtmask & BTN_RIGHT_MASK){ // down + } else if(BTN_PRESSHOLD(evtmask, BTN_RIGHT_MASK)){ // down if(curmenu->selected < curmenu->nitems - 1) ++curmenu->selected; } cls(); @@ -198,15 +198,21 @@ static void refresh_menu(uint8_t evtmask){ // refresh menu with changed selectio * 2 - down * 3 - select/menu */ -TRUE_INLINE uint8_t btns_proc(){ +#if BTNSNO > 8 +#pragma error "Change this code!" +#endif +TRUE_INLINE btnevtmask btns_proc(){ static uint32_t lastT = 0; - uint8_t evtmask = 0; // bitmask for active buttons (==1) + btnevtmask evtmask = 0; // bitmask for active buttons (==1) static keyevent lastevent[BTNSNO] = {0}; if(lastUnsleep == lastT) return 0; // no buttons activity lastT = lastUnsleep; for(int i = 0; i < BTNSNO; ++i){ keyevent evt = keystate(i, NULL); // T may be used for doubleclick detection if(evt == EVT_PRESS && lastevent[i] != EVT_PRESS) evtmask |= 1< WINDOW_REFRESH_TIMEOUT){ diff --git a/F3:F303/NitrogenFlooding/menu.c b/F3:F303/NitrogenFlooding/menu.c index 0165415..c9550f4 100644 --- a/F3:F303/NitrogenFlooding/menu.c +++ b/F3:F303/NitrogenFlooding/menu.c @@ -24,17 +24,26 @@ #include "strfunc.h" #include "usb.h" +#include + // integer parameter to change typedef struct{ - uint32_t min; - uint32_t max; - uint32_t cur; - uint32_t *val; -} u32par; + int32_t min; + int32_t max; + int32_t cur; + int32_t *val; +} i32par_t; + +// function to run after selecting "yes" in yesno window +typedef void (*yesfun_t)(); +yesfun_t yesfunction = NULL; // current parameter of uint32_t setter -static u32par u32parameter = {0}; +static i32par_t i32parameter = {0}; +// string buffer for non-constant parname +#define PARNMBUFSZ (63) +static char parnmbuff[PARNMBUFSZ+1]; static const char *parname = NULL; // upper level menu to return from subwindow functions @@ -43,6 +52,7 @@ static menu *uplevel = NULL; static void showadc(menu *m); static void htr1(menu *m); static void htr2(menu *m); +static void savesettings(menu *m); static void testx(const char *text){ USB_sendstr(text); @@ -55,29 +65,28 @@ static void stest1(menu _U_ *m){testx("sub 1");} static void stest2(menu _U_ *m){testx("sub 2");} static void stest3(menu _U_ *m){testx("sub 3");} static void stest4(menu _U_ *m){testx("sub 4");} -static void stest5(menu _U_ *m){testx("sub 5");} -static menuitem submenu1items[] = { +static menuitem settingsmenuitems[] = { {"test 1", NULL, stest1}, {"test 2", NULL, stest2}, {"test 3", NULL, stest3}, {"test 4", NULL, stest4}, - {"test 5", NULL, stest5}, + {"Save", NULL, savesettings}, }; -static menu submenu1 = { +static menu settingsmenu = { .parent = &mainmenu, .nitems = 5, .selected = 0, - .items = submenu1items + .items = settingsmenuitems }; static menuitem mainmenuitems[] = { {"ADC raw data", NULL, showadc}, {"Heater1 power", NULL, htr1}, {"Heater2 power", NULL, htr2}, - {"Submenu1", &submenu1, NULL}, + {"Settings", &settingsmenu, NULL}, {"Test3", NULL, test3}, {"Test4", NULL, test4}, }; @@ -89,8 +98,8 @@ menu mainmenu = { .items = mainmenuitems }; -static void refresh_adcwin(uint8_t evtmask){ - if(evtmask & BTN_ESC_MASK || evtmask & BTN_SEL_MASK){ // switch to menu +static void refresh_adcwin(btnevtmask evtmask){ + if(BTN_PRESS(evtmask, BTN_ESC_MASK | BTN_SEL_MASK)){ // switch to menu init_menu(uplevel); return; } @@ -127,20 +136,28 @@ static void showadc(menu *m){ } // window of uint32_t setter -static void refresh_u32setter(uint8_t evtmask){ +static void refresh_i32setter(btnevtmask evtmask){ int selected = 0; - if(evtmask & BTN_ESC_MASK){ // return to main menu + if(BTN_PRESS(evtmask, BTN_ESC_MASK)){ // return to main menu init_menu(uplevel); return; } cls(); - if(evtmask & BTN_SEL_MASK){ // change value - *u32parameter.val = u32parameter.cur; + int incrdecr = 0; + if(BTN_PRESS(evtmask, BTN_SEL_MASK)){ // change value + *i32parameter.val = i32parameter.cur; selected = 1; - } else if(evtmask & BTN_LEFT_MASK){ // decrement - if(u32parameter.cur > u32parameter.min) --u32parameter.cur; - } else if(evtmask & BTN_RIGHT_MASK){ // increment - if(u32parameter.cur < u32parameter.max) ++u32parameter.cur; + } else if(BTN_PRESSHOLD(evtmask, BTN_LEFT_MASK)){ // decrement + if(BTN_HOLD(evtmask, BTN_LEFT_MASK)) incrdecr = -3; + else incrdecr = -1; + } else if(BTN_PRESSHOLD(evtmask, BTN_RIGHT_MASK)){ // increment + if(BTN_HOLD(evtmask, BTN_RIGHT_MASK)) incrdecr = 3; + else incrdecr = 1; + } + if(incrdecr){ + i32parameter.cur += incrdecr; + if(i32parameter.cur < i32parameter.min) i32parameter.cur = i32parameter.min; + if(i32parameter.cur > i32parameter.max) i32parameter.cur = i32parameter.max; } setFGcolor(COLOR_CHOCOLATE); SetFontScale(2); @@ -150,18 +167,62 @@ static void refresh_u32setter(uint8_t evtmask){ Y += fontheight + fontheight/2; if(selected) setFGcolor(COLOR_GREEN); else setFGcolor(COLOR_BLUE); - CenterStringAt(Y, u2str(u32parameter.cur)); + CenterStringAt(Y, u2str(i32parameter.cur)); } // init pwm setter static void showpwm(menu *m, int nccr){ - u32parameter.max = 100; - u32parameter.min = 0; - u32parameter.cur = (nccr == 3) ? TIM3->CCR3 : TIM3->CCR4; - u32parameter.val = (nccr == 3) ? (uint32_t*) &TIM3->CCR3 : (uint32_t*) &TIM3->CCR4; + i32parameter.max = PWM_CCR_MAX; + i32parameter.min = 0; + i32parameter.cur = (nccr == 3) ? TIM3->CCR3 : TIM3->CCR4; + i32parameter.val = (nccr == 3) ? (int32_t*) &TIM3->CCR3 : (int32_t*) &TIM3->CCR4; parname = m->items[m->selected].text; uplevel = m; - init_window(refresh_u32setter); + init_window(refresh_i32setter); } static void htr1(menu *m){showpwm(m, 3);} static void htr2(menu *m){showpwm(m, 4);} + + +static void refresh_yesno(btnevtmask evtmask){ + if(BTN_PRESS(evtmask, BTN_ESC_MASK)){ // return to main menu + init_menu(uplevel); + return; + } + cls(); + const char *msgs[] = {"No", "Yes"}; + static int current = 0; // current item: "NO" + int selected = 0; // not selected + if(BTN_PRESS(evtmask, BTN_SEL_MASK)){ // change value + selected = 1; + } else if(BTN_PRESS(evtmask, BTN_LEFT_MASK | BTN_RIGHT_MASK)){ + current = !current; + } + setFGcolor(COLOR_CHOCOLATE); + SetFontScale(2); + int Y = fontheight + fontheight/2; + CenterStringAt(Y, parname); + SetFontScale(3); + Y += fontheight + fontheight/2; + if(selected) setFGcolor(COLOR_GREEN); + else setFGcolor(COLOR_BLUE); + CenterStringAt(Y, msgs[current]); + if(selected && current == 1) yesfunction(); +} + +static void savesdummy(){ + USB_sendstr("Settings saved\n"); +} +// save current settings +static void savesettings(menu *m){ + yesfunction = savesdummy; + uplevel = m; + const char *p = m->items[m->selected].text; + int l = strlen(p); + if(l > PARNMBUFSZ-1) l = PARNMBUFSZ-1; + strncpy(parnmbuff, p, l); + parnmbuff[l] = '?'; + parnmbuff[l+1] = 0; + parname = parnmbuff; + init_window(refresh_yesno); +} diff --git a/F3:F303/NitrogenFlooding/menu.h b/F3:F303/NitrogenFlooding/menu.h index 6596fde..b9cc208 100644 --- a/F3:F303/NitrogenFlooding/menu.h +++ b/F3:F303/NitrogenFlooding/menu.h @@ -18,6 +18,8 @@ #pragma once +#include "hardware.h" + #include struct _menu_; @@ -37,4 +39,4 @@ typedef struct _menu_{ extern menu mainmenu; // subwindow handler -typedef void (*window_handler)(uint8_t evtmask); +typedef void (*window_handler)(btnevtmask evtmask); diff --git a/F3:F303/NitrogenFlooding/nitrogen.bin b/F3:F303/NitrogenFlooding/nitrogen.bin index c64dc54178e040da7e8a93766ac0685cd0993066..890f77a1c155b22bd9f2deba9660d938e28a2706 100755 GIT binary patch delta 8761 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 delta 8412 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 _Y;mgY4Dr~w;0`Pqt-M|hkK}aA?ueQs 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 diff --git a/F3:F303/NitrogenFlooding/proto.c b/F3:F303/NitrogenFlooding/proto.c index 9b8532d..298e27d 100644 --- a/F3:F303/NitrogenFlooding/proto.c +++ b/F3:F303/NitrogenFlooding/proto.c @@ -161,9 +161,9 @@ static int adcon(const char *cmd, int _U_ parno, const char *c, int32_t i){ static int adcval(const char *cmd, int parno, const char _U_ *c, int32_t i){ if(parno >= NUMBER_OF_ADC_CHANNELS) return RET_WRONGPARNO; if(parno < 0){ // all channels - for(i = 0; i < NUMBER_OF_ADC_CHANNELS; ++i) sendkey(cmd, i, getADCval(i)); + for(i = 0; i < NUMBER_OF_ADC_CHANNELS; ++i) sendkey(cmd, i, ADCvals[i]); }else - sendkey(cmd, parno, getADCval(parno)); + sendkey(cmd, parno, ADCvals[i]); return RET_GOOD; } static int adcvoltage(const char *cmd, int parno, const char _U_ *c, int32_t i){ diff --git a/F3:F303/NitrogenFlooding/spi.c b/F3:F303/NitrogenFlooding/spi.c index 0d13b16..9007842 100644 --- a/F3:F303/NitrogenFlooding/spi.c +++ b/F3:F303/NitrogenFlooding/spi.c @@ -133,7 +133,7 @@ int spi_read(uint8_t *data, uint32_t n){ SPIDR = 0; WAITX(!(SPI2->SR & SPI_SR_RXNE)); data[x] = SPIDR; - USB_sendstr("rd got "); USB_sendstr(uhex2str(data[x])); + //USB_sendstr("rd got "); USB_sendstr(uhex2str(data[x])); newline(); } return 1; diff --git a/F3:F303/NitrogenFlooding/version.inc b/F3:F303/NitrogenFlooding/version.inc index fdeef24..4949b60 100644 --- a/F3:F303/NitrogenFlooding/version.inc +++ b/F3:F303/NitrogenFlooding/version.inc @@ -1,2 +1,2 @@ -#define BUILD_NUMBER "280" +#define BUILD_NUMBER "294" #define BUILD_DATE "2023-05-14"