(* Rev 1 - re-shuffled control-\ commands to make room for BREAK B.E. *) type string20 = string[20]; string80= string[80]; const revision = 1; maxbuffer = 32767; cr = ^m^j; online_msg = '*** Connected to remote port ***'^m^j; offline_msg = '*** At micro ***'^m^j; escape_char = ^\; var abort, logging, file_open, connect_end : boolean; initport : string[10]; line_buffer : string[100]; buffer : array[0..maxbuffer] of char; bufptr, cr_delay : integer; file_var : text; filename : string[20]; previous_char : char; {$I commlib.inc} procedure menu; begin writeln; write(offline_msg); writeln('Current port is ',c_port_str[c_current_port]); writeln('Current baud rate is ', c_baud_str[c_current_baud]); writeln('Current parity is ', c_parity_str[c_current_parity]); writeln; Writeln('^\-B - Transmit BREAK.'); writeln('^\-D - Set delay after carriage return'); writeln('^\-E - Exit program.'); writeln('^\-G - Get (receive) a file.'); writeln('^\-H - Menu.'); writeln('^\-P - Set port.'); writeln('^\-Q - Exit program.'); writeln('^\-R - Set baud Rate.'); writeln('^\-S - Send a file.'); writeln('^\-W - Write buffer and close file.'); write(online_msg); end; procedure close_file; var count : integer; begin if file_open and (bufptr > 0) then begin for count := 0 to bufptr - 1 do write(file_var,buffer[count]); close(file_var); file_open := false; end; logging := false; bufptr := 0; end; procedure writescr(message : string80); var count : integer; begin for count := 1 to length(message) do c_put_scr_char(message[count]); end; procedure set_port; var count, port : integer; begin writescr(cr); writescr(offline_msg); writeln; writeln('Current port is ',c_port_str[c_current_port]); writeln('Possible ports are:'); count := 1; while c_port_str[count] <> '' do begin writeln(count, ' - ',c_port_str[count]); count := count + 1; end; write('Type the number of the desired port: '); readln(port); if c_set_port(port) then writeln('Port set to: ',c_port_str[c_current_port]) else writeln('Invalid port select, port remains ', c_port_str[c_current_port]); writescr(cr); writescr(online_msg); end; procedure set_baud; var count, baud : integer; begin writescr(offline_msg); writeln; writeln('Current baud rate is ',c_baud_str[c_current_baud]); writeln('Possible baud rates are:'); count := 1; while c_baud_str[count] <> '' do begin writeln(count, ' - ',c_baud_str[count]); count := count + 1; end; write('Type the number of the desired baud rate: '); readln(baud); if c_set_baud(baud) then writeln('Baud rate set to: ',c_baud_str[c_current_baud]) else begin write('Invalid baud rate select, baud rate remains '); writeln(c_baud_str[c_current_baud]); end; writescr(online_msg); end; procedure send; var count : integer; line : string[100]; begin writescr(offline_msg); writescr('Filename to send: '); readln(filename); assign(file_var, filename); {$i-} reset(file_var); {$i+} if ioresult = 0 then begin file_open := true; bufptr := 1; while (not eof(file_var)) and (not c_get_kbd_char) do begin read(file_var,line); for count := 1 to length(line) do begin c_put_comm_char(line[count]); while c_get_comm_char do c_put_scr_char(c_comm_char); end; c_put_comm_char(^m); for count := 0 to (10 * cr_delay) do while c_get_comm_char do c_put_scr_char(c_comm_char); readln(file_var); end; end else writescr('File not found'^m^j); if file_open then begin close(file_var); file_open := false; end; writescr(online_msg); end; procedure receive; var count : integer; filename : string[20]; open_ok,connect_end : boolean; begin writescr(offline_msg); write('Filename: '); readln(filename); assign(file_var,filename); {$I-} rewrite(file_var); {$I+} if ioresult <> 0 then writeln('File could not be opened!') else begin file_open := true; bufptr := 0; logging := true; end; writescr(online_msg); end; procedure set_delay; begin writescr(offline_msg); write('Current delay value is: ',cr_delay,'. Enter new value: '); readln(cr_delay); writescr(online_msg); end; procedure connect; begin menu; connect_end := false; previous_char := ' '; repeat if c_get_kbd_char then begin if (previous_char = escape_char) or (c_kbd_char = escape_char) then begin case chr(ord(c_kbd_char) and $9f) of ^b : if NOT c_send_break then writeln('** BREAK not implemented **'); ^d : set_delay; ^g : receive; ^h : menu; ^p : set_port; ^s : send; ^r : set_baud; ^q,^e : begin close_file; abort := c_reset; halt; end; ^w : close_file; escape_char : ; end; previous_char := c_kbd_char; end else begin c_put_comm_char(c_kbd_char); previous_char := c_kbd_char; end; end; if c_get_comm_char then begin c_comm_char := chr(ord(c_comm_char) and $7f); c_put_scr_char(c_comm_char); if logging then begin buffer[bufptr] := c_comm_char; bufptr := bufptr + 1; end; end; until connect_end; end; begin lowvideo; cr_delay := 0; bufptr := 0; logging := false; file_open := false; writeln('Communications Demo Program Rev. ', revision); writeln('Comm Library version ',c_lib_version); if not c_init(1,1,1) then begin writeln('Initialization failed!'); abort := true; end else abort := false; if not abort then repeat connect; until connect_end; abort := c_reset; end.