Blame view

src/monitoring/tasks.py 6.56 KB
5b5566ab   haribo   added celery
1
from __future__ import absolute_import
a190892c   haribo   Date: 05/07/2016
2
from django.conf import settings
ddf59dd4   haribo   Remaniement :
3
from common.models import *
5b5566ab   haribo   added celery
4
from celery.task import Task
c5a3b4a0   haribo   Date: 05/07/2016
5
6
7
8
9
import scheduler.tasks
import alert_manager.tasks
import observation_manager.tasks
import time

ddf59dd4   haribo   Remaniement :
10
from devices.Telescope import TelescopeController
bb0fbab1   haribo   Fini de mettre la...
11
12
from devices.CameraVIS import VISCameraController
from devices.CameraNIR import NIRCameraController
ddf59dd4   haribo   Remaniement :
13
from devices.PLC import PLCController
5b5566ab   haribo   added celery
14
15
16

import time

c5a3b4a0   haribo   Date: 05/07/2016
17
18
TIMER_CHECK = 10  # in seconds

5b5566ab   haribo   added celery
19
class monitoring(Task):
9b5bad52   haribo   Commented all the...
20
21
22
    '''
        Infinite task created at the program's start.
        It initilize all the external connections, and starts the alert_listener.
0afcefa9   Jeremy   Reworked simulato...
23

9b5bad52   haribo   Commented all the...
24
        This is the place to put the starting configurations.
0afcefa9   Jeremy   Reworked simulato...
25

9b5bad52   haribo   Commented all the...
26
27
28
29
        Once the starting configurations are done, it becomes a loop that checks the PLC and instruments status.
        It also handles the beginning and the end of the night, recalculating them at each end of night.
    '''

5b5566ab   haribo   added celery
30
31

    def run(self):
c5a3b4a0   haribo   Date: 05/07/2016
32
        self.configure_instruments()
a190892c   haribo   Date: 05/07/2016
33
        self.update_software_versions()
c5a3b4a0   haribo   Date: 05/07/2016
34
35
36
37
38
39
        self.get_night_start_end()
        self.wait_devices_ready()

        # TODO: décommenter pour lancer un scheduling
        # scheduler.tasks.scheduling(first_schedule=True, alert=False, night_start=self.night_start, night_end=self.night_end)
        alert_manager.tasks.alert_listener.delay()
a190892c   haribo   Date: 05/07/2016
40

c5a3b4a0   haribo   Date: 05/07/2016
41
42
43
        self.timers_loop()

    def configure_instruments(self):
9b5bad52   haribo   Commented all the...
44
45
46
        '''
            Creates the communication objects for each instrument, and give them the basic configurations.
        '''
ddf59dd4   haribo   Remaniement :
47
48
49
50
        self.tel = TelescopeController()
        self.vis_camera = VISCameraController()
        self.nir_camera = NIRCameraController()
        self.plc = PLCController()
c5a3b4a0   haribo   Date: 05/07/2016
51

00fa2456   haribo   Debug adaption code
52
53
        self.vis_camera.do("COOLER", 1.0, -150.0)
        self.nir_camera.do("COOLER", 1.0, -150.0)
ac26ad2b   haribo   Date: 22/07/2016
54

c5a3b4a0   haribo   Date: 05/07/2016
55
56
        self.tel.do("HOMING")
        self.tel.do("DOORS", True)
ddf59dd4   haribo   Remaniement :
57
        # TODO: dire au plc d'ouvrir le dome
c5a3b4a0   haribo   Date: 05/07/2016
58

a190892c   haribo   Date: 05/07/2016
59
    def update_software_versions(self):
9b5bad52   haribo   Commented all the...
60
61
62
        '''
            Reads the softwares versions in the settings.py, store them in the DB and send them to the IC.
        '''
a190892c   haribo   Date: 05/07/2016
63
64
65
66
67
68
69
70
        versions = settings.MODULES_VERSIONS

        for module, version in versions.items():
            same_module_versions = Version.objects.filter(module_name=module)
            if same_module_versions.count() == 0:
                Version.objects.create(module_name=module, version=version)
            elif same_module_versions.order_by("-created")[0].version != version:
                Version.objects.create(module_name=module, version=version)
c5a3b4a0   haribo   Date: 05/07/2016
71
72
73
74

        # TODO: envoyer les versions à l'IC

    def get_night_start_end(self):
9b5bad52   haribo   Commented all the...
75
76
77
        '''
            Computes the beginning and the end of the following (or current) night
        '''
c5a3b4a0   haribo   Date: 05/07/2016
78
79
80
81
82
83
        # TODO: utiliser un logiciel by AK pour stocker en local le début et la fin de la nuit (on est peut-être dedans)
        self.night_start = time.time() + 180 / 86400
        self.night_end = time.time() + 360 / 86400
        pass

    def wait_devices_ready(self):
9b5bad52   haribo   Commented all the...
84
85
86
        '''
            Loop to wait for the device to be idle avec the starting configurations.
        '''
00fa2456   haribo   Debug adaption code
87
88
89
90
91
92
93
94
95

        nir_st = ""
        vis_st = ""
        tel_st = ""

        while nir_st != "IDLE" or vis_st != "IDLE" and tel_st != "IDLE":
            nir_st = self.nir_camera.get("STATUS")
            vis_st = self.vis_camera.get("STATUS")
            tel_st = self.tel.get("STATUS")
ddf59dd4   haribo   Remaniement :
96
97
            # TODO: rajouter le fait que le dome doit être ouvert (PLC)

00fa2456   haribo   Debug adaption code
98
        print("Devices ready !")
c5a3b4a0   haribo   Date: 05/07/2016
99
100
101
102
103
104

    def timers_loop(self):
        '''
            Infinite loop for the different timers :
                - Every TIMER_CHECK seconds, check PLC and instruments status (+ analyse them and send them to the IC)
                - 2 minutes before the night start, make a scheduling
0afcefa9   Jeremy   Reworked simulato...
105
                - At the end of the night, do calibration files and computes the next night limits + make a scheduling with the new schedule
c5a3b4a0   haribo   Date: 05/07/2016
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
        '''

        timer_status = TIMER_CHECK

        ''' Set night start timer to 1 day, then compute the real ones if the current time isn't during the night '''
        timer_night_start = 86400

        night_start_seconds = self.night_start * 3600 * 24
        night_end_seconds = self.night_end * 3600 * 24

        if night_start_seconds - 120 > time.time():
            timer_night_start = night_start_seconds - 120 - time.time()

        timer_night_end = night_end_seconds - time.time()

        timers = {"status": timer_status, "night_start": timer_night_start, "night_end": timer_night_end}

        while True:
            minimal_timer = min(timers, key=timers.get)
            ''' Wait for the nearest timer '''
            time.sleep(timers[minimal_timer])
            ''' Update the timers '''
            timers = {key: value - timers[minimal_timer] for key, value in timers.items()}

            ''' Then check what timers are <= 0 '''
            for timer_name, timer_value in timers.items():
                if timer_value <= 0:
                    if timer_name == "status":
ac26ad2b   haribo   Date: 22/07/2016
134

00fa2456   haribo   Debug adaption code
135
136
137
                        status_tel = self.tel.get("STATUS")
                        status_nir = self.nir_camera.get("STATUS")
                        status_vis = self.vis_camera.get("STATUS")
21598bc6   haribo   Date: 01/08/2016
138
                        status_plc = self.plc.get("STATUS")
ac26ad2b   haribo   Date: 22/07/2016
139

c5a3b4a0   haribo   Date: 05/07/2016
140
                        # TODO: stocker les statuts & les envoyer à l'IC
21598bc6   haribo   Date: 01/08/2016
141

2ceea892   haribo   Date: 19/07/2016
142
                        timers["status"] = TIMER_CHECK
21598bc6   haribo   Date: 01/08/2016
143
144
145

                        self.analyze_plc_status()

c5a3b4a0   haribo   Date: 05/07/2016
146
147
148
149
                    elif timer_name == "night_start":
                        scheduler.tasks.scheduling.delay(first_schedule=False, alert=False)
                        timers["night_start"] = 86400
                    elif timer_name == "night_end":
ddf59dd4   haribo   Remaniement :
150
                        # TODO: faire un majordome.system_pause (fin de nuit)
164eebbd   haribo   UML and comments
151
                        observation_manager.tasks.create_calibrations.delay()
c5a3b4a0   haribo   Date: 05/07/2016
152
                        self.get_night_start_end()
2ceea892   haribo   Date: 19/07/2016
153
154
                        scheduler.tasks.scheduling(first_schedule=True, alert=False, night_start=self.night_start, night_end=self.night_end)
                        timers["night_start"] = self.night_start * 3600 * 24 - time.time() - 120
ac26ad2b   haribo   Date: 22/07/2016
155
                        timers["night_end"] = self.night_end * 3600 * 24 - time.time()
21598bc6   haribo   Date: 01/08/2016
156
157
158
159
160
161
162
163
164
165

    def analyze_plc_status(self):
        '''
           Reads the status in DB, and fill missing fields (maybe ?)
           Determines the obs conditions and compare them with the previous ones to know if they changed
           Create a task to stop the system if there is a security problem
        '''

        pass
        # TODO: toute la fct
1a317dbd   haribo   TODOs et modifs m...
166
        # On calcule le nouveau seeing, et si il y a eu du changement, on crée une tâche de majordome.change_obs_conditions