Commit 8bfb48cb authored by Agrigor's avatar Agrigor

Complete Rewrite of server with more oop and better communication between the classes.

parent 0abccaad
###############################################################################
########################## IMPORT LIBRARIES ###################################
###############################################################################
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ~~~~~~~~~~~~~~~~~~~~~~~~ IMPORT LIBRARIES ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
import RPi.GPIO as GPIO
import time
import signal
import sys
import socket
import threading
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ~~~~~~~~~~~~~~~~~~~~~~~~ GLOBAL CONSTANTS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
BUZZER_PINS = [35, 36, 37, 38]
BOUNCE = 300
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ~~~~~~~~~~~~~~~~~~~~~~~~ CLASS DEFINITION ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class Connection:
def __init__(self, ip, port):
self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.msg = ""
self.target_ip = ip
self.target_port = port
###############################################################################
########################## GLOBAL CONSTANTS ###################################
###############################################################################
def close(self):
self.socket.close()
# Network Constants
TARGET_IP = sys.argv[1]
TARGET_PORT = 50000
UDP = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
def send(self, message):
self.socket.sendto(str.encode(self.msg), (self.target_ip, self.target_port))
def observe_buzzers(self, buzzers):
for buzzer in buzzers:
buzzer.register_observer(self)
def notify(self, buzzer):
self.msg = "Button " + str(buzzer.number) + " pressed"
self.send(self.msg)
print(self.msg)
###############################################################################
########################## CLASS DEFINITION ###################################
###############################################################################
class Buzzer:
def __init__(self, number, board_pin, bounce=300):
def __init__(self, number, board_pin, bounce, observers=set()):
self.number = number
self.pin = board_pin
self.bounce = bounce
self.observers = observers
GPIO.setmode(GPIO.BOARD)
GPIO.setup(self.pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
self.create_event()
def create_event(self):
GPIO.add_event_detect(self.pin, GPIO.RISING, callback=self.event, bouncetime=self.bounce)
def event(self, channel):
msg = "Button " + str(self.number) + " pressed"
print(msg)
UDP.sendto(str.encode(msg), (TARGET_IP, TARGET_PORT))
###############################################################################
########################## DEFINITION FUNCTIONS ###############################
###############################################################################
def init():
# Initialize target ip adress
try:
socket.inet_aton(TARGET_IP)
except socket.error:
print("First Argument was no valid IP-Address")
sys.exit(0)
else:
# Initialize signal handling for interrupt by CTRL+C or kill command
signal.signal(signal.SIGINT, quit)
def register_observer(self, observer):
self.observers.add(observer)
# Things to be done while ending programm
def quit(signal, frame):
GPIO.cleanup()
UDP.close()
print("\n Bye Bye")
sys.exit(0)
def notify_observer(self, channel):
for observer in self.observers:
observer.notify(self)
###############################################################################
################################## MAIN #######################################
###############################################################################
# Mainfunction which includes the whole program
def main():
def create_event(self):
GPIO.add_event_detect(self.pin, GPIO.RISING,
callback=self.notify_observer,
bouncetime=self.bounce)
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ MAIN ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class Server:
def __init__(self, ip, port):
self.connection = Connection(ip, port)
self.buzzers = [Buzzer(i, pin, BOUNCE) for i, pin in enumerate(BUZZER_PINS, start=1)]
self.connection.observe_buzzers(self.buzzers)
# Initialize target ip adress
try:
socket.inet_aton(ip)
except socket.error:
print("First Argument was no valid IP-Address")
sys.exit(0)
def cleanup(self):
GPIO.cleanup()
self.connection.close()
print("\n Bye Bye")
sys.exit(0)
# Initialize
init()
def main(self):
try:
threading.Event().wait()
finally:
self.cleanup()
# Initialize GPIO pins
b1 = Buzzer(1, 35)
b2 = Buzzer(2, 36)
b3 = Buzzer(3, 37)
b4 = Buzzer(4, 38)
while True:
# Do nothing
time.sleep(0.1)
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PROGRAM ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
###############################################################################
################################# PROGRAM #####################################
###############################################################################
# Start Server
main()
server = Server(sys.argv[1], 50000)
server.main()
###############################################################################
#################################### END ######################################
###############################################################################
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ END ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment