From 2e25054f77e7eaeedd5eca305af5b2b5dc0dbb2c Mon Sep 17 00:00:00 2001 From: Alexey Ryabov Date: Sun, 25 May 2025 20:21:37 +0500 Subject: [PATCH] Add more settings, bump version to 0.2.0 --- CHANGELOG.md | 7 +- README.md | 2 +- kterm.asm | 262 +++++++++++----------------------------------- screenshot.png | Bin 7730 -> 9859 bytes settings.inc | 277 +++++++++++++++++++++++++++++++++++++++++++++++++ utils.inc | 57 ++++++++++ 6 files changed, 400 insertions(+), 205 deletions(-) create mode 100644 settings.inc diff --git a/CHANGELOG.md b/CHANGELOG.md index 30f8d2f..7d7e033 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,11 +1,16 @@ # Changelog -## [Unreleased] +## [0.2.0] - 2025-05-25 + +### Added +- Option to append LF or CRLF when sending data +- Option to configure data bits ### Fixed - Properly handle port disconnection ### Changed +- Check serial driver version at startup - Increase UI margins for better appearance with wide-border skins - Use system `icons16` instead of embedded icons diff --git a/README.md b/README.md index 0337325..dff9cd5 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ Simple serial terminal for KolibriOS. - [Fasm](https://flatassembler.net/) 1.7x - [Tup](https://gittup.org/tup/) build system (optional) -- KolibriOS commit `#5593d344cd` or newer +- KolibriOS commit `#2dfb3ddff3` or newer ## Build instructions diff --git a/kterm.asm b/kterm.asm index e746a6c..cee8186 100644 --- a/kterm.asm +++ b/kterm.asm @@ -33,8 +33,6 @@ ED_SEND_MAX_LEN = 256 KEY_ENTER = 13 -CONN_WIN_STACK_SIZE = 1024 - IMG_RGB_METADATA_SIZE = 8 ICON_SIZE_BYTES = TOOL_ICON_SIZE * TOOL_ICON_SIZE * 3 ICON_SETUP_OFFSET = IMG_RGB_METADATA_SIZE + ICON_SIZE_BYTES * 60 @@ -62,8 +60,9 @@ include '../../KOSfuncs.inc' include '../../dll.inc' include '../../debug-fdo.inc' include '../../develop/libraries/box_lib/trunk/box_lib.mac' -include '../../develop/libraries/libs-dev/libimg/libimg.inc' include '../../../drivers/serial/common.inc' + +include 'settings.inc' include 'textview.inc' include 'utils.inc' @@ -73,11 +72,20 @@ start: call serial_port_init test eax, eax jnz @f - DEBUGF L_ERR, "%s\n", err_driver + DEBUGF L_ERR, "kterm: %s\n", err_driver mov eax, err_driver mov [status_msg], eax @@: - + push 0 + stdcall serial_port_get_version, esp + pop eax + DEBUGF L_DBG, "kterm: serial driver version 0x%x\n", eax + shr eax, 16 + cmp ax, SERIAL_COMPATIBLE_API_VER + jle @f + mov eax, err_driver_ver + mov [status_msg], eax + @@: stdcall dll.Load, @IMPORT or eax, eax jnz .exit @@ -137,7 +145,7 @@ start: @@: cmp ah, BTN_SETUP jne @f - call show_conn_window + call show_settings_win jmp .loop @@: cmp ah, BTN_CLEAR @@ -336,134 +344,6 @@ start: mcall SF_REDRAW, SSF_END_DRAW ret -CONN_WIN_WIDTH = 200 -CONN_WIN_HEIGHT = 250 -proc show_conn_window - cmp [is_conn_win_opened], 1 - jne @f - mcall SF_SYSTEM, SSF_GET_THREAD_SLOT, [conn_win_pid] - xchg eax, ecx - mcall SF_SYSTEM, SSF_FOCUS_WINDOW - ret - @@: - mcall SF_CREATE_THREAD, 1, .thread, conn_win_stack + CONN_WIN_STACK_SIZE - cmp eax, -1 - je @f - mov [conn_win_pid], eax - mov [is_conn_win_opened], 1 - @@: - ret - .thread: - mcall SF_SET_EVENTS_MASK, EVM_MOUSE + EVM_MOUSE_FILTER + EVM_REDRAW + EVM_BUTTON + EVM_KEY - - mov eax, [port_num] - mov ecx, 10 - mov edi, ed_port_val - call int_to_str - and byte [edi], 0 - mov esi, ed_port_val - call strlen - mov [ed_port.size], eax - mov [ed_port.pos], eax - - mov eax, [port_conf + 4] - mov ecx, 10 - mov edi, ed_baud_val - call int_to_str - and byte [edi], 0 - mov esi, ed_baud_val - call strlen - mov [ed_baud.size], eax - - call .draw_window - .loop: - mcall SF_WAIT_EVENT - dec eax - jz .win - dec eax - jz .key - dec eax - jz .btn - invoke edit_box_mouse, ed_port - invoke edit_box_mouse, ed_baud - jmp .loop - .win: - call .draw_window - jmp .loop - .key: - mcall SF_GET_KEY - invoke edit_box_key, ed_port - invoke edit_box_key, ed_baud - jmp .loop - .btn: - mcall SF_GET_BUTTON - cmp ah, BTN_OK - jne @f - mov esi, ed_port_val - call str_to_uint - mov [port_num], ebx - mov esi, ed_baud_val - call str_to_uint - mov [port_conf + SP_CONF.baudrate], ebx - @@: - and [is_conn_win_opened], 0 - mcall SF_TERMINATE_PROCESS - - .draw_window: - mcall SF_REDRAW, SSF_BEGIN_DRAW - - mov edx, [sc.work] - or edx, 0x34000000 - mov esi, [sc.work] - mov edi, conn_win_name - - mov ebx, [pi.box.width] - shr ebx, 1 - add ebx, [pi.box.left] - sub ebx, CONN_WIN_WIDTH / 2 - shl ebx, 16 - add ebx, CONN_WIN_WIDTH - - mov ecx, [pi.box.height] - shr ecx, 1 - add ecx, [pi.box.top] - sub ecx, CONN_WIN_HEIGHT / 2 - shl ecx, 16 - add ecx, CONN_WIN_HEIGHT - - mcall SF_CREATE_WINDOW - - mov ecx, 0x90000000 - or ecx, [sc.work_text] - mov edx, port_label - mcall SF_DRAW_TEXT, - mov edx, baud_label - mcall SF_DRAW_TEXT, - - edit_boxes_set_sys_color conn_win_edits_start, conn_win_edits_end, sc - invoke edit_box_draw, ed_port - invoke edit_box_draw, ed_baud - - mcall SF_DEFINE_BUTTON, , \ - , BTN_OK, \ - [sc.work_button] - - mcall SF_DEFINE_BUTTON, , \ - , BTN_CANCEL, \ - [sc.work_button] - - mov ecx, 0x90000000 - or ecx, [sc.work_button_text] - mcall SF_DRAW_TEXT, , , ok_label - - mov ecx, 0x90000000 - or ecx, [sc.work_button_text] - mcall SF_DRAW_TEXT, , , cancel_label - - mcall SF_REDRAW, SSF_END_DRAW - ret -endp - proc send_text ; check for empty string cmp byte [ed_send_val], 0 @@ -475,9 +355,13 @@ proc send_text call make_line_header mov esi, ed_send_val call strlen + call .append_ending mov [tx_buf_cnt], eax stdcall serial_port_write, [port_handle], ed_send_val, tx_buf_cnt ; TODO check for errors and actual size of written data + mov esi, ed_send_val + call escape_chars + mov byte [esi], 0 stdcall text_view_append_line, text_view, ed_send_header, TV_FLAG_AUTOSCROLL xor eax, eax push eax @@ -489,6 +373,22 @@ proc send_text invoke scrollbar_draw, vscroll .exit: ret + + .append_ending: + cmp [text_append], SETTINGS_APPEND_NONE + je .nothing + cmp [text_append], SETTINGS_APPEND_LF + je .append_lf + mov byte [esi], 0x0d + inc esi + inc eax + .append_lf: + mov byte [esi], 0x0a + inc esi + inc eax + .nothing: + mov byte [esi], 0 + ret endp proc update_vscroll @@ -523,7 +423,8 @@ proc btn_conn_click jmp .exit .opened: mov [is_connected], 1 - mov esi, port_label + ; make string for status + mov esi, port_lbl mov edi, port_status mov ecx, 4 cld @@ -533,13 +434,16 @@ proc btn_conn_click call int_to_str mov al, ' ' stosb - mov eax, [port_conf + 4] + mov eax, [port_conf + SP_CONF.baudrate] mov ecx, 10 call int_to_str - mov eax, ' 8n1' - stosd - xor al, al + mov al, ' ' stosb + mov al, [port_conf + SP_CONF.word_size] + add al, '0' + stosb + mov eax, 'n1' + stosd mov [status_msg], port_status jmp .exit .close: @@ -555,11 +459,11 @@ proc check_port stdcall serial_port_read, [port_handle], rx_buf, rx_buf_cnt test eax, eax jnz .error - mov eax, [rx_buf_cnt] - test eax, eax + mov ecx, [rx_buf_cnt] + test ecx, ecx jz .exit - ; TODO escape non-print chars - lea esi, [rx_buf + eax] + mov esi, rx_buf + call escape_chars mov byte [esi], 0 xor eax, eax mov edi, rx_header @@ -579,44 +483,6 @@ proc check_port ret endp -proc make_line_header -; eax = 0 - rx, 1 - tx -; edi = dest buf - push eax - mcall SF_GET_SYS_TIME - mov ebx, eax - mov ecx, 3 - ; BCD timestamp to string - .loop: - mov al, bl - shr al, 4 - add al, '0' - stosb - mov al, bl - and al, 0x0f - add al, '0' - stosb - dec ecx - jz .done - mov al, ':' - stosb - shr ebx, 8 - jmp .loop - .done: - mov al, ' ' - stosb - mov al, '<' - pop ebx - test ebx, ebx - jz @f - mov al, '>' - @@: - stosb - mov al, ' ' - stosb - ret -endp - align 16 @IMPORT: @@ -629,7 +495,9 @@ import box_lib,\ edit_box_mouse, 'edit_box_mouse',\ edit_box_set_text, 'edit_box_set_text',\ scrollbar_draw, 'scrollbar_v_draw',\ - scrollbar_mouse, 'scrollbar_v_mouse' + scrollbar_mouse, 'scrollbar_v_mouse',\ + option_box_draw, 'option_box_draw',\ + option_box_mouse, 'option_box_mouse' import libimg,\ libimg.init, 'lib_init',\ @@ -637,17 +505,10 @@ import libimg,\ img.to_rgb, 'img_to_rgb',\ img.destroy, 'img_destroy' -conn_win_edits_start: -ed_port edit_box 80, CONN_WIN_WIDTH - 80 - 15, WIN_MARGIN, 0xffffff, 0x6f9480, \ - 0, 0, 0x10000000, 6, ed_port_val, mouse_dd, \ - ed_focus + ed_figure_only -ed_baud edit_box 80, CONN_WIN_WIDTH - 80 - 15, WIN_MARGIN * 2 + ED_HEIGHT, 0xffffff, 0x6f9480, \ - 0, 0, 0x10000000, 6, ed_baud_val, mouse_dd, \ - ed_figure_only -conn_win_edits_end: + main_win_edits_start: ed_send edit_box 0, WIN_MARGIN, 0, 0xffffff, 0x6f9480, \ - 0, 0, 0x10000000, ED_SEND_MAX_LEN - 1, ed_send_val, mouse_dd, \ + 0, 0, 0x10000000, ED_SEND_MAX_LEN - 3, ed_send_val, mouse_dd, \ ed_focus + ed_always_focus, 0, 0 main_win_edits_end: @@ -655,13 +516,7 @@ vscroll scrollbar SCROLL_WIDTH, 0, 0, SCROLL_TOP, SCROLL_WIDTH, 0, 0, 0, text_view TEXT_VIEW is_connected db 0 -is_conn_win_opened db 0 -app_name db 'kterm v0.1.1', 0 -conn_win_name db 'kterm - settings', 0 -port_label db 'Port:', 0 -baud_label db 'Baudrate:', 0 -ok_label db 'Ok', 0 -cancel_label db 'Cancel', 0 +app_name db 'kterm v0.2.0', 0 send_label db 'Send', 0 noconn_msg db 'Not connected', 0 icons_file db '/sys/icons16.png', 0 @@ -670,6 +525,7 @@ err_busy db 'The port is already in use', 0 err_conf db 'Invalid port configuration', 0 err_unknown db 'An unknown error occured', 0 err_driver db 'Error loading driver serial.sys', 0 +err_driver_ver db 'Error serial driver version', 0 align 4 status_msg dd noconn_msg @@ -678,20 +534,21 @@ icons_rgb dd 0 port_conf: dd port_conf_end - port_conf dd 9600 - db 8, 1, SERIAL_CONF_PARITY_NONE, SERIAL_CONF_FLOW_CTRL_NONE + db 8, SERIAL_CONF_STOP_BITS_1, SERIAL_CONF_PARITY_NONE, SERIAL_CONF_FLOW_CTRL_NONE port_conf_end: +text_append db SETTINGS_APPEND_LF + +IncludeIGlobals include_debug_strings align 4 i_end: +IncludeUGlobals mouse_dd dd ? -conn_win_pid dd ? port_handle dd ? rx_buf_cnt dd ? tx_buf_cnt dd ? -ed_port_val rb 7 -ed_baud_val rb 7 ed_send_header rb LINE_HEADER_LEN ed_send_val rb ED_SEND_MAX_LEN port_status rb PORT_STATUS_LEN @@ -699,4 +556,3 @@ rx_header rb LINE_HEADER_LEN rx_buf rb RX_BUF_SIZE sc system_colors pi process_information -conn_win_stack rb CONN_WIN_STACK_SIZE diff --git a/screenshot.png b/screenshot.png index 708685b942a6f9b9111809422573388712037643..031f3535f8d4b19fce4a7b8df1bfd37beb212176 100644 GIT binary patch literal 9859 zcmch7cTiNz_vZygd1NC>20>7AP7;(PNd$yJqGTiuIm2Kgh=7ujBp@I;gD?aoXBbJ6 zW+V(b&XAd~m-pV**6+JpTU%ST`$yN*?YX!6^y$wD{W%@^^obfZ1p@^D0MzP_mGuDN zf&~DOJR&CrdtPC8!481LQ%~&?$y6^N41Bm~|4{oO093|O;w;I)XEy7{dfEUGa2EhV z-vYoX*cG}80Nz3Xu>Jx7WKsZt-YvaR_W}6FUv7_|djbGW$9W@3Dr73kCEvQ44%@#fr#R^f4;;=`B- zJp%#dUu)fc^d>nG`{B%4Q8M&M&5~yo+Z=0G2d+dVEO~tS^Ys3wIMOL;Cy1fp>*70_ zUWIQd(RA=qaQ|fXrw6#6TMeq=WjnT4j)Uy_XYVO`*>p@=KB~ZHrqlGoIN`MF$s@%A2Kw>mIeF#hRnRYI>x+bgL`Q zn;#OnI43!5zN(4`0DMVUOZzt>-#T9qC|}G?Rlx<8j;1R!-;J8AiZYK&7u;u@p|(v+ z(>1=Hdo7&2{-Ef6n<06pB=1Yj;1X|zL`C&0E`BMN*^>PbZn)@mgRJCOh4cP3eyzjG z&gVh_k~hY{X<3^M@=dl!`ZkI$!7*oKBaFHfAFgIQkW-nnz6p_zZj4EpMhe=1pa# zFRY|F4&;1Ehi5d4!V60uUENQXTBnaVx8=3GnYspfMQ3MK#Y&zjDBdpoWE=YPd?WpG zTqW4fhjB7QCTt4w-R6*esfCjn@^Qz0Hdi~|EJvoVBlu#%rZAlc7iyTP?d|OJCfP{$ zRSP1w((DDBf<=NYe$?v>!7Op!8;>GJ^=g);c*z>QBs=_WYS#I0Xwbec*Q}|w)t~vs zYNW?5SU4c$?x-luU}X;XDP_0&f*Q3H5e>#}zJtIxGg6HO?!{Q_wQWW%lqAh*N4RO{> z-LMT!7w2!yweSDN^R6C{#jBXpgBY&CZMdc={wKZs7;WSr)g1rfc>5pObQqM)K5*uuH zf_DP@>3!5dmr*9dOZGxt%5V2i^AU1GO6sXsZ@*wGlQ)L|ADW!^r^2b>Y&_kp8mGs-sFNGF=RsB}5v-|Th>t<7&8Qh23s}^{( zkO=+mIV{*J{Qlu(T9yyz2z9=m7zy#m#Glc~9XzV~7pZ=U3^VC2I_|R7XNmO>pq69( zx5~%8;JU9IN}CQ9C6((1A0u_{!fo7t&A*|Q|L(hk9NL(I`$9!Ls13nsZcu08mRg?G zX`;V=)8hDR>#rjuBX{17RGgaC}n2p_2=`&@nxBYbP zqDXD2|F)D}U{227tRdlH8~?nw*>Ap3ske%3t3+kC;u#*{a}7S5lQA+LdW-nmKf^B1 z^Z;Uk!`#u2?NmUvpeO2^4-RN3g~W*GA)qTBzYR>&0OqX$)a}q zzU@@l$YvLl2#+20#AW8UEA7nqtZV9o(@iv=EXykR)O3AT*iEAiqjNQDt&D$g)H7xs zsIbc`hz}-b$5q1^4ntObk%tp=L((rCl<%|#hWHO>pgA-x28SOXw&$rj)8}RMUcW`l zd%k?mZK)68DVOgsBjG2@bZzfeV4H~6?~-rbW`>!9Jg|f8Z{Kuhm2oj3CEbszQO6Sn zgcX}SuatE@D)vqM$POoL_P|2nR_jC}In^srPc=L7gBKPupnmAe3h~U+t7ZGq2kQNc zQN$|fje1eIMQ6WeALAE62W~GxhOSBGiK}#hlfK^%CekL#%&yqkKO&C}S=R=E-^~Ia z@o_0&4bmjH94u>%$(@I4&mQ#H+slIsPuh7HWV2pLY&n|jPr#*>XA;K>Ur)4NMtiGTSQlAy;p6I-5y zha>B^+OP_BK3ngJd%suhS@9_Lx4x)DPv1F)kfTME?0$=j3ze|KX(nsK!5>y-!R@n- z`gp`{OCOKeCm`_ zxw3`s*{u|gG4f!i^&en!e;Ie4C7udHU8_=g_VpylXa;&Pg@SVU)o@p;>gufEeJBe) zs+ER)_D~es;B*ij8?xFpBfqd>1B+TdSz;<}q-Cv&Ttl`@` zM+#@rdm0F#x4U)qEd)0!qqAQqBAdYUzg_tZp$>~Y@#Q4#v*8!a3qJBN_Az**Gx`7 z1b)OlwU^;bNyF_&F1GG7>g%vf!#5U_)zXU(89+CG)N<5JLt5dmR?#`TRNo^1wi()_ z_dTBdPjUfdmCrl@L`fyc`u0s zd@qqYAcMv!JuRJ{Iyu;-d$Q&9*ANj`N>|oZTbUKIqNacq#_EDOD#TtUXfY!&3kNlE zOieRoqEc=uUn6f^H3=i>|?T$ zClhaA6(fTV$G9kk<6cHW@3e0T7{B(96mFqv2yLFj_zs;9xQ#^O`mem5aJrVjH7;%n zfQ`9sQNyd)-qpiqewMJU(td=(w`39Dfqsisz?6dB6y>K%*8%sG|WL{K4*+#{anYKD*4AzTUb!e(KXh@P8(Tp)v z?)jFh*1W&i0W+_VfbO1E2ORWlUlf5^?LJm{Fr8wI^ucr0GfwI^&26?lTTFA6n%82N zy4rOHh6e|S2Q#Fb2pvP?y&<1JArPx`Hbm`xYg~?zIi76B#Td5dgYCMRt1ULSo!Y*U zOWL``?)|a4KpB^9LuR^eDMPVB> ztbTt;S~&qTZzBH4H+P3Sgt;Jx?$HA|+mo<6>>nhw&1!=J`B82*^19kTeVnvJr%rRX zR4LP*464`0V+xelpRNR7Bny|>YZ!wWE@gP^-4j-zms#s_GA4ooLAFer@w?YpY2djR zr@~pC|+!V4nseO{blLdh}`WKCIl@s#&T ziV4|GmV<{e7Ydam6(lD`&^7MgDCHM01sceEkXpRK2JO4#-$_IRh7>O;P#UR6gDkDV z&NKY;3!TS-Uj2x2CUSUJ-JFOyhh5%lGY`v?grv#LF<*ZPKD!Lr#zLF^nL4*UtI?z- zeha>+@l2%6Ps|x(mRaz@nxemdYT=7Zst*V5D?sm*+qhFFPB=~vZGN48ruO8!kI|@B zf(W-FQY&F8yFaZiE6BuPs0`eTNiSDmP@cr7 z#w!K)Su3wB>0YUg{I~1Wl+*DV>2u@}pk{Mm?k7`=_1%>5{l!JbI(44B#&HmxeQOW; zzWRctPxp-CO1Z}~le!z$-HRJrN5&m^*ba@n<{@6h`IhEpaw<0&tq|&D9W#U0SnMyw zhjRW~ksQ`19nV{KL>r&DgG#hH`9@7iFPNVM8TXMZT#Se4Bor;0@t`t2)g%q@JpDLJ zx>})=oMS17oU6f6y;SKVZiLX;XIGP!`Nu&U%VQnaKhkW(hRuCfF4tpln99UlsVjOH zMV~vEcdAi*n7#ZmHQ~5{$khZ zUa3H^c$%4ru*4RN#Wr3Eg{y5{<8#{8%*IPs~$gAE4VEnr3JQupON9;^a71txn$l= z(@gZ@x4veQzVSe5go>~PtY#m(NIL^3UimyGHnL-IJo( zGtBR+tuDhBe31h*J32a)f5I=*Fu6s1ZRa3EWq{*Xxm99}3+pNF|0V5dHsj>d{4Rb{ z!%&V~JDHv}Jn6s-E@vBKFnah*?j0t^Gn(7-B)&Sn2>4R&HzWc)tzK3CX%=kgy`sbM zWPGHituq+8XVrkbO*Im@{k+{xt=&LYN0s&-G6enb-G!p1_-6a6(6*u%%+fY9%W zQWHrnxaayb(Q{}YgR~pwBpUu#JPaL+Hn&l)}oW=_dw%X zfc2`ac0m(iWv(?E9_m$?Rg06m;&ZM(*Ia5SWS(I@Fq~c!gkF}Nb#JZk2c?cDHp->g`*pV}2*u z_p-+)&G!?kU*jOly->25Xx6WWEf(2j;cE}~vgBgkERF`+3UpcZV#E@XU<@jPam{gW z%7#9nmtYHp`#vs?CG%%hHmv5OTXhIBqk9ZpxyZsRyG@^tn$U$Bj)E3$T!45Vfh^86 zu344Cn;<3!?+Y^b&QRdjIWQioZ*o%6Fjvy6B8*|07N4#i`5r4v3J=9dbz9r-nP?}| zP9ahd)X`^Uk`Vm*b2KJkpJ5F zBw%`#w4_Gkx(j1}l8f|dqRl|`{pa8P&RrMip|oA#d4B#?ajpr1-@=g{9Urk5dmJor zImcLjq}9rb&R(H8q3OOnN@hpO*}C;}UF-VJ&Io7Qu{VZ>dCDYExgPsCy1di((#wFe z*q_lKs^b@}O$zFmWPP`PCl!`jYf7+HT^v`iZ@7G?BEteFS-X{_x{#L3s04A(=!=ueB8Yxr~D+Q{5y{O=dlfWG}kd~Qi)b>tV*l*r)`ph3|~Z;d$M}! z6eoYHZND$mMD5&-G{Iq~H6gaT&G5%V2W6TM@nuH^?Wm4T3x+xQEchHjA|&?3cWo`L z>rGBWeNT(9jqObix6E=yLvTT(8z3dPUGY-Be*#Pt>qr;S6f`b6g))IJ3i*d+e7*F&u9&QQr&i}_9!-{b5fV%JE!mDp>U`DLEu02^=1C+#37#_q3Q$J+PW zYIR&c2$=NV!!ZD9W2q4^o9EZV@?GHF+( zX`1TwZ)G&tGR6bsc`)*OeHqhz0zQz(94k%7`Hb?Gt9FD~;1)Vf`rF_;$d6+yb z&-Nk*_!`IJzhm``9o2o71M4zhOCONAKUGYiAqk!KV|Wj~;P%{X_~}FzH#6xEK-POb z;Y}#m`IfHjv$zw}MKDZ--u)*iuQLRz%3K64{rEd}E|*Yo`Lh zJ1U!F&ryH$2QC7-^t2~IF%rzpF$^D@qe20e!X-Ifc}fUN5dHG<=R;&(lGqkD zt+mRvPU{sh}DEL@hH{9(GIv*s!LOSC7h2cx!@#)Us@ULRq=`+#0 z>u>l7ygd!{qV~666oNTg#2dveSfDaduYXu)hsUUDZ}*x%Zx?v}81>lDO$Buk$9^y{ zf57ciCQvN{)*q4@$LM_yUsrrw8;^o%nO{!2Pgmyk`zvy=SfSQxwr7gGTt$ODx>cHp3LM5cf{OivOU8R80;nm9gIII%Zm0@zf8028k{gXWF%v#6f9bjQqA78eRbPptODu7jjH7k6r-22%K|i_4gWka+D3UXD__(wSYM zOy!fXG)Fq$16gULi1ZVij+js9|nlWuKlSb%_Rx~vw3&Nzabo)rG2(% zEBW@0Ix}J!F06sPLVR+dya6~1IRisR+pLH0;%oJp)Hya4`iZ#|$!eVU3 zY`v6l&I`f^%CZz!Zoh)AP0$=8owAvR9NTI!8iL%M98Ef|)>($n9+(T60dj8g?MhkQVC-Su;9?Dz{4XJURYeYiFT)b9U!LgHaK)f8I z4%h4h8s=yyfphXg7&KM|N#Et&(`&MjWU7d$8*|F4pbV>@Kqse6QVA0&rX>TFep8z5 zF3eeGl?k5`q-)w@WPZ}rR}Ia`LL#<)?oIXXskR+2mFU0YYAd-O+PS~mPD|euI4pOx z-=glmGxsm6;_12921?+JG9SfsBHaF^Wu`D7D^uu|Qa^W|Qzweexjs`5pZoYvav>?* z!lCir+N8U!?X~Dl5L(;D2{_0v@bvxYR%vq(({#~O&UzT}{G6Fcxhy(!+Hat&l5v2W=<4_=8x%3XPsemAOL z^2QCuhN?B^z^bV-KX_q)<5Hs%sOJEe%4NQlgW^0pzpw9YS76tZhi6xzj|6JDt(O2fhm+-$wfXyqyQ3{~rxtf9uw)1QNm^nN;!STnDB;APytq z6k#G&RR5C*ir&k77x=33_2YQ89WQN6mZ!&lwCdi2nB0hBnO0;{!_P44XLa3Cdw^#q)6M>mwMxS zS?isre$6ezZvp_>;Q3vEGYKti?Gv`phZ?~uIDk#DEIXF9QrsH=*e}dJ{ zv0?O^AAc~Ma-kAnhV5+Zue5&}mY5a?1&dhk`{3JjtCvAjpH9d~{N?4}AJSoSvh>vs zw4xUum*y6Qp#Jyo-nIY6i4wj~{k&81{d&0J_(9FrxEzH$@R}XaPDXZ4cM;0EVgtzB zBFRRXp+AjEzze`MF!vjQqC_w=I4C6me*jufJKOrehOI_FqsEiNb%Ow7y;SstcpCbf zH`5b-=VW(t4VD++K4nmcPxTJ{8jeJB7%6z`*a1a6ptomb- zOE=TxSHIy#W8>gSrg_Qm_^%*vz&IFtw^4%a&}&__sWZ|k?b*San#%+4du7#{M;%F^ zuL*%HUs3kA4VW!zDqu|v0@pjYb{OGFy|(-6GK<>;sn;<62(`lo$muJ|?4!;vb_nr; zmuNt5b>2d)K%)cZL@vhOwRo)qNd^ZjGb&Mw_vJXK8DRhYPDL~PPHt{5E698-j53;= z?3DeJMD}VVsuhD=c&%xsBMfKQgxCy0*B0o>Qm#X-TY(qHaqrDmo2ScU(?JG>@Gn~~ zZZ{}J>+%4n{Okmbdwm7Has7*j-1?B3e?E4U#s2*<;HXRN!Tb|e>W6q#f&6>xj2p&ZVaMCEjI|9#G_Ol(jzr*@*MlYB8I96Mw5U zqWX!Wf5>}Be(0at7m5<&J+Q>kQQ;pp=2rh9)8#zS-8T5WpXw}< zp@-mQ0@OnQECI!v1@|WC3wbc8{Rmm5<-K(!Cf9OH-v#r_6O-a){guT?&-|bWB2E5- z<7@jXmOU*A`NXb9dTNt=dmt3am|~wN)+}Gn7?lS9g6ro{9Va*xDetzjk8lPY7DVH;t`TL8PN9Dx#ZvZ|!nF08!8<_B7J;x1u zO^Ux1NiZZCXF~kPRSjM2d$;V;=368H#pJ&)Yy9s**3)XA?XYGTG2}80m>f~DzXdN2 z$T$K(dmoq;oF_fNU;^{=%+yr(3IGT*Ut|?%UgZJre+d6C;=_MB{Qr~ZA8e<@upP!& UTV)i8cK}dVd7@nQ=*8>*213_d+5i9m literal 7730 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 fkNqud diff --git a/settings.inc b/settings.inc new file mode 100644 index 0000000..6956b8c --- /dev/null +++ b/settings.inc @@ -0,0 +1,277 @@ +; Copyright (C) KolibriOS team 2025. All rights reserved. +; Distributed under terms of the GNU General Public License +; +; GNU GENERAL PUBLIC LICENSE +; Version 2, June 1991 + +SETTINGS_WIN_STACK_SIZE = 1024 +SETTINGS_WIN_WIDTH = 350 +SETTINGS_WIN_HEIGHT = 250 + +SETTINGS_BTN_WIDTH = 60 +SETTINGS_BTN_HEIGHT = 24 + +OPT_HEIGHT = 10 +COL2 = 190 + +SETTINGS_APPEND_NONE = 0 +SETTINGS_APPEND_LF = 1 +SETTINGS_APPEND_CRLF = 2 + +proc show_settings_win + cmp [settings_is_win_opened], 1 + jne @f + mcall SF_SYSTEM, SSF_GET_THREAD_SLOT, [settings_win_pid] + xchg eax, ecx + mcall SF_SYSTEM, SSF_FOCUS_WINDOW + ret + @@: + mcall SF_CREATE_THREAD, 1, .thread, settings_win_stack + SETTINGS_WIN_STACK_SIZE + cmp eax, -1 + je @f + mov [settings_win_pid], eax + mov [settings_is_win_opened], 1 + @@: + ret + .thread: + mcall SF_SET_EVENTS_MASK, EVM_MOUSE + EVM_MOUSE_FILTER + EVM_REDRAW + EVM_BUTTON + EVM_KEY + call settings_load + call .draw_window + .loop: + mcall SF_WAIT_EVENT + dec eax + jz .win + dec eax + jz .key + dec eax + jz .btn + .mouse: + invoke edit_box_mouse, ed_port + invoke edit_box_mouse, ed_baud + invoke edit_box_mouse, ed_bits + invoke option_box_mouse, op_append + jmp .loop + .win: + call .draw_window + jmp .loop + .key: + mcall SF_GET_KEY + invoke edit_box_key, ed_port + invoke edit_box_key, ed_baud + invoke edit_box_key, ed_bits + jmp .loop + .btn: + mcall SF_GET_BUTTON + cmp ah, BTN_OK + jne @f + call settings_save + @@: + and [settings_is_win_opened], 0 + mcall SF_TERMINATE_PROCESS + + .draw_window: + mcall SF_REDRAW, SSF_BEGIN_DRAW + + mov edx, [sc.work] + or edx, 0x34000000 + mov esi, [sc.work] + mov edi, settings_win_name + + mov ebx, [pi.box.width] + shr ebx, 1 + add ebx, [pi.box.left] + sub ebx, SETTINGS_WIN_WIDTH / 2 + shl ebx, 16 + add ebx, SETTINGS_WIN_WIDTH + + mov ecx, [pi.box.height] + shr ecx, 1 + add ecx, [pi.box.top] + sub ecx, SETTINGS_WIN_HEIGHT / 2 + shl ecx, 16 + add ecx, SETTINGS_WIN_HEIGHT + + mcall SF_CREATE_WINDOW + mcall SF_THREAD_INFO, s_pi, -1 + + ; prevent drawing if the window is collapsed + test [s_pi.wnd_state], 0x04 + jnz .end_redraw + + mov ecx, 0x90000000 + or ecx, [sc.work_text] + mcall SF_DRAW_TEXT, , , port_conf_lbl + + add ebx, WIN_MARGIN * 2 + FONT_HEIGHT + mcall SF_DRAW_TEXT, , , port_lbl + mov word [ed_port.top], bx + + add ebx, WIN_MARGIN + ED_HEIGHT + mcall SF_DRAW_TEXT, , , baud_lbl + mov word [ed_baud.top], bx + + add ebx, WIN_MARGIN + ED_HEIGHT + mcall SF_DRAW_TEXT, , , bits_lbl + mov word [ed_bits.top], bx + + mcall SF_DRAW_TEXT, , , tx_text_lbl + + + edit_boxes_set_sys_color settings_win_edits_start, settings_win_edits_end, sc + invoke edit_box_draw, ed_port + invoke edit_box_draw, ed_baud + invoke edit_box_draw, ed_bits + option_boxes_set_sys_color sc, op_append + invoke option_box_draw, op_append + + mov ebx, WIN_MARGIN shl 16 + add ebx, [s_pi.client_box.width] + sub ebx, WIN_MARGIN + 1 + mov edx, [s_pi.client_box.height] + sub edx, SETTINGS_BTN_HEIGHT + WIN_MARGIN * 2 + mov ecx, edx + shl ecx, 16 + mov cx, dx + mov edx, [sc.work_graph] + mcall SF_DRAW_LINE + + mov ebx, [s_pi.client_box.width] + sub ebx, (SETTINGS_BTN_WIDTH + WIN_MARGIN) * 2 + shl ebx, 16 + add ebx, SETTINGS_BTN_WIDTH + mov ecx, [s_pi.client_box.height] + sub ecx, SETTINGS_BTN_HEIGHT + WIN_MARGIN + shl ecx, 16 + add ecx, SETTINGS_BTN_HEIGHT + mcall SF_DEFINE_BUTTON, , , BTN_OK, [sc.work_button] + + push ebx ecx + add ebx, 24 shl 16 + mov bx, word [s_pi.client_box.height] + sub bx, SETTINGS_BTN_HEIGHT + WIN_MARGIN - 5 + mov ecx, 0x90000000 + or ecx, [sc.work_button_text] + mcall SF_DRAW_TEXT, , , ok_lbl + pop ecx ebx + + add ebx, (SETTINGS_BTN_WIDTH + WIN_MARGIN) shl 16 + mcall SF_DEFINE_BUTTON, , , BTN_CANCEL, [sc.work_button] + + add ebx, 8 shl 16 + mov bx, word [s_pi.client_box.height] + sub bx, SETTINGS_BTN_HEIGHT + WIN_MARGIN - 5 + mov ecx, 0x90000000 + or ecx, [sc.work_button_text] + mcall SF_DRAW_TEXT, , , cancel_lbl + + .end_redraw: + mcall SF_REDRAW, SSF_END_DRAW + ret +endp + +proc settings_load + mov eax, [port_num] + mov ecx, 10 + mov edi, ed_port_val + call int_to_str + and byte [edi], 0 + mov esi, ed_port_val + call strlen + mov [ed_port.size], eax + mov [ed_port.pos], eax + + mov eax, [port_conf + SP_CONF.baudrate] + mov ecx, 10 + mov edi, ed_baud_val + call int_to_str + and byte [edi], 0 + mov esi, ed_baud_val + call strlen + mov [ed_baud.size], eax + + mov al, [port_conf + SP_CONF.word_size] + add al, '0' + mov [ed_bits_val], al + mov [ed_bits_val + 1], 0 + mov [ed_bits.size], 1 + + mov al, [text_append] + mov ebx, opt_append_none + cmp al, SETTINGS_APPEND_NONE + je .opt_append_ok + mov ebx, opt_append_lf + cmp al, SETTINGS_APPEND_LF + je .opt_append_ok + mov ebx, opt_append_crlf + .opt_append_ok: + mov [op_append_val], ebx + ret +endp + +proc settings_save + mov esi, ed_port_val + call str_to_uint + mov [port_num], ebx + + mov esi, ed_baud_val + call str_to_uint + mov [port_conf + SP_CONF.baudrate], ebx + + mov al, [ed_bits_val] + sub al, '0' + mov [port_conf + SP_CONF.word_size], al + + mov eax, [op_append_val] + mov bl, SETTINGS_APPEND_NONE + cmp eax, opt_append_none + je .opt_append_ok + mov bl, SETTINGS_APPEND_LF + cmp eax, opt_append_lf + je .opt_append_ok + mov bl, SETTINGS_APPEND_CRLF + .opt_append_ok: + mov [text_append], bl + ret +endp + +iglobal +settings_is_win_opened db 0 +settings_win_edits_start: +ed_port edit_box 70, 100, WIN_MARGIN, 0xffffff, 0x6f9480, \ + 0, 0, 0x10000000, 6, ed_port_val, mouse_dd, \ + ed_focus + ed_figure_only +ed_baud edit_box 70, 100, WIN_MARGIN * 2 + ED_HEIGHT, 0xffffff, 0x6f9480, \ + 0, 0, 0x10000000, 6, ed_baud_val, mouse_dd, \ + ed_figure_only +ed_bits edit_box 40, 100, WIN_MARGIN * 3 + ED_HEIGHT * 2, 0xffffff, 0x6f9480, \ + 0, 0, 0x10000000, 1, ed_bits_val, mouse_dd, \ + ed_figure_only +settings_win_edits_end: +opt_append_none option_box op_append_val, COL2, WIN_MARGIN * 2 + FONT_HEIGHT, 6, 12, 0, 0, 0, opt_lbl_nothing, 14 +opt_append_lf option_box op_append_val, COL2, WIN_MARGIN * 3 + OPT_HEIGHT+ FONT_HEIGHT, 6, 12, 0, 0, 0, opt_lbl_lf, 9 +opt_append_crlf option_box op_append_val, COL2, WIN_MARGIN * 4 + OPT_HEIGHT * 2+ FONT_HEIGHT, 6, 12, 0, 0, 0, opt_lbl_crlf, 11 +op_append dd opt_append_none, opt_append_lf, opt_append_crlf, 0 + +settings_win_name db 'kterm - settings', 0 +port_conf_lbl db 'Port settings', 0 +tx_text_lbl db 'Transmitted text', 0 +port_lbl db 'Port:', 0 +baud_lbl db 'Baudrate:', 0 +bits_lbl db 'Data bits:', 0 +ok_lbl db 'Ok', 0 +cancel_lbl db 'Cancel', 0 +opt_lbl_nothing db 'Append nothing', 0 +opt_lbl_lf db 'Append LF', 0 +opt_lbl_crlf db 'Append CRLF', 0 +endg + +uglobal +align 4 +settings_win_pid dd ? +op_append_val dd ? +s_pi process_information +ed_port_val rb 7 +ed_baud_val rb 7 +ed_bits_val rb 2 +settings_win_stack rb SETTINGS_WIN_STACK_SIZE +endg diff --git a/utils.inc b/utils.inc index 41d3c1e..d14cbbb 100644 --- a/utils.inc +++ b/utils.inc @@ -71,6 +71,7 @@ proc strlen mov eax, esi sub eax, ebx dec eax + dec esi pop ebx ret endp @@ -86,3 +87,59 @@ proc strcpy jnz @b ret endp + +proc escape_chars +; esi = source +; ecx = length + .loop: + mov al, [esi] + cmp al, 0x20 + jb .escape + cmp al, 0x80 + jae .escape + jmp .no_escape + .escape: + mov byte [esi], '.' + .no_escape: + inc esi + loop .loop + ret +endp + +proc make_line_header +; eax = 0 - rx, 1 - tx +; edi = dest buf + push eax + mcall SF_GET_SYS_TIME + mov ebx, eax + mov ecx, 3 + ; BCD timestamp to string + .loop: + mov al, bl + shr al, 4 + add al, '0' + stosb + mov al, bl + and al, 0x0f + add al, '0' + stosb + dec ecx + jz .done + mov al, ':' + stosb + shr ebx, 8 + jmp .loop + .done: + mov al, ' ' + stosb + mov al, '<' + pop ebx + test ebx, ebx + jz @f + mov al, '>' + @@: + stosb + mov al, ' ' + stosb + ret +endp