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 !!")