2 rem Relays control program in bwbasic 3.2 4-18-2020 ken.at.github@gmail.com 3 rem 4-18-2020 Added hardware check. Error traps and help. 4 rem As of 4-13-2020 Debian apt get install bwbasic installs an old 2.2. 5 rem Assumes bwbasic 3.2. bwbasic 2.2 has issues see changelog. 6 rem Download bwbasic-3.2a.tar file. Untar then cd bwbasic-3.2a then 7 rem make then sudo make install to uninstall sudo make remove 8 rem Set terminal to ANSI mode. Linux and Windows. Only 3.2 or newer 10 option terminal ANSI 11 call cls : rem Clear screen on initial startup. Only 3.2 or newer 12 call close : rem Close any open files. Again 3.2 or newer. 13 rem Trap errors 14 on error gosub 10000 15 gosub 9000 : rem Get Dogtag & Model & see if it's allowable hardware. 16 print : print "=== Relay games on ";DATE$;" at ";TIME$;" ===" : print " ";d$ 17 print " ";o$ 18 print 24 rem b$ = Base address as of Beaglebone Black Debian 10.3 3-26-2020 25 let b$="/sys/class/gpio/gpio" 50 print "0 Off, 1 On, s State, sa State All,"; 52 print " ao All Off, l Label, h for Help or x Exit "; : input m$ 60 IF m$ = "0" or m$ = "1" or m$ = "l" or m$ = "s" then : goto 70 : END IF 63 IF m$ = "x" or m$ = "e" then : system : END IF : rem Stop program. Exit to system. 64 IF m$ = "sa" then : print : print "Currently:" : gosub 500 : goto 16 : END IF : rem State all 65 IF m$ = "ao" then : print : print "Was:" : gosub 500 : print "Now:" : gosub 600 : goto 16 : END IF 66 IF m$ = "q" then : print "Bye" : stop : END IF : rem Stop program 67 IF m$ = "h" then : gosub 1000 : goto 16 : END IF 68 print "Mode error. Only 0, 1, s, l, ao All Off, sa State All "; 69 print "h Help or x allowed" : goto 50 70 print "Relay # = gpio: 1 = 20, 2 = 7, 3 = 112, 4 = 115 or r to Return. "; 71 input "Enter gpio # ";s$ 75 IF s$ = "20" or s$ = "7" or s$ = "112" or s$ = "115" then : goto 80 : END IF 76 IF s$ = "r" then : goto 16 : END IF : rem Start over 78 print "Relay gpio number error. Only 20, 7, 112, 115 or r" : goto 70 80 print 82 IF m$ = "l" then : gosub 400 : goto 16 : END IF : rem l = Label 84 IF m$ = "s" then : gosub 300 : print : goto 16 : END IF : rem s = State 86 IF m$ = "0" or m$ = "1" then : gosub 100 : goto 16 : END IF : rem Change Relay state 90 print : print "Error. Code fall through at line 90" : print : stop 100 rem Change state of a Relay. 101 rem p$ = Complete address to gpio. b$ is the Base + gpio# + end of string 102 let p$=b$ + s$ + "/value" 110 call open("O",#1,p$) : rem Open for Output and write m$ 150 print #1,m$ : rem Print to gpio string m$ 160 call close(#1) 210 call open("I",#1,p$) : rem Open for Input 250 read #1,x : rem Read numeric result 255 call close(#1) 256 IF s$ = "20" then : print "#1 "; : END IF 257 IF s$ = "7" then : print "#2 "; : END IF 258 IF s$ = "112" then : print "#3 "; : END IF 259 IF s$ = "115" then : print "#4 "; : END IF 260 gosub 700 299 return 300 rem p$ = Complete address to gpio. b$ is the Base + gpio# + end of string 304 let p$=b$ + s$ + "/value" 310 call open("I",#1,p$) : rem Open for Input 350 read #1,x : rem Read numeric result 355 call close(#1) 360 gosub 700 396 return : rem Start over 400 rem p$ = Complete address to gpio. b$ is the Base + gpio# + end of string 404 let p$=b$ + s$ + "/label" 410 call open("I",#1,p$) 420 read #1,l$ 425 call close(#1) 430 print "Label for gpio ";s$;" is ";l$ 440 return 500 rem Display the state of all Relays 'sa' 510 let s$ = "20" : print "#1 "; : gosub 300 520 let s$ = "7" : print "#2 "; : gosub 300 530 let s$ = "112" : print "#3 "; : gosub 300 540 let s$ = "115" : print "#4 "; : gosub 300 550 return 600 rem Turn all Relays off 'ao' 612 let m$ = "0" : rem Set mode to '0' off 620 let s$ = "20" : gosub 100 624 let s$ = "7" : gosub 100 626 let s$ = "112" : gosub 100 628 let s$ = "115" : gosub 100 630 return 700 rem Print relay state gathered from 'read' 704 print "Relay gpio ";s$," state is now = ";x; 770 IF x = 0 then : print " Off" : END IF 780 IF x = 1 then : print " On" : END IF 790 IF x > 1 or x < 0 then : print " Error" : END IF 799 return 1000 rem Give them some help 1010 print : print "Information" : print 1020 print "To change the state of a relay use 0 for Off or 1 for On" 1022 print " Then enter the gpio number 20, 7, 112 or 115" : print 1024 print "To check the state of a single relay use s" 1026 print " Then enter the gpio number" : print 1028 print "To get the associated label (header pin) use l" 1030 print " Then enter the gpio number" : print 1032 print "To get the state of all relays use sa" : print 1034 print "To turn all relays off use ao" : print 1035 print "For the latest updates goto:" 1036 print "https://github.com/kenmartin-unix/Bwbasic-3.2a-for-BeagleBone" 1038 print "ken.at.github@gmail.com" 1040 print : input "Press enter ? ",h 1099 return 9000 rem Get Model & Dogtag d$ = Dogtag 0$ = MOdel. Check for Beaglebone 'Black' 9002 rem If we fail here we should not. This only runs once at startup. 9004 call open("I",#1,"/etc/dogtag") : rem Open dogtag file 9008 read #1,d$ : call close(#1) 9014 call open("I",#1,"/proc/device-tree/model") : rem Open model info 9018 read #1,o$ : call close(#1) 9020 rem Lets see if it's a 'Black' 9025 IF (instr(1,o$,"Black") > 0) then : return : END IF 9055 print : print "Warning: It appears this is not a BeagleBone 'Black'" : print 9056 print "It appears to be : ";o$ 9057 print "Running : ";d$ 9058 system 10000 rem Trap errors here. Hopefuly you will not get here. 10020 print : print "Error code ";err;" Error line ";erl 10040 print 10041 IF (err = 2) then : print "A program syntax error." : print : system : END IF 10042 IF (err = 5) then : print "Trouble working with files." : print : system : END IF 10043 IF (erl > 9000) then : print "Trouble during initial setup." : print : system : END IF 10044 IF (err = 62) then : print "Reading past the end of file attempted." : print : END IF 10048 IF (err = 64) then : print "Invalid path. Verify open paths." : system : END IF 10060 rem CLOSE will fail on 2.2 and loop but not 3.2+ 10070 call close : rem Just in case something is open. 11100 system : rem Stop program