127 lines
3.4 KiB
C++
127 lines
3.4 KiB
C++
/*
|
|
* HiperfaceNetworkDriver.h
|
|
*
|
|
* Created on: 4 ôåâð. 2020 ã.
|
|
* Author: user
|
|
*/
|
|
|
|
#ifndef UMLIBRARY_DRIVER_HIPERFACENETWORKDRIVER_HH_
|
|
#define UMLIBRARY_DRIVER_HIPERFACENETWORKDRIVER_HH_
|
|
|
|
#include <stdint.h>
|
|
|
|
#include "../common/CircularBuffer.hpp"
|
|
|
|
#include "../peripheral/IUartPort.hh"
|
|
|
|
#include "../systemic/Timer.hh"
|
|
|
|
#include "IDiscreteOutput.hh"
|
|
|
|
#include "HipMessage.hh"
|
|
|
|
namespace driver {
|
|
|
|
//!Äðàéâåð ñåòè äàò÷èêîâ Hiperface ïîäêëþ÷åííûõ ïî ïîñëåäîâàòåëüíîìó ïîðòó.
|
|
class HiperfaceNetworkDriver {
|
|
private:
|
|
driver::IDiscreteOutput & flow_control;
|
|
peripheral::IUartPort & connection;
|
|
|
|
bool connection_error = false;
|
|
bool warning = false;
|
|
|
|
//todo ââåñòè áóôåð ñîîáùåíèé íà îòïðàâêó
|
|
|
|
//áóôåð äëÿ ïðèåìà è ïåðåäà÷è ñîîáùåíèé
|
|
//todo îáúåäåíèòü Message è MessageBuff â MessageProcessor
|
|
template<std::size_t data_size>
|
|
class MessageBuff {
|
|
private:
|
|
char data[data_size];
|
|
std::size_t used_size = 0;
|
|
|
|
public:
|
|
std::size_t size() const { return used_size; }
|
|
std::size_t capacity() const { return data_size; }
|
|
const char * getDataToRead() const { return data; }
|
|
|
|
char * getBuff(std::size_t size_to_use) { return (size_to_use > data_size) ? nullptr : (used_size = size_to_use, data); }
|
|
|
|
};
|
|
|
|
static const unsigned int data_size = 16;
|
|
MessageBuff<data_size> data_buff;
|
|
|
|
Message message;
|
|
MessageControl * process_message = nullptr;
|
|
|
|
void setResult( MessageControl * process_message, const HipResult result );
|
|
|
|
systemic::Timer timer;
|
|
|
|
enum BaudRate { br600, br1200, br2400, br4800, br9600, br19200, br38400 };
|
|
|
|
static unsigned long getAfterMessageTimeout(BaudRate baudrate);
|
|
static unsigned long getMessageTimeout(BaudRate baudrate, const MessageControl * message_control);
|
|
|
|
static const BaudRate default_baudrate = br9600;
|
|
|
|
BaudRate baudrate = default_baudrate;
|
|
|
|
static const unsigned short data_send_timeout_ms = 5;
|
|
|
|
enum States {
|
|
not_processing,
|
|
waiting_transfer_completion,
|
|
waiting_timeout,
|
|
waiting_after_response,
|
|
read_error_code,
|
|
};
|
|
|
|
States state = not_processing;
|
|
|
|
struct HipStatus {
|
|
unsigned char status;
|
|
|
|
driver::MessageControl message_control = {
|
|
.address = 0,
|
|
.code = 0x50,
|
|
.send_data_size = 0,
|
|
.send_data = nullptr,
|
|
.rec_data_size = 1,
|
|
.rec_data = &status,
|
|
.timeout_ms = 5,
|
|
.ans_ready_flag = false,
|
|
.result = driver::OK
|
|
};
|
|
} status_request;
|
|
|
|
HipResult error_code = driver::OK;
|
|
|
|
|
|
public:
|
|
//...
|
|
bool send( MessageControl * message );
|
|
void reset();
|
|
|
|
void process();
|
|
|
|
bool isWarning() const { return warning; }
|
|
bool isFailure() const { return error_code; }
|
|
bool isCriticalError() const { return error_code == driver::hip_error; }
|
|
bool isConnectionError() const { return connection_error; }
|
|
|
|
void setBaudRate(BaudRate new_baudrate) { baudrate = new_baudrate; }
|
|
|
|
float getHipErrorCode() const { return static_cast<float>( status_request.status ); }
|
|
float getErrorCode() const { return static_cast<float>( error_code ); }
|
|
|
|
HiperfaceNetworkDriver( driver::IDiscreteOutput & flow_control, peripheral::IUartPort & connection );
|
|
|
|
};
|
|
|
|
} /* namespace driver */
|
|
|
|
#endif /* UMLIBRARY_DRIVER_HIPERFACENETWORKDRIVER_HH_ */
|