92 lines
2.6 KiB
Python
Executable File
92 lines
2.6 KiB
Python
Executable File
#!/usr/bin/env python
|
|
import pifacedigitalio
|
|
import pifacecommon.mcp23s17
|
|
import sys
|
|
|
|
button_count = 2
|
|
|
|
# dirty workaround to disable reset of output pins
|
|
def init_board_no_power_off(self):
|
|
ioconfig = (
|
|
pifacecommon.mcp23s17.BANK_OFF |
|
|
pifacecommon.mcp23s17.INT_MIRROR_OFF |
|
|
pifacecommon.mcp23s17.SEQOP_OFF |
|
|
pifacecommon.mcp23s17.DISSLW_OFF |
|
|
pifacecommon.mcp23s17.HAEN_ON |
|
|
pifacecommon.mcp23s17.ODR_OFF |
|
|
pifacecommon.mcp23s17.INTPOL_LOW
|
|
)
|
|
self.iocon.value = ioconfig
|
|
if self.iocon.value != ioconfig:
|
|
raise pifacedigitalio.NoPiFaceDigitalDetectedError(
|
|
"No PiFace Digital board detected (hardware_addr={h}, "
|
|
"bus={b}, chip_select={c}).".format(
|
|
h=self.hardware_addr, b=self.bus, c=self.chip_select))
|
|
else:
|
|
self.iodira.value = 0 # GPIOA as outputs
|
|
self.iodirb.value = 0xFF # GPIOB as inputs
|
|
self.gppub.value = 0xFF # input pullups on
|
|
self.enable_interrupts()
|
|
|
|
setattr(pifacedigitalio.PiFaceDigital, 'init_board', init_board_no_power_off)
|
|
|
|
def chch_status(pfd):
|
|
for i in range(button_count):
|
|
if pfd.output_pins[i].value != 0:
|
|
print(str(i) + ' on')
|
|
else:
|
|
print(str(i) + ' off')
|
|
|
|
def chch_all_off(pfd):
|
|
for i in range(button_count):
|
|
pfd.output_pins[i].turn_off()
|
|
|
|
def chch_all_on(pfd):
|
|
for i in range(button_count):
|
|
pfd.output_pins[i].turn_on()
|
|
|
|
def chch_off(pfd, i):
|
|
pfd.output_pins[i].turn_off()
|
|
|
|
def chch_on(pfd, i):
|
|
print(i)
|
|
pfd.output_pins[i].turn_on()
|
|
|
|
def help():
|
|
print('valid commands: status, on <room_number>, off <room_number>, all_on, all_off')
|
|
|
|
alias = {'lounge': 0, 'elabor': 1}
|
|
|
|
if __name__ == "__main__":
|
|
# listener = pifacedigitalio.InputEventListener()
|
|
# listener.activate()
|
|
# chch_status_output(listener.chip)
|
|
pifc = pifacedigitalio.PiFaceDigital()
|
|
room_number = ''
|
|
if len(sys.argv) == 3:
|
|
try:
|
|
room_number = int(sys.argv[2])
|
|
if room_number < 0 or room_number > button_count-1:
|
|
raise Exception('Out of range')
|
|
except ValueError:
|
|
room_number = alias.get(sys.argv[2])
|
|
except:
|
|
room_number = ''
|
|
try:
|
|
command = sys.argv[1]
|
|
except:
|
|
help()
|
|
exit(1)
|
|
if command=='status':
|
|
chch_status(pifc)
|
|
elif command=='all_off':
|
|
chch_all_off(pifc)
|
|
elif command=='all_on':
|
|
chch_all_on(pifc)
|
|
elif command=='off' and isinstance( room_number, int ):
|
|
chch_off(pifc, room_number)
|
|
elif command=='on' and isinstance( room_number, int ):
|
|
chch_on(pifc, room_number)
|
|
else:
|
|
help()
|