100 REM SIODOS.BAS 110 REM 120 REM Copyright 1998 by Industrologic, Inc. 130 REM 140 REM When used in its entirety, this BASIC language source code can be 150 REM run using GWBASIC, or compiled and run using Microsoft QuickBASIC. 160 REM (Use the extended communication buffer option for both, /C:32767) 170 REM 180 REM This program is essentially a "dumb terminal" program capable of 190 REM sending commands to the SIO1000 manually and receiving its responses, 200 REM along with the additional capabilty to send preselected commands to 210 REM the SIO1000 and display those responses. 220 REM 230 REM An effort was made to make the individual routines that communicate 240 REM with the SIO1000 as self-contained as possible so that they can be 250 REM used alone. For this reason in-line code has been used in some of 260 REM the routines that could have been put in a common subroutine. 270 REM 280 KEY OFF:FOR A=1 TO 10:KEY A,"":NEXT A:LOCATE ,,0 290 CLS 300 PRINT " SIODOS" 310 PRINT " Copyright 1998 by Industrologic, Inc." 320 PRINT:PRINT 330 PRINT " This program is provided by Industrologic, Inc. for the sole purpose" 340 PRINT " of demonstrating how to communicate with the Industrologic, Inc." 350 PRINT " model SIO1000 interface, and for no other purpose." 360 PRINT:PRINT 370 PRINT " Warning - Disclaimer" 380 PRINT 390 PRINT " This software is provided `as is' without warranty of any kind." 400 PRINT " The entire risk as to the result and performance of this software" 410 PRINT " or any part of it as well as its fitness for a particular use is" 420 PRINT " assumed by the user. Neither Industrologic, Inc. nor any of its" 430 PRINT " employees shall have any liability for, nor responsibility to any" 440 PRINT " person or entity with respect to loss or damage caused or alleged" 450 PRINT " to be caused directly or indirectly by this software." 460 PRINT:PRINT:PRINT 470 PRINT " hit any key to continue" 480 IN$=INKEY$:IF IN$="" THEN 480 490 REM --------------------------------------------------------------------- 500 CLS 520 PRINT "Industrologic, Inc. SIO-1000 Demonstration/Test Program" 530 PRINT "Version 9/1/98" 550 PRINT 560 PRINT "----- COM1 ----- ----- COM2 -----" 570 PRINT "(A) 150,N,8,1 (B) 150,N,8,1" 580 PRINT "(C) 300,N,8,1 (D) 300,N,8,1" 590 PRINT "(E) 600,N,8,1 (F) 600,N,8,1" 600 PRINT "(G) 1200,N,8,1 (H) 1200,N,8,1" 610 PRINT "(I) 2400,N,8,1 (J) 2400,N,8,1" 620 PRINT "(K) 4800,N,8,1 (L) 4800,N,8,1" 630 PRINT "(M) 9600,N,8,1 (N) 9600,N,8,1" 640 PRINT "(0) 19200,N,8,1 (P) 19200,N,8,1" 650 PRINT:PRINT "Select port and baud rate" 660 PRINT "or hit ESCape to exit program" 700 B$=INKEY$:IF B$="" THEN 700 710 IF B$="A" OR B$="a" THEN PORT$="COM1":BAUD$="150":GOTO 900 720 IF B$="B" OR B$="b" THEN PORT$="COM2":BAUD$="150":GOTO 900 730 IF B$="C" OR B$="c" THEN PORT$="COM1":BAUD$="300":GOTO 900 740 IF B$="D" OR B$="d" THEN PORT$="COM2":BAUD$="300":GOTO 900 750 IF B$="E" OR B$="e" THEN PORT$="COM1":BAUD$="600":GOTO 900 760 IF B$="F" OR B$="f" THEN PORT$="COM2":BAUD$="600":GOTO 900 770 IF B$="G" OR B$="g" THEN PORT$="COM1":BAUD$="1200":GOTO 900 780 IF B$="H" OR B$="h" THEN PORT$="COM2":BAUD$="1200":GOTO 900 790 IF B$="I" OR B$="i" THEN PORT$="COM1":BAUD$="2400":GOTO 900 800 IF B$="J" OR B$="j" THEN PORT$="COM2":BAUD$="2400":GOTO 900 810 IF B$="K" OR B$="k" THEN PORT$="COM1":BAUD$="4800":GOTO 900 820 IF B$="L" OR B$="l" THEN PORT$="COM2":BAUD$="4800":GOTO 900 830 IF B$="M" OR B$="m" THEN PORT$="COM1":BAUD$="9600":GOTO 900 840 IF B$="N" OR B$="n" THEN PORT$="COM2":BAUD$="9600":GOTO 900 850 IF B$="O" OR B$="o" THEN PORT$="COM1":BAUD$="19200":GOTO 900 860 IF B$="P" OR B$="p" THEN PORT$="COM2":BAUD$="19200":GOTO 900 870 IF B$=CHR$(27) THEN END 880 GOTO 700 900 ON ERROR GOTO 5500:REM IF ERROR OPENING PORT 910 CLOSE:OPEN PORT$+":"+BAUD$+",N,8,1,CS,DS,CD" AS #1 920 ON ERROR GOTO 0 990 REM ----- 1000 CLS 1010 PRINT "Industrologic, Inc. SIO-1000 Demonstration/Test Program" 1020 PRINT 1030 PRINT "(T) Terminal emulation mode" 1040 PRINT "(C) Continuous display/set functions" 1050 PRINT:PRINT "Select function or hit ESCape to go back" 1100 B$=INKEY$:IF B$="" THEN 1100 1120 IF B$="T" OR B$="t" THEN 1500 1130 IF B$="C" OR B$="c" THEN 6000 1140 IF B$=CHR$(27) THEN 500 1150 GOTO 1100 1490 REM --------------------------------------------------------------------- 1500 CLS 1510 PRINT "Industrologic, Inc. SIO-1000 Demonstration/Test Program" 1520 PRINT "Terminal emulation mode" 1530 PRINT 1540 PRINT "Commands can be entered manually with their hexidecimal values, or" 1550 PRINT "the following keys can be used to enter commands with decimal values" 1560 PRINT 1570 PRINT " Read Inputs: 1580 PRINT "F1 Digital Inputs" 1590 PRINT "F2 Analog Input 0" 1600 PRINT "F3 Analog Input 1" 1610 PRINT "F4 Pulse Counter Input Shift F4 Read Counter & reset" 1620 PRINT "F5 Send SIO ID characters Shift F5 Reset Hardware & send ID" 1630 PRINT 1640 PRINT " Read set value of outputs: Set outputs:" 1650 PRINT "F6 Digital Output Shift F6 Digital Outputs" 1660 PRINT "F7 Analog Output 0 Shift F7 Analog Output 0" 1670 PRINT "F8 Analog Output 1 Shift F8 Analog Output 1" 1680 PRINT "F9 Waveform Output frequency Shift F9 Waveform Output frequency" 1690 PRINT "F10 Waveform Output duty cycle Shift F10 Waveform Output duty cycle" 1700 PRINT 1710 PRINT "Space Bar Redisplay this list of commands" 1720 PRINT 1730 PRINT "ESCape Exit terminal emulation" 1740 LOCATE ,,1 1750 REM ----- ENTRY POINT AFTER COMMUNICATION ERROR 2000 ON ERROR GOTO 5000:REM IF ERROR DURING COMMUNICATION 2010 REM ----- CHECK FOR CHARACTER AT PORT 2100 IF EOF(1) THEN 2200 2110 A$=INPUT$(1,#1) 2120 IF A$=CHR$(8) THEN A$=CHR$(29)+" "+CHR$(29):REM SPECIAL CASE FOR BACKSPACE 2130 IF A$=CHR$(10) THEN 2100:REM DO NOT DISPLAY IF LINE FEED 2140 PRINT A$; 2150 REM ----- CHECK FOR KEY HIT 2200 B$=INKEY$:IF B$="" THEN 2000 2210 IF B$=CHR$(0)+CHR$(59) THEN GOSUB 3000:GOTO 2100:REM F1 2220 IF B$=CHR$(0)+CHR$(60) THEN GOSUB 3100:GOTO 2100:REM F2 2230 IF B$=CHR$(0)+CHR$(61) THEN GOSUB 3200:GOTO 2100:REM F3 2240 IF B$=CHR$(0)+CHR$(62) THEN GOSUB 3400:GOTO 2100:REM F4 2250 IF B$=CHR$(0)+CHR$(63) THEN GOSUB 2600:GOTO 2100:REM F5 2260 IF B$=CHR$(0)+CHR$(64) THEN GOSUB 3500:GOTO 2100:REM F6 2270 IF B$=CHR$(0)+CHR$(65) THEN GOSUB 3600:GOTO 2100:REM F7 2280 IF B$=CHR$(0)+CHR$(66) THEN GOSUB 3700:GOTO 2100:REM F8 2290 IF B$=CHR$(0)+CHR$(67) THEN GOSUB 3800:GOTO 2100:REM F9 2300 IF B$=CHR$(0)+CHR$(68) THEN GOSUB 3900:GOTO 2100:REM F10 2310 IF B$=" " THEN 1500:REM REDISPLAY MENU 2320 IF B$=CHR$(27) THEN ON ERROR GOTO 0:GOTO 1000:REM ESCAPE KEY TO EXIT 2330 IF B$=CHR$(0)+CHR$(87) THEN GOSUB 3430:GOTO 2100:REM SHIFT F4 2340 IF B$=CHR$(0)+CHR$(88) THEN GOSUB 2500:GOTO 2100:REM SHIFT F5 2350 IF B$=CHR$(0)+CHR$(89) THEN GOSUB 4000:GOTO 2100:REM SHIFT F6 2360 IF B$=CHR$(0)+CHR$(90) THEN GOSUB 4200:GOTO 2100:REM SHIFT F7 2370 IF B$=CHR$(0)+CHR$(91) THEN GOSUB 4400:GOTO 2100:REM SHIFT F8 2380 IF B$=CHR$(0)+CHR$(92) THEN GOSUB 4600:GOTO 2100:REM SHIFT F9 2390 IF B$=CHR$(0)+CHR$(93) THEN GOSUB 4800:GOTO 2100:REM SHIFT F10 2400 PRINT #1,B$; 2410 GOTO 2000 2420 REM ---------- 2500 PRINT "Sending R":REM RESET HARDWARE AND REQUEST ID CHARACTERS 2510 PRINT #1, "R" 2520 RETURN 2530 REM ---------- 2600 PRINT "Sending r":REM REQUEST ID CHARACTERS 2610 PRINT #1, "r" 2620 RETURN 2630 REM ---------- 3000 PRINT "Sending P":REM READ DIGITAL INPUT PORT 3010 PRINT #1, "P" 3020 RETURN 3030 REM ---------- 3100 PRINT "Sending A":REM READ ANALOG INPUT 0 3110 PRINT #1, "A" 3120 RETURN 3130 REM ---------- 3200 PRINT "Sending B":REM READ ANALOG INPUT 1 3210 PRINT #1, "B" 3220 RETURN 3230 REM ---------- 3400 PRINT "Sending C":REM READ COUNT 3410 PRINT #1, "C" 3420 RETURN 3425 REM ---------- 3430 PRINT "Sending c":REM READ COUNT AND RESET COUNTER 3440 PRINT #1, "c" 3450 RETURN 3460 REM ---------- 3500 PRINT "Sending p":REM READ DIGITAL OUTPUT PORT SET VALUE 3510 PRINT #1, "p" 3520 RETURN 3530 REM ---------- 3600 PRINT "Sending a":REM READ ANALOG OUTPUT 0 SET VALUE 3610 PRINT #1, "a" 3620 RETURN 3630 REM ---------- 3700 PRINT "Sending b":REM READ ANALOG OUTPUT 1 SET VALUE 3710 PRINT #1, "b" 3720 RETURN 3730 REM ---------- 3800 PRINT "Sending f":REM READ WAVEFORM FREQUENCY MODE SET VALUES 3810 PRINT #1, "f" 3820 RETURN 3830 REM ---------- 3900 PRINT "Sending w":REM READ WAVEFORM DUTY CYCLE MODE SET VALUES 3910 PRINT #1, "w" 3920 RETURN 3930 REM ---------- 4000 PRINT "Enter Digital Output port value in decimal from 0 to 255: "; 4010 LINE INPUT I$:I=VAL(I$):H$=HEX$(I) 4020 IF I$="" THEN 4000 4030 IF I<0 OR I>255 THEN 4000 4040 IF LEN(H$)<2 THEN H$="0"+H$ 4050 PRINT "Sending P"+H$+"":REM SET DIGITAL OUTPUTS 4060 PRINT #1, "P"+H$ 4070 RETURN 4080 REM ---------- 4200 PRINT "Enter Analog Output 0 value in decimal from 0 to 4095: "; 4210 LINE INPUT I$:I=VAL(I$):H$=HEX$(I) 4220 IF I$="" THEN 4200 4230 IF I<0 OR I>4095 THEN 4200 4240 IF LEN(H$)<3 THEN H$="0"+H$:GOTO 4240 4250 PRINT "Sending A"+H$+"":REM SET ANALOG OUTPUT 0 4260 PRINT #1, "A"+H$ 4270 RETURN 4280 REM ---------- 4400 PRINT "Enter Analog Output 1 value in decimal from 0 to 4095: "; 4410 LINE INPUT I$:I=VAL(I$):H$=HEX$(I) 4420 IF I$="" THEN 4400 4430 IF I<0 OR I>4095 THEN 4400 4440 IF LEN(H$)<3 THEN H$="0"+H$:GOTO 4440 4450 PRINT "Sending B"+H$+"":REM SET ANALOG OUTPUT 1 4460 PRINT #1, "B"+H$ 4470 RETURN 4480 REM ---------- 4600 PRINT "Waveform Output will be continuous-" 4610 PRINT "Enter frequency value in decimal from 15 to 5000 HZ: "; 4620 LINE INPUT I$:I=VAL(I$) 4630 IF I$="" THEN 4600 4640 IF I=0 THEN 4660 4650 IF I<15 OR I>5000 THEN 4600 4660 H$=HEX$(I) 4670 IF LEN(H$)<4 THEN H$="0"+H$:GOTO 4670 4688 PRINT "Sending F"+H$+"":REM SET WAVEFORM FREQUENCY OUTPUT 4690 PRINT #1, "F"+H$ 4700 RETURN 4710 REM ---------- 4800 PRINT "Waveform Output used will be type 1 (92 HZ)-" 4810 PRINT "Enter duty cycle value in decimal from 1 to 99: "; 4820 LINE INPUT I$:I=VAL(I$) 4830 IF I$="" THEN 4800 4840 IF I=0 THEN 4860 4850 IF I<1 OR I>99 THEN 4800 4860 H$=HEX$(I) 4870 IF LEN(H$)<2 THEN H$="0"+H$ 4880 PRINT "Sending W1"+H$+"":REM SET TYPE 1 WAVEFORM DUTY CYCLE OUTPUT 4890 PRINT #1, "W1"+H$ 4900 RETURN 4990 REM ------- ERRORS DURING TERMINAL EMULATION ------- 5000 IF ERR=57 THEN RESUME 5030:REM DEVICE I/O 5010 IF ERR=69 THEN RESUME 5060:REM COMMUNICATION BUFFER OVERFLOW 5020 END 5030 ON ERROR GOTO 0 5040 PRINT:PRINT "overrun, framing, parity, or break error":PRINT 5050 GOTO 2000 5060 ON ERROR GOTO 0 5070 PRINT:PRINT "receive buffer has overflowed - data will be missing":PRINT 5080 GOTO 2000 5090 REM ------- ERRORS OPENING COM PORT ------- 5500 IF ERR=24 THEN RESUME 5530:REM DEVICE TIMEOUT 5510 IF ERR=68 THEN RESUME 5530:REM DEVICE UNAVAILABLE 5520 END 5530 ON ERROR GOTO 0 5540 CLS:PRINT PORT$+" is not available or is not responding" 5550 T=TIMER 5560 IF TIMER0 THEN DUMMY$=INPUT$(LOC(1),#1):REM CLEAR RECEIVE BUFFER 6520 PRINT #1,"P":REM SEND COMMAND 6530 T=TIMER 6540 IF LOC(1)>=3 THEN 6630:REM CHECK FOR ENOUGH CHARACTERS RECEIVED 6550 IF TIMER>T+2 THEN 6580:REM NOT ENOUGH CHARACTERS IN TIME 6560 GOTO 6540 6570 REM --- 6580 CLS:PRINT "Timeout waiting for SIO-1000 to respond..." 6590 T=TIMER 6600 IF TIMER0 THEN DUMMY$=INPUT$(LOC(1),#1):REM CLEAR RECEIVE BUFFER 7020 PRINT #1,"A":REM SEND COMMAND 7030 T=TIMER 7040 IF LOC(1)>=3 THEN 7130:REM CHECK FOR ENOUGH CHARACTERS RECEIVED 7050 IF TIMER>T+2 THEN 7080:REM NOT ENOUGH CHARACTERS IN TIME 7060 GOTO 7040 7070 REM --- 7080 CLS:PRINT "Timeout waiting for SIO-1000 to respond..." 7090 T=TIMER 7100 IF TIMER0 THEN DUMMY$=INPUT$(LOC(1),#1):REM CLEAR RECEIVE BUFFER 7520 PRINT #1,"B":REM SEND COMMAND 7530 T=TIMER 7540 IF LOC(1)>=3 THEN 7630:REM CHECK FOR ENOUGH CHARACTERS RECEIVED 7550 IF TIMER>T+2 THEN 7580:REM NOT ENOUGH CHARACTERS IN TIME 7560 GOTO 7540 7570 REM --- 7580 CLS:PRINT "Timeout waiting for SIO-1000 to respond..." 7590 T=TIMER 7600 IF TIMER0 THEN DUMMY$=INPUT$(LOC(1),#1):REM CLEAR RECEIVE BUFFER 8020 PRINT #1,CC$:REM SEND COMMAND 8030 T=TIMER 8040 IF LOC(1)>=4 THEN 8130:REM CHECK FOR ENOUGH CHARACTERS RECEIVED 8050 IF TIMER>T+2 THEN 8080:REM NOT ENOUGH CHARACTERS IN TIME 8060 GOTO 8040 8070 REM --- 8080 CLS:PRINT "Timeout waiting for SIO-1000 to respond..." 8090 T=TIMER 8100 IF TIMER