hunting/middleware/McuManager/include/IMcuManager.h
2024-07-22 20:51:50 +08:00

172 lines
5.4 KiB
C++

/*
* Copyright (c) 2023 Fancy Code.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef I_MCU_MANAGER_H
#define I_MCU_MANAGER_H
#include "StatusCode.h"
#include <memory>
constexpr unsigned short CLOSE_WATCH_DOG = 0;
bool CreateMcuManager(void);
bool DestroyMcuManager(void);
enum class IpcMission
{
PIR_TRIGGERED = 1,
TEST,
ON,
CONTINUOUS_SHOOTING,
PIR_TRIGGERED_DELAY,
REGULAR_START,
END
};
enum class ASK_RESULT
{
SUCCEED = 1,
FAILED,
TIMEOUT,
END
};
enum class ControlLight
{
TRUN_OFF = 0,
TRUN_ON,
END
};
typedef struct mcu_ask_date_time
{
mcu_ask_date_time(const unsigned short year, const unsigned char mon, const unsigned char day,
const unsigned char hour, const unsigned char min, const unsigned char second);
const unsigned short mYear;
const unsigned char mMon;
const unsigned char mDay;
const unsigned char mHour;
const unsigned char mMin;
const unsigned char mSecond;
} McuAskDateTime;
typedef struct mcu_reply_date_time
{
mcu_reply_date_time();
unsigned short mYear;
unsigned char mMon;
unsigned char mDay;
unsigned char mHour;
unsigned char mMin;
unsigned char mSecond;
} McuReplyDateTime;
typedef struct mcu_get_interval_start
{
mcu_get_interval_start();
unsigned char mHour;
unsigned char mMin;
unsigned char mSecond;
} McuGetIntervalStart;
typedef struct mcu_get_sensitivity
{
mcu_get_sensitivity();
unsigned int mSensitivity;
} McuGetPirSensitivity;
/**
* @brief The application sends data to the MCU.
*
*/
class VMcuAsk
{
public:
VMcuAsk();
virtual ~VMcuAsk() = default;
virtual ASK_RESULT Blocking(void);
virtual bool NeedReply(void);
virtual void ReplyFinished(const bool result);
virtual bool IfTimeout(const unsigned int &integrationTimeMs);
public:
/**
* @brief The serial number of a single request, assigned by the McuManager module, is used for internal management
* within the McuManager module.
*/
unsigned int mSerialNumber;
};
template <typename T>
class McuAsk : virtual public VMcuAsk
{
public:
McuAsk() = default;
virtual ~McuAsk() = default;
public:
T mDataReply;
};
/**
* @brief Report the data received by the serial port to the application.
*
*/
class VMcuRecv
{
public:
VMcuRecv() = default;
virtual ~VMcuRecv() = default;
virtual void ReplyFinished(const bool result);
};
template <typename T>
class McuRecv : public VMcuRecv
{
public:
McuRecv() = default;
virtual ~McuRecv() = default;
public:
T mDataRecvReply; ///< It includes both the data received by the serial port and the data replied to.
};
class VMcuMonitor
{
public:
VMcuMonitor() = default;
virtual ~VMcuMonitor() = default;
virtual void RecvIpcMissionEvent(std::shared_ptr<VMcuRecv> &recv, const IpcMission &mission);
virtual void RecvMcuHeartBeatEvent(std::shared_ptr<VMcuRecv> &recv);
virtual void RecvGetIntervalStartEvent(std::shared_ptr<VMcuRecv> &recv);
virtual void RecvGetDateTime(std::shared_ptr<VMcuRecv> &recv);
virtual void RecvGetPirSensitivity(std::shared_ptr<VMcuRecv> &recv);
};
class IMcuManager
{
public:
IMcuManager() = default;
virtual ~IMcuManager() = default;
static std::shared_ptr<IMcuManager> &GetInstance(std::shared_ptr<IMcuManager> *impl = nullptr);
virtual const StatusCode Init(void);
virtual const StatusCode UnInit(void);
virtual const StatusCode SetMcuMonitor(std::shared_ptr<VMcuMonitor> &monitor);
virtual const StatusCode GetIpcMission(std::shared_ptr<VMcuAsk> &ask);
virtual const StatusCode CutOffPowerSupply(std::shared_ptr<VMcuAsk> &ask);
virtual const StatusCode FeedWatchDog(std::shared_ptr<VMcuAsk> &ask);
virtual const StatusCode SetFeedingCycleForWatchDog(std::shared_ptr<VMcuAsk> &ask, const unsigned char &hour,
const unsigned char &min, const unsigned char &second);
/**
* @brief Set the dog feeding cycle. When the dog feeding cycle is set to 0, it means that the dog feeding is turned
* off.
* @param ask
* @param feedCycle_s The dog feeding cycle is in seconds. Using CLOSE_WATCH_DOG(0) means close watch dog.
* @return const StatusCode
*/
virtual const StatusCode SetFeedingCycleForWatchDog(std::shared_ptr<VMcuAsk> &ask,
const unsigned short &feedCycle_s);
virtual const StatusCode SetDateTime(std::shared_ptr<VMcuAsk> &ask, const McuAskDateTime &value);
virtual const StatusCode SetPirSensitivity(std::shared_ptr<VMcuAsk> &ask, const unsigned char &sensitivity);
virtual const StatusCode ContorlInfraredLight(std::shared_ptr<VMcuAsk> &ask, const ControlLight &control);
virtual const StatusCode GetPhotosensitivityValue(std::shared_ptr<VMcuAsk> &ask);
virtual const char *PrintIpcMissionString(const IpcMission &mission);
};
#endif