2020-05-15 12:27:34 +02:00

103 lines
2.7 KiB
Python

import socket
import select
import signal
from CameraContext import CameraContext
from UserCommand import UserCommand
from CameraConnection import CameraConnection
from CameraCommander import CameraCommander
from WaitActivity import WaitActivity
def on_sigint(signal, frame):
global server_enabled
server_enabled = False
#
# Main
#
server_enabled = True
signal.signal(signal.SIGINT, on_sigint)
connected_cameras = []
connected_users = []
cam_listener_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
cam_listener_sock.bind(("", 41551))
cam_listener_sock.listen(5)
cmd_listener_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
cmd_listener_sock.bind(("", 40550))
cmd_listener_sock.listen(5)
print("[Main] : Ready")
while server_enabled or len(CameraCommander.Cameras) > 0:
if server_enabled:
conn_list, wlist, xlist = select.select([cam_listener_sock, cmd_listener_sock], [], [], 0.05)
if cam_listener_sock in conn_list:
cam_sock, cam_addr = cam_listener_sock.accept()
connected_cameras.append(CameraContext(CameraConnection(cam_sock, cam_addr)))
elif cmd_listener_sock in conn_list:
user_sock, user_addr = cmd_listener_sock.accept()
connected_users.append(UserCommand(user_sock, user_addr))
new_connected_users = []
for userCommand in connected_users:
if userCommand.sock:
new_connected_users.append(userCommand)
connected_users = new_connected_users
user_sock_list = [userCommand.sock for userCommand in connected_users]
if server_enabled:
sock_read_list, wlist, xlist = select.select(user_sock_list, [], [], 0.05)
for user_sock in sock_read_list:
for userCommand in connected_users:
if user_sock == userCommand.sock:
userCommand.execute()
new_connected_cameras = []
for context in connected_cameras:
if context.connection:
new_connected_cameras.append(context)
connected_cameras = new_connected_cameras
if not server_enabled:
for context in CameraCommander.Cameras:
if isinstance(context.state, WaitActivity):
try:
context.disconnect()
except CameraContext.TransmissionErrorException:
context.close()
cam_sock_list = [context.connection.sock for context in connected_cameras]
sock_read_list, wlist, xlist = select.select(cam_sock_list, [], [], 0.05)
for cam_sock in sock_read_list:
for context in connected_cameras:
if cam_sock == context.connection.sock:
context.handle()
for context in connected_cameras:
context.tic()
for context in connected_cameras:
if context.connection:
context.close()
for userCommand in connected_users:
if userCommand.sock:
userCommand.close()
cmd_listener_sock.shutdown(socket.SHUT_RDWR)
cmd_listener_sock.close()
cam_listener_sock.shutdown(socket.SHUT_RDWR)
cam_listener_sock.close()
print("[Main] : Bye !!")