fsfw/pus/newSchedulingImplementation/Scheduling.h

154 lines
4.7 KiB
C++

/*
* Scheduling.h
*
* Created on: Nov 5, 2019
* Author: mala
*/
#ifndef STUDIO_TMTCSERVICES_SCHEDULING_H_
#define STUDIO_TMTCSERVICES_SCHEDULING_H_
#include <framework/container/FixedOrderedMultimap.h>
#include <framework/storagemanager/LocalPool.h>
#include <framework/timemanager/CCSDSTime.h>
#include <framework/tmtcservices/PusServiceBase.h>
#include "ScheduleTableIF.h"
//make sure this alias works in global scope
typedef uint8_t SubscheduleId_t;
/**
* @brief manages onboard time-based schedule, PUS service 11
* @details
*
* This service is responsible in managing an onboard time-based schedule of telecommands.
* The schedule can be through this service enabled, disabled, and time-shifted
* It can support subschedules. subschedules can be created,enabled and disabled, and time-shifted
*
* The service stores the schedule in the ScheduleMap, which has a ScheduleMapIF.
* Current Map includes subschedules, but it can be replaced by implementing the interface
* The service also can pre-load commands through scheduleLoaderIF.
* scheduleLoader and scheduleTable should be instantiated in factory
*
* right now we do not have control over one single command,in terms of
* shift/disable/delete. it might be required in future though,
*The following constants are in standards but not implemented in this version
*Time margin declared static const Time_Based_Schedule_Margin
*Time between specified release time and actual release time , maximum, declared
*
* @author M.Taheran
*
*/
class OPS_Scheduling: public PusServiceBase {
public:
OPS_Scheduling(uint16_t apid,bool HasInitialSchedule, bool HasSubschedules);
virtual ~OPS_Scheduling();
ReturnValue_t handleRequest(uint8_t subservice) override;
ReturnValue_t performService() override;
ReturnValue_t initialize() override;
protected:
ScheduleTableIF* scheduleMap = nullptr;
ScheduleLoaderIF * scheduleLoader = nullptr;
bool loadInitialSchedule;
bool supportSubschedules;
private:
enum class subServices {
static const uint8_t ENABLE_RELEASE_OF_TC = 1,
static const uint8_t DISABLE_RELEASE_OF_TC =2,
static const uint8_t ENABLE_SUBSCHEDULE = 20,
static const uint8_t DISABLE_SUBSCHEDULE = 21,
//static const uint8_t DELETE_TC = 5;//not implemented
static const uint8_t RESET_SCHEDULE = 3,
static const uint8_t TIMESHIFT_SCHEDULE = 15,
static const uint8_t TIMESHIFT_SUBSCHEDULE = 8,
static const uint8_t INSERT_TC_SCHEDULE = 4,
//TODO
//static const uint8_t REPORT_SCHEDULE = 16;//TM is type 10
};
//Interface and subsystem ID to be included in mission config
static const unit8_t INTERFACE_ID = CLASS_ID::OPS_SCHEDULING_SERVICE;
static const uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::OPS_SCHEDULER;
//list of return codes, tbc
static const ReturnValue_t TIME_ERROR = MAKE_RETURN_CODE (1);
static const ReturnValue_t COMMAND_EXPIRED = MAKE_RETURN_CODE (2);
static const ReturnValue_t ILLEGAL_APPLICATION_DATA= MAKE_RETURN_CODE (3);
//static const ReturnValue_t SCHEDULE_MAP_FULL= MAKE_RETURN_CODE (4);
static const ReturnValue_t INVALID_SHIFT= MAKE_RETURN_CODE (4);
static const ReturnValue_t SCHEDULE_SHIFTED= MAKE_RETURN_CODE (5);
static const ReturnValue_t SCHEDULE_SHIFT_FAILED= MAKE_RETURN_CODE (6);
//list of events,tbc
static const Event = OPS_SCHEDULE_DISABLED = MAKE_EVENT(1, SEVERITY::MEDIUM);
static const Event = COMMAND_LOST = MAKE_EVENT (2, SEVERITY::LOW);
static const Event = SCHEDULE_LOAD_FAILED = MAKE_EVENT (3, SEVERITY::MEDIUM);
static const Event = SCHEDULE_LOADED_INCOMPLETE = MAKE_EVENT (4, SEVERITY::LOW);
MessageQueueIF* commandQueue = nullptr;
MessageQueueIF* eventQueue = nullptr;
static const uint8_t N_POOLS = 4;
static const uint16_t POOL_SIZES[N_POOLS];
static const uint16_t N_ELEMENTS[N_POOLS];
LocalPool<N_POOLS> commandStorage;
//only used for reporting on incomplete loading
uint8_t tcCounter = 0;
bool SchedulingEnabled;
bool NoTimeError;
Returnvalue_t enableScheduling();
void disableScheduling();
ReturnValue_t enable_Subschedule (SubscheduleId_t SubScheduleID=0);
ReturnValue_t disable_Subschedule(SubscheduleId_t SubScheduleID=0);
Returnvalue_t resetSchedule();
Returnvalue_t insertCommandinSchedule(const uint8_t* data, uint16_t size);
void do_Schedule();
void check_Events();
Returnvalue_t shift_Schedule (const uint8_t* data, uint16_t size);
Returnvalue_t shift_SubSchedule (const uint8_t* data, uint16_t size);
void shift_Subschedule_Map(OnboardSchedule_map::iterator it, timeval time_delta);
void get_Subschedule(SubscheduleId_t* SubscheduleId,const uint8_t* data, uint32_t maxlength, uint32_t* foundlength, bool* NewId = false);
ReturnValue_t loadSchedule();
void releaseCommand(store_address_t address);
//TODO
//ReturnValue_t Create_Schedule_Report();
#endif /* STUDIO_TMTCSERVICES_SCHEDULING_H_ */