You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
138 lines
4.4 KiB
138 lines
4.4 KiB
#!/bin/env python |
|
|
|
import BaseHTTPServer |
|
import SocketServer |
|
import re |
|
import threading |
|
import enum |
|
import pifaceio |
|
|
|
PORT = 8080 |
|
BIND_ADDRESS = '127.0.0.1' |
|
|
|
# time to wait until sending STOP_COMMAND |
|
WAITING_TIME = 120 |
|
|
|
# commands |
|
UP_COMMAND = 0b00000000 |
|
DOWN_COMMAND = 0b00000000 |
|
STOP_COMMAND = 0b00000000 |
|
|
|
# debug |
|
DEBUG = True |
|
|
|
class ScreenStates(enum.Enum): |
|
stop = 'stop' |
|
moving_up = 'moving_up' |
|
up = 'up' |
|
moving_down = 'moving_down' |
|
down = 'down' |
|
|
|
class LeinwandRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): |
|
|
|
current_state = ScreenStates.stop |
|
stop_timer = None |
|
lock = threading.Semaphore() |
|
|
|
def __init__(self, request, client_address, server): |
|
BaseHTTPServer.BaseHTTPRequestHandler.__init__(self, request, client_address, server) |
|
if DEBUG: |
|
pass |
|
else: |
|
LeinwandRequestHandler.pf = pifaceio.PiFace() |
|
|
|
def handle_screen_up(self): |
|
LeinwandRequestHandler.lock.acquire() |
|
if DEBUG: |
|
print('moving up...') |
|
else: |
|
LeinwandRequestHandler.pf.write(UP_COMMAND) |
|
LeinwandRequestHandler.current_state = ScreenStates.moving_up |
|
|
|
if LeinwandRequestHandler.stop_timer is not None: |
|
LeinwandRequestHandler.stop_timer.cancel() |
|
LeinwandRequestHandler.stop_timer = threading.Timer(WAITING_TIME, self.screen_stop) |
|
LeinwandRequestHandler.stop_timer.start() |
|
|
|
LeinwandRequestHandler.lock.release() |
|
self.send_response(200) |
|
print(self.current_state) |
|
|
|
def handle_screen_down(self): |
|
LeinwandRequestHandler.lock.acquire() |
|
if DEBUG: |
|
print('moving down...') |
|
else: |
|
LeinwandRequestHandler.pf.write(DOWN_COMMAND) |
|
LeinwandRequestHandler.current_state = ScreenStates.moving_down |
|
|
|
if LeinwandRequestHandler.stop_timer is not None: |
|
LeinwandRequestHandler.stop_timer.cancel() |
|
LeinwandRequestHandler.stop_timer = threading.Timer(WAITING_TIME, self.screen_stop) |
|
LeinwandRequestHandler.stop_timer.start() |
|
|
|
LeinwandRequestHandler.lock.release() |
|
self.send_response(200) |
|
|
|
def return_screen_state(self): |
|
print('state: %s' % self.current_state) |
|
self.send_response(200) |
|
self.send_header('content-type', 'text/plain') |
|
self.wfile.write('\n') |
|
self.wfile.write('{state: "' + LeinwandRequestHandler.current_state + '"}') |
|
|
|
def screen_stop(self): |
|
LeinwandRequestHandler.lock.acquire() |
|
if DEBUG: |
|
print('stop') |
|
else: |
|
LeinwandRequestHandler.pf.write(STOP_COMMAND) |
|
if LeinwandRequestHandler.current_state == ScreenStates.moving_down: |
|
LeinwandRequestHandler.current_state = ScreenStates.down |
|
elif LeinwandRequestHandler.current_state == ScreenStates.moving_up: |
|
LeinwandRequestHandler.current_state = ScreenStates.up |
|
LeinwandRequestHandler.lock.release() |
|
|
|
|
|
|
|
def do_GET(self): |
|
# output just for debugging... |
|
print('Request from ' + self.client_address[0]) |
|
print(self.path) |
|
|
|
path_match = re.match('^/(screen)/(up|down|state)$', self.path) |
|
|
|
# return simple command documentation on error |
|
if path_match == None: |
|
self.send_response(404) |
|
self.send_header('content-type', 'text/plain') |
|
self.wfile.write('\n') |
|
self.wfile.write('Unknown command. \n\nValid commands are: \n') |
|
self.wfile.write('/screen/up \t move screen up\n') |
|
self.wfile.write('/screen/down \t move screen down\n') |
|
self.wfile.write('/screen/state \t get the current screen state\n') |
|
return |
|
|
|
|
|
if path_match.group(1) == 'screen': |
|
if path_match.group(2) == 'up': |
|
self.handle_screen_up() |
|
return |
|
elif path_match.group(2) == 'down': |
|
self.handle_screen_down() |
|
return |
|
elif path_match.group(2) == 'state': |
|
self.return_screen_state() |
|
return |
|
|
|
|
|
class ThreadedBaseHTTPServer(SocketServer.ThreadingMixIn, BaseHTTPServer.HTTPServer): |
|
pass |
|
|
|
|
|
if __name__ == '__main__': |
|
|
|
handler = LeinwandRequestHandler |
|
httpd = ThreadedBaseHTTPServer((BIND_ADDRESS, PORT), handler) |
|
|
|
httpd.serve_forever()
|
|
|