From 9ca804ec3d7f8a334df3881449d615e09f39731c Mon Sep 17 00:00:00 2001 From: devfix Date: Thu, 9 May 2019 13:57:57 +0200 Subject: [PATCH] ui refactored --- driver/Makefile | 2 +- driver/cli | Bin 131784 -> 131880 bytes driver/cli.cpp | 279 +---------------------------------------------- driver/main | Bin 66904 -> 0 bytes driver/ui/ui.cpp | 278 ++++++++++++++++++++++++++++++++++++++++++++++ driver/ui/ui.h | 38 +++++++ 6 files changed, 319 insertions(+), 278 deletions(-) delete mode 100755 driver/main create mode 100644 driver/ui/ui.cpp create mode 100644 driver/ui/ui.h diff --git a/driver/Makefile b/driver/Makefile index b34ad06..52cf0c3 100644 --- a/driver/Makefile +++ b/driver/Makefile @@ -14,7 +14,7 @@ OBJ_CLI = cli.o CFLAGS = -std=c++14 -O3 -Wall -Wextra LDFLAGS = -lcurses -lpthread OBJECTS_DRV = drv/usart.o drv/b15f.o drv/plottyfile.o drv/dot.o -OBJECTS_UI = ui/view.o ui/view_selection.o ui/view_promt.o ui/view_info.o ui/view_monitor.o +OBJECTS_UI = ui/view.o ui/view_selection.o ui/view_promt.o ui/view_info.o ui/view_monitor.o ui/ui.o COMPILE = $(COMPILER_PATH) $(CFLAGS) diff --git a/driver/cli b/driver/cli index 3730bca898d6eff5c865a89e42270dfe04e8c4b7..df76089b860220faad24d79449a4fb2eadba0843 100755 GIT binary patch delta 42381 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 I?+5&!@I delta 42288 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 #include #include +#include "drv/b15f.h" +#include "ui/ui.h" #include "ui/view_selection.h" #include "ui/view_info.h" #include "ui/view_monitor.h" #include "ui/view_promt.h" -#include "drv/b15f.h" // global error message std::string ERR_MSG; -std::vector win_stack; - volatile int win_changed_cooldown = 0; volatile bool t_refresh_active = false; -std::thread t_refresh; - -void cleanup() -{ - if(t_refresh.joinable()) - t_refresh.join(); - clrtoeol(); - refresh(); - endwin(); -} void signal_handler(int signal) { @@ -115,270 +104,6 @@ void init() View::setWinContext(newwin(25, 85, 0, 0)); } -void finish(int) -{ - cleanup(); - exit(EXIT_SUCCESS); -} - -void view_back(int) -{ - if(win_stack.size()) - { - delete win_stack.back(); - win_stack.pop_back(); - } - if(win_stack.size()) - win_stack.back()->repaint(); -} - -void input(int) -{ - call_t nextCall; - int key; - do - { - key = wgetch(View::getWinContext()); - win_stack.back()->repaint(); - nextCall = win_stack.back()->keypress(key); - - if(key == -1) - view_back(key); - - if(nextCall) - nextCall(key); - } - while(win_stack.size()); -} - -void show_info(int) -{ - ViewInfo* view = new ViewInfo(); - view->setTitle("Info"); - view->setText("Informationen zu Board 15 Famulus Edition\nEs war einmal..."); - view->setLabelClose("[ Zurueck ]"); - view->repaint(); - - win_stack.push_back(view); - input(0); -} - -void show_monitor(int) -{ - ViewMonitor* view = new ViewMonitor(); - view->setTitle("Monitor"); - view->setText("\nErfasse Messwerte..."); - view->setLabelClose("[ Zurueck ]"); - view->repaint(); - - win_stack.push_back(view); - input(0); -} - -void show_invalid_port_input(int) -{ - ViewInfo* view = new ViewInfo(); - view->setTitle("Falsche Eingabe"); - view->setText("Bitte geben Sie einen Wert aus dem Intervall [0, FF] an."); - view->setLabelClose("[ Schliessen ]"); - view->repaint(); - - win_stack.push_back(view); - input(0); -} - -void show_invalid_dac_input(int) -{ - ViewInfo* view = new ViewInfo(); - view->setTitle("Falsche Eingabe"); - view->setText("Bitte geben Sie einen Wert aus dem Intervall [0, 1023] an."); - view->setLabelClose("[ Schliessen ]"); - view->repaint(); - - win_stack.push_back(view); - input(0); -} - -void write_digital_output0(int) -{ - try - { - int d = std::stoi(static_cast(win_stack.back())->getInput(), 0, 16); - if(d > 255 || 0 > d) - throw std::invalid_argument("bad value"); - uint8_t port = static_cast(d); - - B15F& drv = B15F::getInstance(); - drv.digitalWrite0(port); - view_back(0); - } - catch(std::invalid_argument& ex) - { - show_invalid_port_input(0); - } -} - -void write_digital_output1(int) -{ - try - { - int d = std::stoi(static_cast(win_stack.back())->getInput(), 0, 16); - if(d > 255 || 0 > d) - throw std::invalid_argument("bad value"); - uint8_t port = static_cast(d); - - B15F& drv = B15F::getInstance(); - drv.digitalWrite1(port); - view_back(0); - } - catch(std::invalid_argument& ex) - { - show_invalid_port_input(0); - } -} - -void write_analog_output0(int) -{ - try - { - uint16_t port = std::stoi(static_cast(win_stack.back())->getInput()); - if(port > 1023) - throw std::invalid_argument("bad value"); - - B15F& drv = B15F::getInstance(); - drv.analogWrite0(port); - view_back(0); - } - catch(std::invalid_argument& ex) - { - show_invalid_dac_input(0); - } -} - -void write_analog_output1(int) -{ - try - { - uint16_t port = std::stoi(static_cast(win_stack.back())->getInput()); - if(port > 1023) - throw std::invalid_argument("bad value"); - - B15F& drv = B15F::getInstance(); - drv.analogWrite1(port); - view_back(0); - } - catch(std::invalid_argument& ex) - { - show_invalid_dac_input(0); - } -} - -void show_digital_output0(int) -{ - ViewPromt* view = new ViewPromt(); - view->setTitle("Digitale Ausgabe BE0"); - view->setMessage("\nAusgabe Port-Wert (hex): 0x"); - view->setCancel("[ Zurueck ]", true); - view->setConfirm("[ OK ]", &write_digital_output0); - view->repaint(); - - win_stack.push_back(view); - input(0); -} - -void show_digital_output1(int) -{ - ViewPromt* view = new ViewPromt(); - view->setTitle("Digitale Ausgabe BE1"); - view->setMessage("\nAusgabe Port-Wert (hex): 0x"); - view->setCancel("[ Zurueck ]", true); - view->setConfirm("[ OK ]", &write_digital_output1); - view->repaint(); - - win_stack.push_back(view); - input(0); -} - -void show_analog_output0(int) -{ - ViewPromt* view = new ViewPromt(); - view->setTitle("Analoge Ausgabe AA0"); - view->setMessage("\nAusgabe 10-Bit-Wert (0...1023): "); - view->setCancel("[ Zurueck ]", true); - view->setConfirm("[ OK ]", &write_analog_output0); - view->repaint(); - - win_stack.push_back(view); - input(0); -} - -void show_analog_output1(int) -{ - ViewPromt* view = new ViewPromt(); - view->setTitle("Analoge Ausgabe AA1"); - view->setMessage("\nAusgabe 10-Bit-Wert (0...1023): "); - view->setCancel("[ Zurueck ]", true); - view->setConfirm("[ OK ]", &write_analog_output1); - view->repaint(); - - win_stack.push_back(view); - input(0); -} - - -void stop_selftest(int) -{ - B15F& drv = B15F::getInstance(); - drv.discard(); -} - -void start_selftest(int) -{ - B15F& drv = B15F::getInstance(); - drv.activateSelfTestMode(); - - ViewInfo* view = new ViewInfo(); - view->setTitle("Selbsttest aktiv"); - view->setText("Das B15 befindet sich jetzt im Selbsttestmodus.\n \nSelbsttest:\nZu Beginn geht der Reihe nach jede LED von BA0 bis BA1 an.\nDanach leuchten die LEDs an AA0 und AA1 kurz auf.\nZum Schluss spiegelt in einer Endlosschleife:\n* BA0 Port BE0\n* BA1 die DIP-Schalter S7\n* AA0 ADC0\n* AA1 ADC1"); - view->setLabelClose("[ Selbsttest Beenden ]"); - view->setCall(&stop_selftest); - view->repaint(); - - win_stack.push_back(view); - input(0); -} - -void show_selftest(int) -{ - ViewInfo* view = new ViewInfo(); - view->setTitle("Selbsttest"); - view->setText("Bitte entfernen Sie jetzt alle Draehte von den Anschlussklemmen und bestaetigen\nmit Enter."); - view->setLabelClose("[ Weiter ]"); - view->setCall(&start_selftest); - view->repaint(); - - win_stack.push_back(view); - input(0); -} - -void show_main(int) -{ - ViewSelection* view = new ViewSelection(); - view->setTitle("B15F - Command Line Interface"); - view->addChoice("[ Monitor - Eingaben beobachten ]", &show_monitor); - view->addChoice("[ Digitale Ausgabe BE0 ]", &show_digital_output0); - view->addChoice("[ Digitale Ausgabe BE1 ]", &show_digital_output1); - view->addChoice("[ Analoge Ausgabe AA0 ]", &show_analog_output0); - view->addChoice("[ Analoge Ausgabe AA1 ]", &show_analog_output1); - view->addChoice("[ Selbsttest des B15 ]", &show_selftest); - view->addChoice("[ Informationen ]", &show_info); - view->addChoice("", nullptr); - view->addChoice("[ Beenden ]", &finish); - view->repaint(); - - win_stack.push_back(view); - input(0); -} int main() { diff --git a/driver/main b/driver/main deleted file mode 100755 index dbfb611d5392b48a16033a82a1a01f0696c3155e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66904 zcmeEveSA|z*8feKlt7_3B4~XjYS30*Y=LSkc5P@2Hxjf$Q52z+Hl>x));5JIz7*47 zuOW(xiZ8peKI-DzF6#?a6l^K9h;M*z_)0~T8wyfUp({#$-!pS>a#I@DeLm0r_lqAo zcg~zS=ggTi=bV|jiFf3=CK?R}LHooBe-fzHeIbWrs|_oEQy)-d3mHOx{2eBoEySa4 zVldvG%?q^hPmfAkD=jKK4kh)=Fmgce@=O&^D>VtJG^=fW6>q)Dp;{>jHU^-6B&)TV zRZ-g5gH~Ep!5RkecC8`l5pvh z|E;Hlo-L2F>Ir29DGnd4)cReGekA7~{a97RsVcu%dg<=R5w%jAhl?u8=UzPSqKcAH z73Gz6^`q)DE*^F9xY4y$qsOpu6Me#+bmeqLfW%f+!PX z7;DU z7#9VZzU)DXA^)>6_+A3~C-q(ws2_?U&xRQC{3!gA^XrU3 z|MnR4N5+t!Y|Vy$y*~vp@E68dUsFM#uld~_1OAs7`ad(*Q1M?< z>CaK+*XaBc@}Dat3dq=oVTE=var@uRO2Zu6bi4ua#~ep z;grJi%361g$61n>H+5Q70dMf6jjgGx^pr1f6Zxu|oV2|B$;GUXC!@Tows3Ayt$Uoa zvfPuKmbZ|@FDWc6uCGr^OB;j6@?tQmDX*O8ES}~`ODirbswwn9U{9^HIB!}J{^Sww z1$CYxk2`O{0#IMTMN0R$D=MlrqG@9}vC{Gi_uRVDzNqD;7gto(x>=6`CvmGOs+^|^ z4w?nm0G1w>$z8M{79mnmeSKlIyQa3PvZ$imb93QBOcfLbef)bl##L3jD@jj;Ug(6D zt^!~|RSBk)ls&e(&XY$q{!~VFoaOqQbeb>B>S_V{sWUr+G+bn10ow!U}igJWm<7C~i)q ziGL%NO0}qhSvaOu#}%SpTv!M(u_P8~hTMn2!Lq|MsA4+{3JX#T^QK)~m_K>i*g_iA zG|xD9Wl2S!y7@fOv}@eVK)B-JZ77@|Vvv)E_lgJ} zWwRX2`fI(JBmIL@1j7!SPYz!d7;&a%s})uAAOQ<@+%-ix)QplU?oXNj2B}{0Q73Y= zZNWyTPX1r4DOKrz#IX4?V0tO7aYsAI{{?57w_^BHgypGh-N7vuSJip=Wc{Zm%&efc zwtQYC^e}Clns%g@R@Bv&X{%Sa^0XCQRZ*K)P6^Bcp1agk)m4^IeO@sV3xcHyh0`k+ z!C@9ob=TG{a8qM3N3KQuM}map1?GkjRy@D3xNLr5X;FEFP)#vfD4pl_)CySAh)7y| z@wn^DJxHr+-3WS~8ew5=Wi=8QPpPoLy`Z@IW}&>Q*i#|Y-VEQnK&WOphfv2eEl)8U z5PE|!>&@*P4jpO4EpDN>6l80w-R=^wBT3aXYyqWklX7wj$08@3%PRryiS~X3`nK8pL!C9C#dhF=vwoF}9RHrd%`YI)?Mw}`dal%NY z37dE-%{amBhZ;fS@z2bjEqJ1O9L}<-2etB^^fZ9g5&*Rb0~s9?aEacaFqR2@i5}ro z3(>XUZ#;u?Yyr8qnaRMZlZ+%`U;h~xlrZS*)F4d69)|W6HvG#!|Kqe2^d{2x(|1nk(*m2s`Qi!g#gL``xZ;#Wp z_Y>;Wb`(N+&%@YJ3=$@)^om%0pfFvn-@M}=kbi(sqSoa*Qh;v}Zc^(X{9`_LF!912 zYW*hG-z?m%);%frV`pL%9zmTx;d6Ul6}m_8ha`1h1Z4iXkQcUI@KhC^+zUQOg{Ss{ zx2W)pUhp+4U#S;-tF~Y41-H_HH9j+X!K+pHoL=zm8#sP-FLQ^)?P)(+j>v#ow;d)8@tY2*+1?!LwDkpx(2D z@gL*(7Ij~$!L_~D7rxJ5@tkFU)q(YXl!wEey|553`< z{(8e#ziDIqvG}l>BcC-oINgnCpJpB0rU6m5=-}t;;9GTYrw+bd2hZ2Rcj@3)>)@R_ zIGqJ)A4LZ*(10krb#Q*;!yBzFHugYz$mJmRw?(xREP8g2qcwHv;Ht^8Chc5<@Mmkt zD7Etog3r;xwR0ST(_NAF(av!QPIjVwv~w1Mt4oeGY3Dlx*V}`3jze&|8`3`7xe39G zG$2atJc!`e>ELrV*jNq6G|b;>O=UVb9A)@Zt%GZ4In-FMgX3r_{Atj^iMRG?(!t3V zwa;=LoMh5ID|K*f?NQq*9US2%{8_Do4+ukXSEqv`AcQ~7I{3ga6n3tIBY=fJTXk?T z3>Ad!I=Hq*sd<+Uu0N0O)WP-Vf{G4)vW|YY4n9-|@6o|e(ZPj{HdZ5Do~naeba2gA zQL|MCKTU_9q=TQXgWGiQGj#A|9sEokJXHrjO9#);!Ozygvvu%cI=G~RpQD54>)_|= z;4^ga^K|ezI=Ed2FVn$?>)_Qo_ysz6y$+tNgE#2lDLQzQ4z7lF*1B8=S3^64uhhXu z>gcS}!Rd@z`>fW%M{7WoYjp5b9lTiwPt(C$bnr1c_*NZ!tPZ|i2Op<{@6y53b?{Cd z{9+wk(ZMg#!Mk~~j2hY^O1vM^^{a>nsTXgX8I=EE_zf1>D(!sNIaGMVPCmlRl z2fthgPu0P*b?^)w+@XVK>);b~a7hQx(ZTa|@H`!Sh7LYa2cM&ZPtw85bZ|)ruhzk@ z(823<@X0!OgAVS}!JBmODLVLa9sEiie5DS4l@7j22cM>cOWp$($#1TE%qB>_7LPHs zUGi?WvHPU%8$JF9P_I)%Vs3#)IUI)%RA z8dhIVbqaaGRjmFJ)hW~km$UkFRHqOZY+&^#sZQn?tY-B`sZJp+IEU5mr#gkQU_Ptg zO?3)k!E9E)lj;<@f~l;23)LxP1#PTeLv;#OK`X1@NOel}f r8J*BC)vSIx)hPr8=dk)cgns{Tq${GpgID-pT4asZJp!xSiFvQJq3bu!Yq(QJq3a za1E=kr#gj>;3`&siRu(Gg3DR`IjWye^#)ddlIj#Xg4L}4DAg%s1n02&{Zyw=5zJ@x zyQxkgBACtUcT$}~Lok)qZ=pJcgrJSpYp714AZTUv8>vnqASkfJz9=E>I0}wt~;2`>PD)Q%MPZp`Y#WmPOds=WA(#S zCl?*Gvig3i|B31XtM8#Yx#VE?F*g5H&!&1OtM8;bx!~Y-R^LW-a=pP8R^LQ*a=F1Z ztiGP=xl~`p>Mv29TyJnWt3O9|a=F05E1I9oOhK*@Ejme+&>4T^ThVExY`bgHg z*%CBjY^BSAe};y?isL`a@z-;F(g?Zw;7(|h;h&@7S9AQEIsV-oKMt+RGr$GQMI5x1 zNCdLZA;ol<+fkzrBYGPV)hUqhHZhKv6IySO|1?hjLQd={O`Zu%p0tBbdB*2wtrc97qJU z`RPrsA?p!Xl~8w)W*t2*Eps-pp2&*z7K__NlOl_MgS_2{HEdL7$rGxYg&uainuSyz6_u^1G)B8 z={2d~+R3A&Yh8}lisn*VU=7-&K%nI)3fZ?x#mq0wlU??VQt?oWWBn9Ts_bha%;r#B zD2~nb|TZ^+lqn~6c961M1>*lB*YG1Ckk499lpJIB6kDK z87d~dg4*s=2nD1BK+z6}g`R*{ui_;G4+yp}LNY_>@MVV~k_wp$}xhhR^xb40V7|o+I`WW-z2+gpRlfqJJ`f8?8l*&0n`Vh6HFS4&6 z357P2PX{R_5f~dO7of^XRB6WaQe_BLhNvy45}`nPkDH3DOhlvgb~GuwK?{y1nZi?G z=s7G(Wh;{Zabq`{CEw>_V=KnlusA~y8&mKkZmi7#g`@YvwM_j9o#hVY?w@&iCrVe~ z)fO0@E3n~u7*B^U7k^2jytIR=-@)XO!|=aKO%#8gPlv#MW~XJiFA*GsFWhLjQAm61 zMhxXJkAOoihCtrUwzSW=pOXAOW}o7^A!p~xL6;m7*Nsa`IV`T*sq_>>(si%i01o0h zA4x)LZ~e|H_3s9JHgRtK&L;J5SF#F-Y@1P9atxObLfvYpX&6`2U<`6S3!cpwnV*e? zTo#T09-A%GhzKYj-hg)h21YEr@C(7g8JJ{^kax+5 zPhrx$ucLiZk_YChu~8{2R~Lmzy5xUJ-d4Di_u)?ZlidCd960Y)x2@~lu036yU0-#5(e)Xyx;8531HZ5M{wj@$;`_=z;``S~ zieWCr8j$r_YD-@!x5b6EHIIR`;{!VZ&c%H3+XK!+FkNd5al6#DVvT+tnVGw zm(o0{5g(oS>@M9(ii|}1c3*TX*8=!bh2w1ndo^6)Nf*jNkz3eOvb;!OKQWR6vz}Sj zQZimGuKyng@{SlmTzTtij5okyw4=Fq^wh#Kty=jQ)+%{LNj}ciOmSUFp}bj*@$#;S zZQayOX2-((n-t~M2t>Ln)q?WTzJvS`5~&Z8XGchGBuODfsr;%gZ-DwRmZ*ebTMSw| zp>b8b*P=o_g6Pp`8m02&zT#(g49YZ@DrGg=L&`rM?fb_ddrpLGIN&2K=_Tv$1^oB( z`&MfQ=2VUON0rloq{jTC%2`wy39W*UVx!7wT#QZp5DzguuGh+Tj2YGo9N;TL!Hjo(0p;vMkx$^hquHM7B z2X+xGC(y-sitcKhN0fKTdw7gb9SvDojPE*4+wbUtv)FhqSx+SJpGhIVH1qJn&*UFU zcLc?CZY`^J+Si|u zCp<`bf-ZVX+;cc()ob+16JDSMNsCQ7=P?eFu~Z?P-0enS{fb1_QU&I0d01}eaMcM%5{18Wxa!84!)KYrLmZyLoi+;?41PO@Cvo^{ zGA9Nv<#3)Q@TkP#S8_N-FegGAN6zHHRRr|5BS$z2$?Y82K*M1x%{$^zx?Zx^AT;HnXu|X7nXFaU&nrc`CD+V8-3u)$qss=~Q(5HMgxnX9v>zGYd zncWR$;d#2vj(O51Et}>C^VEcaVpy$9_^?u9bE0o`@?p7joRn|*uxxx-E3ReaYCw(; zD@i}B#TT*G0%C@FdINJ9V_5z$vr~1<7OTu&rr`zBM{#CmVn&v(JWoRS%|A8RFs7jg zsbKN*1$EC1yB-rJd;}qp3;?5V1EzAeO8gq8yFF~fOTmyfyJ<&wNQA~*fn|1^1~e!-Q#+<@?`Eg1)4Hm$oB3C_S~8WPH5`d;pI`$YmV9i^CNv zSY-2Xcr%A@4a0BX@Rc0CItTdh(a+Z+$BFmI#9jWD z?oYl~5<%S8BKqjt(c;>if&N+(Y^_wRGOxh)qdnJtsvxGA>`l4$QmSAZEq%{qmlv2a240#zFR%( zdFFIH28O6Ei)_pfT4{nOV)- zqw@e-PV_M|oP&eSd0jMzcRHC`UW`b7Dd#Yab1%kgjEG+ z<>Ra_R#|;aroty?yvpiFfSA6pc-XO|_dt?=QUM-!9u}>G8uPKskZ?TdpOk-CJjrFZ zP;EO7D_gPo*hHn0&$-)(dm!uFTM*)K%!JL!NhZ6}20s4Ud^Ge&gR+9-#sPPIKOix) z*`oZJV~waSpy5|>r0=jnUQcgCs7Un;iD69P7<84l9#K-WzH5L1sUan74-Y0ggltuw z;O6usZMfw&t%H&bY{?&|#@)DXqT@U0xr#Ce&)F>A!h&D=5?J2NNf2V@tl-|S_{@-) zJtPG8=YReM$&2n}&I9A;v8wBJr5kv355{(8m`M3Im`#%Za#x_lJ}|qY>iF*bv*4g>2YaZvrNNr6luV9Uw#uiz9U?S2MBLuw4EZ z*s!Khn*0oiIM~=GIJCii^aUA2hcXDmdUMrMgP^pbxBoW2izKmfxLC|pB~gappu0bu z6JY%4<&h9JeHx!erpQtmI+OzVqpZMyygf#?J|M2@S-+xT2GR>7%w3$h zn=?N}WxkeF$JfUhD&G$P!up`QOs9ODrZG?6GJTr3Zoee|m@BURn&uMMkOLJbgwBKg zl=xAT3|~6s4sq?LU87i>QbwTFm4aK|R;l^@qtm{5`Z1(qM}t!9zb={}awJC?;Kx4w<{;O?8{e`sD3g_jD{w`cK>0rIhOQLGtCv?IfR5{#ljpm_vSt z#8du`!Q}Z6s&efXv5^9Ap1Af`r{Q2%ntGq2_-VW&(Ehs;e!TEv|9F@Diwgp#d=5() z4|OT;Lsa;rOC93c&6!Hw%Or4=xY?9_Cdo<^umNHS%^`fc-s3iM2`FNk%BH{~xQ#r0 zG8xCvjf1I3ud22&8xg@zohA=;fq9GsNUsn7BvYHdF0P$4uuZ2gc~NwGcGIG$cJ1z( zFV`gpwnA3j#dV{-831f#3t(9dw++PJ(+hwTwiCF)KFs;X=i}CXa_3iP`Os7|JDyeU#0;njTk~%$h8@z)PcN5k$99ivy&E7VUEFo3u$hF%L zCj{jFlmR`7*>DBs!~Yf7vn9FODxQR`3VKq9R6@&WHyJTK z=7tIzuHZZX`YY@il8obs9E(ey50ipjxsab36i@#tz9V8|9LeteO_bycd$M>}GJH6y z2GK`59hgykQ%;gghPLKg+fB)6TWl3_<;BUK6v=<9Jr#Emc($}>TUkTBB;zVQ+XAqF`wITK zL(0sx*Nct2Si+s21g0z;&>3ROCp1ql*q2j>z;qB@!JlO>Cr%jx!TBwam`DzrwnSjkgg4UyI~ljG3N>DXWDXlas{8 zYR0*dbC%!W-8vdsHxLur(a*aD9N*w5nTK$UHES0c6sgeLftjMqt}9efJ`TG8Ix04% z9fzwQ3vloPJR$UA#>GYpJ%@(Sq&=9Da91i=Hpp@w-)mI8|{X*-pPpHXW8 z>N3VBPfO~;`df^r@0A4Bk&7L4VG_dPz;keknitnri3<1dU#MC(!@5879SzZadu9^zzd7x&jsUAzj&sQ{vjT@wxUP; zS`gGcWF!a73#{m~ikMZJi1?vP+~fvj~^$c-q~ zl#ys&4;}gk+5uh#u>79Vp9~HTnV%TqZ3J^SP}$oEZFI82-bSF`&tq>RU=Fu_Kpi?1 z;UgTaVI_F%NfDpxTfuzP=473(#YnaDds0tnZf2*r^hvCj#?J#eA+hmA@XHm~RoD~7 zwJm9%yW&RLrvysO2IvJdFO64!pd<5;+!3*EQu z=#e*h58t;M&71xg)i&>stS^z0+jblyK8+MPc651vl%`~UEBa_xN0w}45{0?{H>8O* z6904y8=LnRgJ+`mmy+B2b>uNOisa&A^*Hd5@=x4dvzI%9*I{L-`Ach$5u<>a`kn+Z zI2MCpdDq6{H0K!BV)ROD37*foWK*z6n8=K%W&w;y1eTKYAvEAO7Xg5r<9aH3UuoS9 zJTe^5wdyM@EEXz#Tk z1zr{IH?dbgPXO+S_i4Zgm4|?-IPgc!PY?6_FNCaxrz{dOV@duvZKrNkYq?8v_5@LA za@i+{>y8{ENRQNC*wjVkz#&+z+v#V8l{yinUIQGS+)?E6v8YcAu$@Lp2X&< z;a2+uBvCKKV@}}ErL-3A*Txv-R__nYcEN#`!GEbLx9<4YkyfmVsaWUoR>`}`utV{7 zOVaoPi0Jc>L9K<5$1RSgI|hkfpBZ1lJJN0veUCwM%CL{pJC{(Ncb`#QdkQ_~ zH=V+psgmkw%DrR|M6NrlV-gmS(KQvy|k z0yE;2-OS#QQ-O>X`P?_?*H{lx;5c$IbGEJ#%IkzP;`j6U%mTZWwj7sB@@JIMU;92b zs{YHJayydxUsUeLK{qe+r@9w2E9|+s7=lgoodg)k{4sDGI2j0>*`QnjhKA2^Mh@Hf zieC9jp~L}!pwhWP+wgRyX#P?;1L&@lPL>ZJ)a`;YKMBsJpf=C-bF?4CH+r~g~x*9 zNJ`aZJqwsh^SgXmcfW@mpZL+zK#rPEYZoW!v;_#C<%zyx5IQj*kN77tDbn93w-DmS>Kxjf zKl2W-5h1?z^pyZ*!@WAsKSg zA7#CVR~GX_ikBFr?Be@0on0a?S$MiO36x;22O=5eyX^ZO^d=r| z*Xhbi^i4*Pd6PC8v>B{c=8)F>>5r7!02nkASD#oVd1)fK$J#))6W#)(ZvYO~ zB*iWI!Ar2C8%+fqg9o8SmOt#Korz7U#h_S_$vTa$ulN}h?c~@iVm)HxFA#=B4Yt9f z_rw%}1kx`gCV{LPh{dm@k{Bs-5tDQ1^;Gm;ER8S*7XJ#h_y;WI-fhI9L+OB`gQtNy z-p{A~J2r{R2W;@PT?}L`qANZwA@&PXakBr5*!UE!Cb=WDlSF$M6*doKZ7W$<#Luih zMLN=pZ#^C#8xi%WXOSL~-eAX>Kil%1ECp`2NZx%tl6;B_hcU^y@;1ruIvI7>DLoRs zDu0+>>P`7L*RZX1f1JGIN9pO{Y^1rw^<0hX(5<-ViH_QPSZ=LG;Ezy2M)4i;r40~5 zKjW385P$mLN}$5Ppz;|^KT&G_521CGr2J-|_CoSdsV<42e*>c)yTS!{D9kUi7p zD)Pd^LB??CM8+`vqC#xMVKDp9UCS$=8t4a`9seovskCMCyH5F4cAffb(2W7GJrtpc z>s+TCXL>A!vW^EOH1fllN8bY1K>FL`Nji3bXMr)mtDeKx_0HKgH0)MtNM>xY!2c8K z0vo=UgQ#`03c6JV>4))-az2KEEu6NM#E9ucg$+6ZO)mLh*SpHqcv2q6A1;@X%T*ka zi*~HRVw#a;tU=}LtxWJoFAWQR6(LLj0{g;3uqceWmZLr#LA4X=sf0S7{t#*~m;RiF zKap^>T=Gw{=x*3ftOv}QGj06ZP3|Z8@4$gVP7=S`N@Y6PJu~<>OsqCv0dra`d_lus z6ovok^)cvgr%^%o64?#D{X<%r8Qc$OWB@q6X^qu?x!T{N_D^N~pNs0xzv+Rmvs5Lq zt3~etY+$P_y0jC444bNec?{S{lqvNS8y^KFS6~q~>_?sQPs*ts5YXEr(xhWcx9Cz- z40RPa4;o@`nwEr3zO_Ad1_ z!_c~X2%Abe+`fhw64XE6(zS|iTBz7xiM(vQY0aFlB z9{lliC;60*C3qV7Tgt+xIptrGgew?fBlfVqeAtUi4$MH|IUg^m&cTD25~yay^ae3y z)^ah$y-G}3utrR&YY|g!+pbfdFBy2GzKLh!)om*(lDD(F!$(gxu;}m&!4pl4l(JdE z=>hG)ak}P9BGiB{6@}CLZ8sn`JmPTP5!xvg?_$S-lJ^);|7;-~QhN>nhPvCJ_UVG7 z2{|HOr6T^&_+{(>(kb6yx3rs*;AA@MZon(c3VUUFmTmz^fmewhJ8@K=*a{*14{8jY z2wboZN;xTN?ASuBoIU2E>pngYpL?3RK2u8CX-Q-Yc%R5Ae+bk18TV8$7o}@6QJ3Uk z+7YJ=1@BXCW>Yo|luwSF*LiS|nZQr#CSx2DOl>m$g%9ZXp&brK*sBlO0zYUuDaYEi zGkSifF=s;eeadpMh9_*zfVR0OoP8!914H+nK}CAcbvEV+%OZC3E_Hz?^Z~S79nS{J z5SW>G57;F68{KsCgO`=;7LezMbTYY5SxdM2VwL%;Oe6s*(A8iqe^kzBLpqXSs>AT{ zoe+EdeVd>DRhKWsNU4JYc8ymdx3q*_z8T!UO)wHybawp)J zrN>YxA8!hU9>F-+)}?iSQs7K0wj3!RC}%-1aqW*Z#KCx^a=pSzhrC(&2Ob>_zlOvW zn=*EZD_Ulrvz_#}jxS`o10Km_i&&z!B8swvC9Fg7WHKREyhWN{yuQ7Q-B2 zPU|njq}HBMDcj3ircW1yls0kQ=g46kK? zNJ3!)Amn8bv1KOC$#B2RERDS_3!#!vn4A&lmMyM@Iqp`5aT1tAW%E8hLoOJHyoJqC zBF(q5xHWoyo~JsWpWlcpWoI-oL-@qdZ8eUX+LU6|GI8A6hdhtLSTuR=#WUn0 zdB&;oya7iRB~MpNv^;10L3uvFglPB0eF}1CCu7dO7^;{fl01iOifngGM3Ny9dsAli zlE+VV(oeKvWTh^w8VRCk_D}Y6tWS9k@8d8s zzb{WSRQT`ZnXAgvpXB-W>##g`t8063-|~#_CC~hSFHdrmJlvjH_T88L%!DN3I%dwR zB1-xhmQ9m(TY6YYBHt%HzcE@rpHux0*z*IJSDig4#IonNVMeMv)`&cARi1<6ddqW0 zFL@^aL3!f1JnTGNK1z|Bxgr<7>*+l}yZk0dm@DVn2j=>pVwWDY?@G$`^ZOb!Smdp^ zO=$ocoCIIKgpz^S7Z@i<1{{mI>{jK*FR_~#1T1on2Vn$=ulNefA?0g4=fW-HQtl97 z-O6?V#C6zHQ|rl?7Y9?sA*COG{)ynnpr6t_-(JskY=Jnu2Mki&4R&juxNh&2fs(n# zD+43POflfw#v~bIx(mJlT}vHuo}j!?=w*#*+QQ*BJZZ^jTF zd>`_~_3mPiyTq0}rae0;g|01S+~GmfHpx$SEyyO>#pTe8@D_lw9t%qO88UEbo`?L1 z<@AdQYLLH~y(=)($cprn!H;~u7u^`YEsDY)l}_pk-K}JGmN&kuf_wn6_)o7t*?I?+ zC2&cC;F(4H)7K(LK;KB%q)PI3>FC#Z!kcMB>{9tog*K2WA4}y&=p2_0Y%N_UhtHFg zgx90zV?5Qh`Oswm@hk&qQ;tDG-Tlz-$(IG5jC+U4&TZ=(&R*|7{p+LozfSev;lDVV zKkX;*MxUC7xB|#)0_oisVaQ7kEC*AUT!$|j@!J8Yk>{lnt|w`^B9HKAwC7m`WjeSb zrN?=T*!VfKpl_UPvmOeC?&!K95`U16`Ul{I&J-@M4m-T`Ao{(wCGBfd>vB0e~ohNJsZ)98A&3U zHZCz9p(O4mvIT5$Nz!miEg`UZaC%5%(^dwSLe_*)FwKiF3iQO{P{y&&x8V-=I4&rU z(C}b{qseS3om74TXJ~5cXky%faVz%|#6NUIfsJz0Ay@IEfp>@w-s*o@F~TrZ;unBi z*I#*l3P& zCfqd<{1$@yK%MCugU* z&E%3^!;ute7pLSC@oHU#eUh^0GjcpeyjsGWlpPc~5$(jgULpt%2qj3&-xC&ns=dtM zi;#yVN~9lKi|O>If5<}9pocKoSX{V!*`hnsJ9-E>SRja7>DP=PLD&&)_77wU>^i120h$YGw1Ac3KeAXxyR=O*(Ndpb--nT{qNpAtx(K>8rYh8@R! z%J7HI<=tx0jnw%K6wZ5m`YP-3{)HqM>+v_BcD)mpCw$iS1Zd-|En2F(8E~IsB*w7g z^=u}$bahGmXk+97cs?_fMAhRB?w3C%*+R-pOlv?2HMZae6DLWN*&!sZ9O<>6Ikb=wFvzpelE(QA zbxB4SI*Xx0Vl0vw#1DotM+lUK>dx(|pmm+wG!hE~bi4-*urIJGvCnAF#e4D|7tz@J zDbg_vm{8c6GrKx=Wp=v)#RiX=%zTbB^TUPfNUK%{yQju?GH_7wmD0>+8XdbH!FoXA zDEVhtr13MXV&k`@0^jEzSTlX8HO}QPA^H{e8O)oq*QVf2>Hj99du^(Ndf~Mx$sZ^B zenABe6(?m@^@SPa4D)eJgV(3R%)D(jNd{90mrq|fo1wh?3NE)Q?EMUM!`P2fy&cE7 zhX1vTQa`#<-%Nb4PU^$!gi#cI&rrjX%`}f%&|pU;t3#HN3J>>w%N3eKkmBFUk zsbW!Hg_ddVY|?8Nc|12ypElt_hDBS4>zE2Lk-I6xR!g!(uM#3PM`FQpax5J}E~Bhm zIrcMG&m6{$;{3TvKa8X641Pa^E|Pjdyj#LCs&We&({^sOkx63GA0w3@;jH@zK(^}z zaH$4t0gyJ}%-%HM^AfHDCFC6+n$hB)K1cG`&47yY;YyWb{{+22`TNv0ZU}S*<>C&0l^KrdObPC|3Z8>(AgW;#JlK!1coXyvKtXU;XvY%km1coHpLb8GAz9b%!h#f!|#xMx5C4Dwf8SQ zByu2Kfq2l=`H+|;8Ol3sDCVI6xB}^kDCjP6ivKB98*pZOz}bO&b-H9uWxO|f>^Y#) z>BP9l|DEfkmUI)*$!2P+;!GEU>3ZzOxK1`JGXREJD%t4bp#R|=HUdf;Dp2hgD3nt{ z^AY~N4fzm`FY!Jb_RDMcI#NDVW^QLYa<;d=3eTj^qaU!+f&K^Z=x9Lh=c@tX+>B1q zSB?iTn9CU~CI)L?gapN%kFdkaDdl?&IG+R|XX~${z$34GFP%{4rgYMw=>GTdPBu2{ zXwSt}#E2c7C%q4u6BtrL2bSAKAC`iU*NC_GUxS9A=sV71irye;iY^9U2P zKeqZ0N&b8Ul~m;;f(6nogo^2LNAlYyr>j*AhlJP+RS9Q8?0urV`oVktfWYk>yYTj=;* z#cZB%Kg*_5^>!>k(~tOg8NJ=g>u6QlsiHYV7&_h!78@61=9C-I!g3qsFrGN$8JzK_ zXNMV|&l&%NEF_TLaye(5N~B*`NyFH-DBol82hRgtD2eK~gHrHh;+we^B@G}u!4?5oCq$J3^UILtaY1v~4xl{;f+9!g$WdjTKcge3m!LUZ&>RRl7J`DA zB%jqEyiXMQgJ-FI_eRG52r4B1acC_fJ74!F+~2ePsTkhdcCx%f`@KV)Qoc4m#(n!7 z&T?k(6R^?FUjt@27Je$nS60)MhwtaF05l@wAHQEe7i?nOudn+X82lgKueY%&jd8zz zgcy>0I^lkO*=n=|va*t36{`q~Zz7*&)D9`LP(}ui{hN9ah{KTRgD3t@!RSjdX1rDr zm;}!;$>Q>#FZpNV8z)~&hEF|aLO^~_u-C>9 zaUsQF*2LdKrK2MDPJyzMX3LKwSUC?6B7lo*wmq@1(VmIX=2^P_ruM_8?r~)6fvl;g zVyLe^Lqlz&0J2`4^%|7QZRpy2ym)~COR5TSb(oa-rRO{~?;S6xzq2+Hk;kU|NE9=_ ztozRC2WM~_4ih55gP)=$96tz`(BAC&gwf$c3;*J&`u;Gx|G=9VSj+g5qWmM&ogw)} z-5x+YX0kX_-j`Cg;^x)N&Y8}H3v&fV3a(5=TzW6unzLgI&RNLQlN+}v^GQx5$`<6t zQw;cF7bF}Ww==K^yH%r8zQpCf1?u$B=8)|rl3a%4p8kwBxo4+0gp3sjC*oaSgB7aC zSg$4biFrdr05x%~(1hbJnn#yh549nMMe3RXl7ZUy=k%Z$^yXqxhv}`1gL?0g#zd*Zs=p!~(3QJxPs6JSp^Y(Lw-~R*V?yyXIu9?~l-m z^{q^Kn#$eEgH)1WxR8*><3z}_U2&jO*IWA4o=awYEslb&wR+B`xf$$S&(S`ijl1;P^Uv|mbi74^jmrnLXmMKX8gV)O_}`8mN&H7ETS4@@ z2I197?`30kA|IsHsq7??$pqQD^bB^uUpwS}xO2?4n{Zb+$t2->I8x>@vGG*&grPv1 zPwA981@H53b;&R&a(EYWTX;AZN;~#L@*NTmJlW?C>6~p+VBl0&AXmayrN0jIxfg~M zVFNCV33#|NTkF2W$;8ySDFJ&f{~@Jqf7KbL8!lo2olfIrkgyRl{cfPGNbnn&0Jp^b9%L5R&L$~fnhL9P4Ak*?0#ldkHxM7Py<9MY-8snaCc^I8 zVRzgnDzIf_zpnM_6PP-~w=VfS{yo+CWD~k~3Bv)Bn+5HURDNN*kjS6Bjs|=ijGaPm z!Lvkm@uF^ir^sIihcY{$H9>Z86KWfoeK_&t^tQlm{ss6U^y2Whbp7Q;B~kB71tx|r zi(6#I*OtrLrcdK9o6|+nPk#pUK>BZRM(|eTiVm|09eQ4djrJH{j6ng%^bSFJ&Xx8T zdOW1i|K|dCQQRI&oMJUR_n&|I2+Gk8c!W? zlza^84~>T`4C86}Z;q!8%I$kR|9bRy$1@=T<9Ql5N&^P?Yx-dxel_1*UyRe_GEvI$4ukt z#GgMj9`aDIH`{-6Jk!`J>1%%EmA^Zloj6@l(t)E`X*_tp2G?EtF)nN}EAfT*gW{dE zUg`#E84=4TB!9dsun=D7M_0gY&@MYYNCK|0(miLA{)!WKV!M@{%uM2NXMn9xoJ%gY zwCCdY#pnnCOco96dV>6ayD0@A){H%xO>16wr{qr{PR+O|#}4E@;*TDt|#cw zE`V3_l)Kax(laAYXHhjOkQTRwuFO(_v_is|k_sd<3uBH2PztagY*QvZNa@L;7MDML zFJx?Qv@1Y`Zp~k!O0ST=VP`+-hM#Zfq!xU{ltz0uo`D=B5M7V6A1)9u8mIquMKbJ0 zv{M$7ngZsM3rUak6AQFG^|mC_&lC_%_!8IN&?ms zyWuKu6$5gcAow5^-lD?EA_)F7W{`+s@HP z>p46@LrN-Wb-fhv{S==X{&jh&d`YQ%t+DAU(<0-KQJbuLIhSti-c&9DnnC~2jm$fy zFB;Cd%v0wT4Bw$Hn3YC=h`zY4U(|jM`wwH({$(xwfK_<=sh-cWb01e=_}|aPYnf7D z)O#qWIpp7*@)1|cw{-R+wf+{Td~y$%;i3}%mlMtY*l%_n$))do4fz6^G|*x2erQ^M z0HS+e>&G^XjpzXbkMKLNc6{<`N{ec1-L}c@%F2rJ%5t~OT~q6E*VwMED=Mies`QK= zjaN_m!nHL@jU5 zo?BE~UR+q~sVT3Vcj={tQwoc#Dp9K|_Sh=xDk^N1RUX^IqKfho-cgw7E~|jFbKT_& zY;6yfmR7neZ6)qn+az~Q+f(?Fa}_NL&*iRVST!0}bx}>x0yhRDMBzlWl1d7Of`D^X$<*N+oBpw?1Y;=?&OqS<0WEhyR*`R=D8JB#q(=zo+?jK1t!^M zvsKOKWoc1)g}VgL!&8K79aFEIe&wV~Z6|WGB?~E097oy~mAgyaHDy&5ZZehOB|<^@ z0(VuN$5!JmDlVh<|AlBPDXOl9%tYMBE|1WZP&D`?JlDf)ywz^7K=9O0!ICJtYwcν-!}|3CoHq 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 diff --git a/driver/ui/ui.cpp b/driver/ui/ui.cpp new file mode 100644 index 0000000..57b5ba4 --- /dev/null +++ b/driver/ui/ui.cpp @@ -0,0 +1,278 @@ +#include "ui.h" +#include "../drv/b15f.h" + +std::vector win_stack; +std::thread t_refresh; + +void show_main(int) +{ + ViewSelection* view = new ViewSelection(); + view->setTitle("B15F - Command Line Interface"); + view->addChoice("[ Monitor - Eingaben beobachten ]", &show_monitor); + view->addChoice("[ Digitale Ausgabe BE0 ]", &show_digital_output0); + view->addChoice("[ Digitale Ausgabe BE1 ]", &show_digital_output1); + view->addChoice("[ Analoge Ausgabe AA0 ]", &show_analog_output0); + view->addChoice("[ Analoge Ausgabe AA1 ]", &show_analog_output1); + view->addChoice("[ Selbsttest des B15 ]", &show_selftest_info); + view->addChoice("[ Informationen ]", &show_info); + view->addChoice("", nullptr); + view->addChoice("[ Beenden ]", &finish); + view->repaint(); + + win_stack.push_back(view); + input(0); +} + +void input(int) +{ + call_t nextCall; + int key; + do + { + key = wgetch(View::getWinContext()); + win_stack.back()->repaint(); + nextCall = win_stack.back()->keypress(key); + + if(key == -1) + view_back(key); + + if(nextCall) + nextCall(key); + } + while(win_stack.size()); +} + +void view_back(int) +{ + if(win_stack.size()) + { + delete win_stack.back(); + win_stack.pop_back(); + } + if(win_stack.size()) + win_stack.back()->repaint(); +} + +void finish(int) +{ + cleanup(); + exit(EXIT_SUCCESS); +} + +void cleanup() +{ + if(t_refresh.joinable()) + t_refresh.join(); + clrtoeol(); + refresh(); + endwin(); +} + +void show_info(int) +{ + ViewInfo* view = new ViewInfo(); + view->setTitle("Info"); + view->setText("Informationen zu Board 15 Famulus Edition\nEs war einmal..."); + view->setLabelClose("[ Zurueck ]"); + view->repaint(); + + win_stack.push_back(view); + input(0); +} + +void show_monitor(int) +{ + ViewMonitor* view = new ViewMonitor(); + view->setTitle("Monitor"); + view->setText("\nErfasse Messwerte..."); + view->setLabelClose("[ Zurueck ]"); + view->repaint(); + + win_stack.push_back(view); + input(0); +} + +void show_invalid_port_input(int) +{ + ViewInfo* view = new ViewInfo(); + view->setTitle("Falsche Eingabe"); + view->setText("Bitte geben Sie einen Wert aus dem Intervall [0, FF] an."); + view->setLabelClose("[ Schliessen ]"); + view->repaint(); + + win_stack.push_back(view); + input(0); +} + +void show_invalid_dac_input(int) +{ + ViewInfo* view = new ViewInfo(); + view->setTitle("Falsche Eingabe"); + view->setText("Bitte geben Sie einen Wert aus dem Intervall [0, 1023] an."); + view->setLabelClose("[ Schliessen ]"); + view->repaint(); + + win_stack.push_back(view); + input(0); +} + +void write_digital_output0(int) +{ + try + { + int d = std::stoi(static_cast(win_stack.back())->getInput(), 0, 16); + if(d > 255 || 0 > d) + throw std::invalid_argument("bad value"); + uint8_t port = static_cast(d); + + B15F& drv = B15F::getInstance(); + drv.digitalWrite0(port); + view_back(0); + } + catch(std::invalid_argument& ex) + { + show_invalid_port_input(0); + } +} + +void write_digital_output1(int) +{ + try + { + int d = std::stoi(static_cast(win_stack.back())->getInput(), 0, 16); + if(d > 255 || 0 > d) + throw std::invalid_argument("bad value"); + uint8_t port = static_cast(d); + + B15F& drv = B15F::getInstance(); + drv.digitalWrite1(port); + view_back(0); + } + catch(std::invalid_argument& ex) + { + show_invalid_port_input(0); + } +} + +void write_analog_output0(int) +{ + try + { + uint16_t port = std::stoi(static_cast(win_stack.back())->getInput()); + if(port > 1023) + throw std::invalid_argument("bad value"); + + B15F& drv = B15F::getInstance(); + drv.analogWrite0(port); + view_back(0); + } + catch(std::invalid_argument& ex) + { + show_invalid_dac_input(0); + } +} + +void write_analog_output1(int) +{ + try + { + uint16_t port = std::stoi(static_cast(win_stack.back())->getInput()); + if(port > 1023) + throw std::invalid_argument("bad value"); + + B15F& drv = B15F::getInstance(); + drv.analogWrite1(port); + view_back(0); + } + catch(std::invalid_argument& ex) + { + show_invalid_dac_input(0); + } +} + +void show_digital_output0(int) +{ + ViewPromt* view = new ViewPromt(); + view->setTitle("Digitale Ausgabe BE0"); + view->setMessage("\nAusgabe Port-Wert (hex): 0x"); + view->setCancel("[ Zurueck ]", true); + view->setConfirm("[ OK ]", &write_digital_output0); + view->repaint(); + + win_stack.push_back(view); + input(0); +} + +void show_digital_output1(int) +{ + ViewPromt* view = new ViewPromt(); + view->setTitle("Digitale Ausgabe BE1"); + view->setMessage("\nAusgabe Port-Wert (hex): 0x"); + view->setCancel("[ Zurueck ]", true); + view->setConfirm("[ OK ]", &write_digital_output1); + view->repaint(); + + win_stack.push_back(view); + input(0); +} + +void show_analog_output0(int) +{ + ViewPromt* view = new ViewPromt(); + view->setTitle("Analoge Ausgabe AA0"); + view->setMessage("\nAusgabe 10-Bit-Wert (0...1023): "); + view->setCancel("[ Zurueck ]", true); + view->setConfirm("[ OK ]", &write_analog_output0); + view->repaint(); + + win_stack.push_back(view); + input(0); +} + +void show_analog_output1(int) +{ + ViewPromt* view = new ViewPromt(); + view->setTitle("Analoge Ausgabe AA1"); + view->setMessage("\nAusgabe 10-Bit-Wert (0...1023): "); + view->setCancel("[ Zurueck ]", true); + view->setConfirm("[ OK ]", &write_analog_output1); + view->repaint(); + + win_stack.push_back(view); + input(0); +} + +void start_selftest(int) +{ + B15F& drv = B15F::getInstance(); + drv.activateSelfTestMode(); + + ViewInfo* view = new ViewInfo(); + view->setTitle("Selbsttest aktiv"); + view->setText("Das B15 befindet sich jetzt im Selbsttestmodus.\n \nSelbsttest:\nZu Beginn geht der Reihe nach jede LED von BA0 bis BA1 an.\nDanach leuchten die LEDs an AA0 und AA1 kurz auf.\nZum Schluss spiegelt in einer Endlosschleife:\n* BA0 Port BE0\n* BA1 die DIP-Schalter S7\n* AA0 ADC0\n* AA1 ADC1"); + view->setLabelClose("[ Selbsttest Beenden ]"); + view->setCall(&stop_selftest); + view->repaint(); + + win_stack.push_back(view); + input(0); +} + +void stop_selftest(int) +{ + B15F& drv = B15F::getInstance(); + drv.discard(); +} + +void show_selftest_info(int) +{ + ViewInfo* view = new ViewInfo(); + view->setTitle("Selbsttest"); + view->setText("Bitte entfernen Sie jetzt alle Draehte von den Anschlussklemmen und bestaetigen\nmit Enter."); + view->setLabelClose("[ Weiter ]"); + view->setCall(&start_selftest); + view->repaint(); + + win_stack.push_back(view); + input(0); +} diff --git a/driver/ui/ui.h b/driver/ui/ui.h new file mode 100644 index 0000000..197e8f0 --- /dev/null +++ b/driver/ui/ui.h @@ -0,0 +1,38 @@ +#ifndef UI_H +#define UI_H + +#include +#include "view_selection.h" +#include "view_info.h" +#include "view_monitor.h" +#include "view_promt.h" + +void show_main(int); +void input(int); +void view_back(int); +void finish(int); +void cleanup(); + +void show_info(int); +void show_monitor(int); +void show_invalid_port_input(int); +void show_invalid_dac_input(int); +void write_digital_output0(int); +void write_digital_output1(int); +void write_analog_output0(int); +void write_analog_output1(int); +void show_digital_output0(int); +void show_digital_output1(int); +void show_analog_output0(int); +void show_analog_output1(int); + +// selftest group +void show_selftest_info(int); +void start_selftest(int); +void stop_selftest(int); + + +extern std::vector win_stack; +extern std::thread t_refresh; + +#endif // UI_H