Real World Instrumentation with Python" # by J
Total Page:16
File Type:pdf, Size:1020Kb
CHAPTER 13 User Interfaces 7KH3ULQFLSOHRI/HDVW$VWRQLVKPHQW0DNHDXVHU LQWHUIDFHDVFRQVLVWHQWDQGDVSUHGLFWDEOHDVSRVVLEOH ¢$QRQ\PRXV 8QOHVVDQDSSOLFDWLRQLVGHHSO\HPEHGGHGRUVSHFLILFDOO\GHVLJQHGWRUXQDVDEDFN JURXQGSURFHVVLWZLOOSUREDEO\QHHGVRPHW\SHRIXVHULQWHUIDFH,QWKLVFKDSWHUZH ZLOOH[SORUHGLIIHUHQWZD\VWRFRPPXQLFDWHZLWKDXVHU:H¦OOVWDUWE\H[DPLQLQJZKDW \RXFDQGRZLWKMXVWWKHFRPPDQGOLQH1H[WZH¦OOORRNDWKRZWRXVHDQ$16,FDSDEOH WHUPLQDOHPXODWRUSURJUDPWRGLVSOD\GDWDDQGDFFHSWLQSXWDQGWKHQWKHcursesVFUHHQ FRQWUROSDFNDJHIRU3\WKRQ$IWHUWKLVZH¦OOPRYHWRWKHUHDOPRIEULJKWFRORUVIDQF\ JUDSKVLPDJHVDQGGLDORJVZLWKDORRNDWWKH7N,QWHU*8,WRRONLWSURYLGHGZLWK WKHVWDQGDUG3\WKRQGLVWULEXWLRQ:H¦OODOVRWDNHDTXLFNWRXURIWKHZ[3\WKRQ*8, SDFNDJH Text-Based Interfaces 7H[WEDVHGLQWHUIDFHVDUHWKHIRXQGDWLRQRIDOOGLVSOD\EDVHGFRPSXWHUXVHULQWHUIDFHV ,VD\GLVSOD\EDVHGEHFDXVHWHFKQLFDOO\WKHILUVWLQWHUIDFHVZHUHSDQHOVIXOORIOLJKWVDQG VZLWFKHV3ULQWLQJWHUPLQDOVFDPHQH[WEXWLWZDVQ¦WXQWLOWKHDGYHQWRI&57WHUPLQDOV WKDWKXPDQPDFKLQHLQWHUIDFH +0, GHYLFHVEHJDQWRFRPHLQWRWKHLURZQ The Console 7KHPRVWVWUDLJKWIRUZDUGZD\WRLQWHUDFWZLWKDQ\SURJUDP3\WKRQRURWKHUZLVHLV WKURXJKWKHFRQVROHLQWHUIDFH8QGHU:LQGRZVWKLVLVWKHVRFDOOHG£'26ER[¤RUWKH £FPG SURPSW¤ DV LW¦V FXUUHQWO\ NQRZQ WKH :LQGRZV VKHOO DSSOLFDWLRQ LV FDOOHG FPGH[H 2QD8QL[RU/LQX[V\VWHPLWLVWKHVKHOOSURPSWIRUVKEDVKNVKWVFKRU ZKDWHYHUHOVH\RXPD\KDSSHQWREHXVLQJIRUDVKHOOLQWHUIDFH,IQRZLQGRZPDQDJHU LVDFWLYHWKHZKROHVFUHHQLVWKHFRQVROHEXWLWEHKDYHVMXVWOLNHWKHZLQGRZHGIRUP 487 6HQGLQJGDWDWRWKHVKHOOLQWKHIRUPRIVWULQJVLVHDV\¢WKDW¦VZKDWWKHprintVWDWHPHQW GRHV*HWWLQJLQSXWEDFNIURPDXVHULVQRWDVLQWXLWLYHO\REYLRXVPDLQO\EHFDXVH3\ WKRQGRHVQRWKDYHFURVVSODWIRUPHTXLYDOHQWVRIgetch()RUgetche() JHWFKDUDFWHU DQGJHWFKDUDFWHUZLWKHFKRUHVSHFWLYHO\ ,WGRHVKRZHYHUKDYHWKHraw_input()EXLOW LQPHWKRGZKLFKFDQKDQGOHPRVWRIWKHFRPPRQXVHULQSXWFKRUHVDQGLWZRUNVRQ DOOWKHSODWIRUPVWKDW3\WKRQVXSSRUWV6KRUWO\,¦OOVKRZ\RXKRZWRXVHFW\SHVDQGWKH &UXQWLPHOLEUDU\IRUERWK/LQX[DQG:LQGRZVEXWILUVWOHW¦VVHHKRZPXFKZHFDQGR ZLWKMXVWWKHFRQVROHLQWHUIDFH Example console display :KLOH\RXFRXOGDOZD\VMXVWXVHRFFDVLRQDOprintVWDWHPHQWVWRRXWSXWGDWDWRWKH FRQVROHLWPLJKWEHGLIILFXOWIRUDXVHUWRWHOOZKDW¦VKDSSHQLQJDVWKHGDWDVFUROOVE\ RQWKHVFUHHQ(VWDEOLVKLQJDWHPSODWHIRUWKHGDWDGLVSOD\DQGXVLQJDIL[HGIRUPDW PDNHVWKHGDWDHDVLHUWRUHDGDQGJUHDWO\UHGXFHVXVHUIUXVWUDWLRQ DQGWKDWXVHUPLJKW EH\RX ,I\RXZDQWWRXVHDIL[HGIRUPDWIRUGDWDRXWSXWWRWKHFRQVROH\RX¦OOQHHGDWOHDVWWZR WKLQJVVRPHZD\WRFOHDUWKHVFUHHQDQGDWHPSODWHWRFRQWDLQ\RXUGDWD:H¦OOORRN DWWKHWHPSODWHILUVW 8QOHVVZHUHVRUWWR$16,WHUPLQDOFRQWUROVWULQJV GLVFXVVHGLQWKHQH[WVHFWLRQ D SURJUDPGRHVQ¦WKDYHDQ\ZD\WRSRVLWLRQWKHFXUVRULQWKHFRQVROHZLQGRZ(DFKOLQH LQWKHGLVSOD\QHHGVWRWDNHFDUHRILWVRZQSRVLWLRQLQJDQGGDWDGLVSOD\IRUPDWWLQJ 7KHOLVWLQJIRUconsole1.pyVKRZVKRZWKLVLVGRQH #! /usr/bin/python # console1.py # # Demonstrates console output using the built-in print method. # # Source code from the book "Real World Instrumentation with Python" # By J. M. Hughes, published by O'Reilly. import time ainstat = ['OFF','OFF','OFF','OFF'] aindata = [0.0, 0.0, 0.0, 0.0] discstate = ['OFF','OFF','OFF','OFF','OFF','OFF','OFF','OFF'] discin = [0,0,0,0,0,0,0,0] print '\n' * 50 print "" print "System Status" print "" print "Analog Input 0 : %10s %f" % (ainstat[0], aindata[0]) print "Analog Input 1 : %10s %f" % (ainstat[1], aindata[1]) print "Analog Input 2 : %10s %f" % (ainstat[2], aindata[2]) print "Analog Input 3 : %10s %f" % (ainstat[3], aindata[3]) print "" print "Discrete Input 0: %3s %d" % (discstate[0], discin[0]) 488 | Chapter 13:ಗUser Interfaces print "Discrete Input 1: %3s %d" % (discstate[1], discin[1]) print "Discrete Input 2: %3s %d" % (discstate[2], discin[2]) print "Discrete Input 3: %3s %d" % (discstate[3], discin[3]) print "Discrete Input 4: %3s %d" % (discstate[4], discin[4]) print "Discrete Input 5: %3s %d" % (discstate[5], discin[5]) print "Discrete Input 6: %3s %d" % (discstate[6], discin[6]) print "Discrete Input 7: %3s %d" % (discstate[7], discin[7]) print "" time.sleep(2) 9HUWLFDOSRVLWLRQLQJLVEDVHGRQWKHRUGHULQZKLFKWKHOLQHVDUHSULQWHGRXWWRWKH FRQVROHDQGKRUL]RQWDOSRVLWLRQLQJLVGHWHUPLQHGE\KRZHDFKOLQHLVIRUPDWWHG7KH OLQHRIFRGHLPPHGLDWHO\IROORZLQJWKHIRXUYDULDEOHLQLWLDOL]DWLRQOLQHVprint "\n" * 50VLPXODWHVD£FOHDUVFUHHQ¤E\JHQHUDWLQJEODQNOLQHV,XVHGEHFDXVH,KDYH ODUJHFRPPDQGOLQHZLQGRZVEXWJHQHUDWLQJPRUHEODQNOLQHVWKDQWKHZLQGRZVXS SRUWVGRHVQRWKXUWDQ\WKLQJ7KHUHVXOWORRNVOLNHWKLV System Status Analog Input 0 : ACTIVE 0.000000 Analog Input 1 : OFF 0.000000 Analog Input 2 : ACTIVE 0.000000 Analog Input 3 : OFF 0.000000 Discrete Input 0: OFF 0 Discrete Input 1: OFF 1 Discrete Input 2: OFF 0 Discrete Input 3: OFF 0 Discrete Input 4: OFF 0 Discrete Input 5: OFF 0 Discrete Input 6: OFF 0 Discrete Input 7: OFF 0 6LQFHWKHUDZFRQVROH,2GRHVQ¦WKDYHDJHQHULFFOHDUVFUHHQIXQFWLRQDVHULHVRISULQW VWDWHPHQWVZLWKHPSW\VWULQJVFDQEHXVHGWRVFUROORIIDQ\WKLQJFXUUHQWO\RQWKHGLVSOD\ LQRUGHUWRPDNHURRPIRUQHZGDWD1RWHWKDWLIWKHZLQGRZLVODUJHUWKDQWKHQXPEHU RIOLQHVLQWKHWHPSODWHWKHWHPSODWHWH[WZLOOHQGXSDWWKHERWWRPRIWKHZLQGRZ WKH ODVWOLQHSULQWHGZLOOEHMXVWDERYHWKHSURPSW +RZHYHUWKHUHLVDQRWKHUZD\:HFDQILQGRXWZKDWW\SHRI26WKHFRGHLVUXQQLQJ XQGHUDQGWKHQXVHWKHDSSURSULDWHPHWKRGWRLVVXHDVFUHHQFOHDUFRPPDQGOLNHWKLV def clrDisp(numlines=50): if os.name == "posix": os.system('clear') elif os.name in ("nt", "dos", "ce"): os.system('CLS') else: print '\n' * numlines +HUHLVDQH[DPSOHRIWKLVWHFKQLTXH #! /usr/bin/python # console2.py Text-Based Interfaces | 489 # # Demonstrates console output using the built-in print method and # an OS-specific screen clear technique. # # Source code from the book "Real World Instrumentation with Python" # By J. M. Hughes, published by O'Reilly. import time import os ainstat = ['OFF','OFF','OFF','OFF'] aindata = [0.0, 0.0, 0.0, 0.0] discstate = ['OFF','OFF','OFF','OFF','OFF','OFF','OFF','OFF'] discin = [0,0,0,0,0,0,0,0] def clrDisp(numlines=50): if os.name == "posix": os.system('clear') elif os.name in ("nt", "dos", "ce"): os.system('CLS') else: print '\n' * numlines def drawData(): print "" print "System Status" print "" print "Analog Input 0 : %10s %f" % (ainstat[0], aindata[0]) print "Analog Input 1 : %10s %f" % (ainstat[1], aindata[1]) print "Analog Input 2 : %10s %f" % (ainstat[2], aindata[2]) print "Analog Input 3 : %10s %f" % (ainstat[3], aindata[3]) print "" print "Discrete Input 0: %3s %d" % (discstate[0], discin[0]) print "Discrete Input 1: %3s %d" % (discstate[1], discin[1]) print "Discrete Input 2: %3s %d" % (discstate[2], discin[2]) print "Discrete Input 3: %3s %d" % (discstate[3], discin[3]) print "Discrete Input 4: %3s %d" % (discstate[4], discin[4]) print "Discrete Input 5: %3s %d" % (discstate[5], discin[5]) print "Discrete Input 6: %3s %d" % (discstate[6], discin[6]) print "Discrete Input 7: %3s %d" % (discstate[7], discin[7]) print "" ainstat[1] = "ACTIVE" ainstat[3] = "ACTIVE" aindata[1] = 5.2 aindata[3] = 8.9 discstate[0] = "ON" discin[0] = 1 clrDisp() drawData() time.sleep(1.0) ainstat[1] = "OFF" ainstat[3] = "OFF" aindata[1] = 0.0 490 | Chapter 13:ಗUser Interfaces aindata[3] = 0.0 ainstat[0] = "ACTIVE" ainstat[2] = "ACTIVE" aindata[0] = 5.2 aindata[2] = 8.9 discstate[0] = "OFF" discin[0] = 0 discstate[1] = "ON" discin[1] = 1 clrDisp() drawData() time.sleep(1.0) 1RZZHKDYHWKHIRXQGDWLRQIRUDXVDEOHWH[WEDVHGGLVSOD\7RXSGDWHWKHGLVSOD\ WKHVFUHHQLVILUVWFOHDUHGXVLQJWKHDSSURSULDWHFRPPDQGDQGWKHQWKHOLQHVIURPWKH WHPSODWHDUHZULWWHQXVLQJWKHprintPHWKRG7KLVUHVXOWVLQTXLFNHUVFUHHQUHJHQHUDWLRQ WKDQWKHPXOWLSOHOLQHVPHWKRGDQGLWORRNVQLFHUWRR,IWKH26FDQQRWEHGHWHUPLQHG WKHIXQFWLRQGHIDXOWVWRWKHEODQNOLQHPHWKRGWRFOHDUWKHGLVSOD\)LJXUHVKRZV WKHIORZFKDUWIRUDWH[WEDVHGFRQVROHGDWDGLVSOD\EDVHGRQZKDWZH¦YHVHHQVRIDU Reading user input 1RZZHKDYHDPHDQVWRGLVSOD\GDWDEXWWKHUH¦VVWLOORQHWKLQJPLVVLQJXVHULQSXW )RUWXQDWHO\3\WKRQGRHVKDYHDRQHVL]HILWVDOOLQSXWPHWKRGWRUHDGLQSXWIURPWKH FRQVROH7KHraw_input()PHWKRGUHDGVDOLQHRILQSXWIURPWKHFRQVROHDQGUHWXUQVLW DVDVWULQJ$OLQHLQWKLVFDVHLVGHILQHGDV]HURRUPRUHFKDUDFWHUVWHUPLQDWHGZLWKDQ (2/7KH(2/ZLOOQRWEHDSSHQGHGWRWKHVWULQJUHWXUQHGE\raw_input() 7KHraw_input()PHWKRGFDQDOVRGLVSOD\DSURPSWVWULQJDQGLIWKHreadlinePRGXOH LVLQVWDOOHGLWZLOOXVHWKDWWRVXSSRUWLQSXWOLQHHGLWLQJDQGSURYLGHLQSXWKLVWRU\+HUH LVWKHWKLUGLWHUDWLRQRIWKHFRQVROHH[DPSOHZLWKraw_input()LQFRUSRUDWHGLQWRWKH FRGH #! /usr/bin/python # console3.py # # Demonstrates console output using the built-in print method and the # raw_input() method. # # Source code from the book "Real World Instrumentation with Python" # By J. M. Hughes, published by O'Reilly. import time import os ainstat = ['OFF','OFF','OFF','OFF'] aindata = [0.0, 0.0, 0.0, 0.0] discstate = ['OFF','OFF','OFF','OFF','OFF','OFF','OFF','OFF'] discin = [0,0,0,0,0,0,0,0] x = 0 def initData(): Text-Based Interfaces | 491 global ainstat, aindata, discstate, discin ainstat = ['OFF','OFF','OFF','OFF'] aindata = [0.0, 0.0, 0.0, 0.0] discstate = ['OFF','OFF','OFF','OFF','OFF','OFF','OFF','OFF'] discin = [0,0,0,0,0,0,0,0] def readData(): global ainstat, aindata, discstate, discin, x initData() discstate[x] = 'ON' discin[x] = 1 x += 1 if x > (len(discin) - 1): x = 0 def clrDisp(numlines=50): if os.name == "posix": os.system('clear') elif os.name in ("nt", "dos", "ce"): os.system('CLS') else: print '\n' * numlines def drawData(): print "" print "System Status" print "" print "Analog Input 0 : %10s %f" % (ainstat[0], aindata[0]) print "Analog Input 1 : %10s %f" % (ainstat[1], aindata[1]) print "Analog Input 2 : %10s %f" % (ainstat[2], aindata[2]) print "Analog Input 3 : %10s %f" % (ainstat[3], aindata[3]) print "" print "Discrete Input 0: %3s %d" % (discstate[0], discin[0]) print "Discrete Input 1: %3s %d" % (discstate[1], discin[1]) print "Discrete Input 2: %3s %d" % (discstate[2], discin[2])