half comment done

This commit is contained in:
Siwat Sirichai 2024-01-01 01:38:25 +07:00
parent d62ffa3606
commit 039e65e6df
12 changed files with 736 additions and 38 deletions

View file

@ -1,5 +1,19 @@
/**
* @file AnalogIoT.cpp
* @brief Implementation of the AnalogIoT class.
*
* This file contains the implementation of the AnalogIoT class, which provides functionality for handling analog input and output operations in an IoT system.
* The class allows for setting the state and value of digital-to-analog converters (DACs), as well as reading the value of analog-to-digital converters (ADCs).
* It also supports publishing the state and value of DACs and ADCs over MQTT.
*/
#include <AnalogIoT.hpp>
/**
* @brief Default constructor for the AnalogIoT class.
*
* This constructor initializes the AnalogIoT object and sets up the ADC conversion callbacks.
*/
AnalogIoT::AnalogIoT() : adc_conversion_callbacks() {
for (uint8_t i = 0; i < 8; i++) {
adc_publish_enabled[i] = false;
@ -8,8 +22,23 @@ AnalogIoT::AnalogIoT() : adc_conversion_callbacks() {
this->adc_conversion_callback_index = 0;
}
/**
* @brief Default destructor for the AnalogIoT class.
*/
AnalogIoT::~AnalogIoT() {
this->adc_conversion_callbacks.clear();
}
/**
* @brief Initializes the AnalogIoT object.
* @param card_id The ID of the card.
* @param card A pointer to the card object.
* @param mqtt A pointer to the MQTT client object.
* @param base_topic The base MQTT topic.
* @return True if the initialization was successful, false otherwise.
* @note This function can be called from the main program but it is recommended to use ESPMegaIoT to initialize the IoT Components.
* This function initializes the AnalogIoT object and registers the callbacks for handling DAC changes.
*/
bool AnalogIoT::begin(uint8_t card_id, ExpansionCard *card, PubSubClient *mqtt, char *base_topic) {
this->mqtt = mqtt;
this->base_topic = base_topic;
@ -26,6 +55,11 @@ bool AnalogIoT::begin(uint8_t card_id, ExpansionCard *card, PubSubClient *mqtt,
this->card->registerDACChangeCallback(bindedCallback);
return true;
}
/**
* @brief Publishes the state of all DACs.
* @note This function is called when a request state message is received.
*/
void AnalogIoT::handleMqttMessage(char *topic, char *payload){
uint8_t topic_length = strlen(topic);
if(this-> processDACSetStateMessage(topic, payload, topic_length)) return;
@ -34,11 +68,20 @@ void AnalogIoT::handleMqttMessage(char *topic, char *payload){
if(this-> processADCSetConversionIntervalMessage(topic, payload, topic_length)) return;
if(this-> processADCSetConversionEnabledMessage(topic, payload, topic_length)) return;
}
/**
* @brief Publishes the state of all DACs.
*/
void AnalogIoT::publishADCs() {
for (uint8_t i = 0; i < 8; i++) {
this->publishADC(i);
}
}
/**
* @brief Publishes the state of a DAC.
* @param pin The pin of the DAC.
*/
void AnalogIoT::publishADC(uint8_t pin) {
if (this->adc_publish_enabled[pin]) {
uint16_t value = this->card->analogRead(pin);
@ -55,29 +98,71 @@ void AnalogIoT::publishADC(uint8_t pin) {
}
}
}
/**
* @brief Sets the interval at which the state of all DACs is published.
* @param interval The interval in milliseconds.
*/
void AnalogIoT::setADCsPublishInterval(uint32_t interval) {
for (uint8_t i = 0; i < 8; i++) {
adc_conversion_interval[i] = interval;
}
}
/**
* @brief Sets whether the state of all DACs is published.
* @param enabled True if the state of all DACs should be published, false otherwise.
*/
void AnalogIoT::setADCsPublishEnabled(bool enabled) {
for (uint8_t i = 0; i < 8; i++) {
adc_publish_enabled[i] = enabled;
}
}
/**
* @brief Registers a callback for handling ADC conversions.
* @param callback The callback function.
* @return The handler of the callback.
*/
uint8_t AnalogIoT::registerADCConversionCallback(std::function<void(uint8_t, uint16_t)> callback) {
this->adc_conversion_callbacks[this->adc_conversion_callback_index] = callback;
return this->adc_conversion_callback_index++;
}
/**
* @brief Unregisters a callback for handling ADC conversions.
* @param handler The handler of the callback.
*/
void AnalogIoT::unregisterADCConversionCallback(uint8_t handler) {
this->adc_conversion_callbacks.erase(handler);
}
/**
* @brief Sets the interval at which the value of an ADC channel is read.
* @param pin The pin of the ADC channel.
* @param interval The interval in milliseconds.
*/
void AnalogIoT::setADCConversionInterval(uint8_t pin, uint16_t interval) {
adc_conversion_interval[pin] = interval;
}
/**
* @brief Enables or disables the periodic reading of the value of an ADC channel.
* @param pin The pin of the ADC channel.
* @param enabled True if the value of the ADC channel should be read, false otherwise.
*/
void AnalogIoT::setADCConversionEnabled(uint8_t pin, bool enabled) {
adc_publish_enabled[pin] = enabled;
}
/**
* @brief Processes a message received on the MQTT topic for setting the state of a DAC.
* @param topic The topic of the message.
* @param payload The payload of the message.
* @param topic_length The length of the topic.
* @note This function is not meant to be called from user code.
* @return True if the message was processed, false otherwise.
*/
bool AnalogIoT::processADCSetConversionIntervalMessage(char *topic, char *payload, uint8_t topic_length) {
// TODO: Process payload matching the criteria
// Topic: adc/<%02d>/set/conversion_interval
@ -102,6 +187,15 @@ bool AnalogIoT::processADCSetConversionIntervalMessage(char *topic, char *payloa
this->setADCConversionInterval(pin, interval);
return true;
}
/**
* @brief Processes a message received on the MQTT topic for setting the value of a DAC.
* @param topic The topic of the message.
* @param payload The payload of the message.
* @param topic_length The length of the topic.
* @note This function is not meant to be called from user code.
* @return True if the message was processed, false otherwise.
*/
bool AnalogIoT::processADCSetConversionEnabledMessage(char *topic, char *payload, uint8_t topic_length) {
// Topic: adc/<%02d>/set/conversion_enabled
// The first 4 characters are "adc/"
@ -125,6 +219,15 @@ bool AnalogIoT::processADCSetConversionEnabledMessage(char *topic, char *payload
this->setADCConversionEnabled(pin, enabled);
return true;
}
/**
* @brief Processes a message received on the MQTT topic for setting the state of a DAC.
* @param topic The topic of the message.
* @param payload The payload of the message.
* @param topic_length The length of the topic.
* @note This function is not meant to be called from user code.
* @return True if the message was processed, false otherwise.
*/
bool AnalogIoT::processDACSetStateMessage(char *topic, char *payload, uint8_t topic_length) {
// Topic: dac/<%02d>/set/state
// The first 4 characters are "dac/"
@ -148,6 +251,15 @@ bool AnalogIoT::processDACSetStateMessage(char *topic, char *payload, uint8_t to
this->card->setDACState(pin, state);
return true;
}
/**
* @brief Processes a message received on the MQTT topic for setting the value of a DAC.
* @param topic The topic of the message.
* @param payload The payload of the message.
* @param topic_length The length of the topic.
* @note This function is not meant to be called from user code.
* @return True if the message was processed, false otherwise.
*/
bool AnalogIoT::processDACSetValueMessage(char *topic, char *payload, uint8_t topic_length) {
// Topic: dac/<%02d>/set/value
// The first 4 characters are "dac/"
@ -171,6 +283,15 @@ bool AnalogIoT::processDACSetValueMessage(char *topic, char *payload, uint8_t to
this->card->setDACValue(pin, value);
return true;
}
/**
* @brief Processes a message received on the MQTT topic for requesting the state of all DACs.
* @param topic The topic of the message.
* @param payload The payload of the message.
* @param topic_length The length of the topic.
* @note This function is not meant to be called from user code.
* @return True if the message was processed, false otherwise.
*/
bool AnalogIoT::processRequestStateMessage(char *topic, char *payload, uint8_t topic_length) {
// Topic: requeststate
// The length of the topic must be 12 characters
@ -187,6 +308,11 @@ bool AnalogIoT::processRequestStateMessage(char *topic, char *payload, uint8_t t
this->publishADCs();
return false;
}
/**
* @brief Subscribes to all MQTT topics used by the AnalogIoT object.
* @note This function is called when the MQTT client connects.
*/
void AnalogIoT::subscribe() {
// There are 4 DACs and 8 ADCs
// DACs: dac/<%02d>/set/state, dac/<%02d>/set/value, dac/publish_enable
@ -226,23 +352,45 @@ void AnalogIoT::loop() {
}
}
}
/**
* @brief Publishes the state of all DACs.
*/
void AnalogIoT::publishReport() {
publishADCs();
publishDACs();
}
/**
* @brief Gets the type of the card.
* @return The type of the card.
*/
uint8_t AnalogIoT::getType() {
return CARD_TYPE_ANALOG;
}
/**
* @brief Publishes the state of all DACs.
*/
void AnalogIoT::publishDACs() {
for (uint8_t i = 0; i < 4; i++) {
this->publishDAC(i);
}
}
/**
* @brief Publishes the state of a DAC.
* @param pin The pin of the DAC.
*/
void AnalogIoT::publishDAC(uint8_t pin) {
this->publishDACState(pin);
this->publishDACValue(pin);
}
/**
* @brief Publishes the state of a DAC.
* @param pin The pin of the DAC.
*/
void AnalogIoT::publishDACState(uint8_t pin) {
char *topic = new char[15];
sprintf(topic, "dac/%02d/state", pin);
@ -252,6 +400,11 @@ void AnalogIoT::publishDACState(uint8_t pin) {
delete[] topic;
delete[] payload;
}
/**
* @brief Publishes the value of a DAC.
* @param pin The pin of the DAC.
*/
void AnalogIoT::publishDACValue(uint8_t pin) {
char *topic = new char[15];
sprintf(topic, "dac/%02d/value", pin);
@ -262,6 +415,10 @@ void AnalogIoT::publishDACValue(uint8_t pin) {
delete[] payload;
}
/**
* @brief Publishes the state of a DAC.
* @param pin The pin of the DAC.
*/
void AnalogIoT::handleDACChange(uint8_t pin, uint16_t value) {
this->publishDAC(pin);
}