Camera.py 3.98 KB
import socket
from enum import Enum
import time
import os
from random import randint
from Device import Device

IMAGES_FOLDER = '../src/misc/images'

EXPOSURE_TIME = 5
SHUTTER_TIME = 3
COOLER_TIME = 10


class Camera(Device):

    def __init__(self, camera_name):
        super().__init__(camera_name)

        ''' I will just fill the attributes with their names and params without regarding them '''
        self.attributes = {}

        if camera_name == "CameraVIS":
            self.attributes["FILENAME"] = "default_vis_" + str(randint(1, 10000))
        else:
            self.attributes["FILENAME"] = "default_nir_" + str(randint(1, 10000))

        self.status = "IDLE"
        self.shutter_status = "CLOSE"

    def loop(self):
        # à gérer : la réception des paramètres, le temps de shutter (et son statut), le temps de start, le stop, le abort, la création d'images

        cooler_timer = 0
        shutter_timer = 0
        exposure_timer = 0

        while True:
            try:
                conn, addr = self.sock.accept()
            except socket.error as e:
                print("There was a socket error: " + repr(e))
                break

            data = conn.recv(128).decode()

            # print("Received: " + data)

            answer = ""
            cut_data = data.split(" ")

            if cooler_timer != 0 and time.time() > cooler_timer:
                cooler_timer = 0
                status = "IDLE"
                print("Ended cooling")
            if shutter_timer != 0 and time.time() > shutter_timer:
                shutter_timer = 0
                print("Ended shutter")
            if exposure_timer > 0 and time.time() > exposure_timer:
                exposure_timer = -1
                print("Ended exposure")
                with open(os.path.join(IMAGES_FOLDER, self.attributes["FILENAME"]), 'w'):
                    pass

            if len(cut_data) < 2:
                print("Invalid message: " + data)
            else:
                cmd_type = cut_data[0]
                cmd = cut_data[1]
                args = cut_data[2:]
                if cmd_type == "SET":
                    if cmd == "FILENAME":
                        if len(args) > 0:
                            self.attributes["FILENAME"] = " ".join(args)
                        else:
                            print("An argument is needed for the FILENAME command")
                    else:
                        self.attributes[cmd] = args
                elif cmd_type == "GET":
                    if cmd == "STATUS":
                        answer = self.status
                    elif cmd == "TEMPERATURE":
                        answer = "GET TEMPERATURE answer not implemented"
                    elif cmd == "SETUP":
                        answer = "GET SETUP answer not implemented"
                    elif cmd == "TIMER":
                        if exposure_timer > 0:
                            answer = str(int(exposure_timer - time.time()))
                        else:
                            answer = str(exposure_timer)
                    else:
                        answer = "Invalid cmd for GET: " + cmd
                        print(answer)
                elif cmd_type == "DO":
                    if cmd == "START":
                        exposure_timer = time.time() + EXPOSURE_TIME
                    elif cmd == "STOP":
                        exposure_timer = -1
                    elif cmd == "ABORT":
                        exposure_timer = -1
                    elif cmd == "COOLER":
                        cooler_timer = time.time() + COOLER_TIME
                    elif cmd == "SHUTTER":
                        shutter_timer = time.time() + SHUTTER_TIME
                    else:
                        print("Invalid cmd for GET: " + cmd)
                else:
                    print("Invalid message: " + data)

            if len(answer) > 0:
                conn.send(bytes(answer, "UTF-8"))
                # print("send: " + answer)

            conn.close()