feat: Add support for FRM303 (#2875)

* Add FRM303 support.

* chore: Formatting
This commit is contained in:
richardclli
2023-02-27 21:51:45 +10:00
committed by GitHub
parent d927a8d687
commit 4547f08cca
3 changed files with 89 additions and 104 deletions
+51 -50
View File
@@ -73,17 +73,15 @@ static uint8_t _phyMode_channels[] = {
// EMPTY_DT,
// };
//enum used by command response -> translate to ModuleState
enum MODULE_READY_E
{
// enum used by command response -> translate to ModuleState
enum MODULE_READY_E {
MODULE_STATUS_UNKNOWN = 0x00,
MODULE_STATUS_NOT_READY = 0x01,
MODULE_STATUS_READY = 0x02
};
enum ModuleState
{
STATE_NOT_READY = 0x00, //virtual
enum ModuleState {
STATE_NOT_READY = 0x00, // virtual
STATE_HW_ERROR = 0x01,
STATE_BINDING = 0x02,
STATE_SYNC_RUNNING = 0x03,
@@ -94,7 +92,7 @@ enum ModuleState
STATE_UPDATING_RX = 0x08,
STATE_UPDATING_RX_FAILED = 0x09,
STATE_RF_TESTING = 0x0a,
STATE_READY = 0x0b, //virtual
STATE_READY = 0x0b, // virtual
STATE_HW_TEST = 0xff,
};
@@ -108,14 +106,12 @@ enum MODULE_MODE_E {
MODULE_MODE_UNKNOWN = 0xFF
};
enum CMD_RESULT
{
enum CMD_RESULT {
FAILURE = 0x01,
SUCCESS = 0x02,
};
enum CHANNELS_DATA_MODE
{
enum CHANNELS_DATA_MODE {
CHANNELS = 0x01,
FAIL_SAFE = 0x02,
};
@@ -126,14 +122,12 @@ PACK(struct ChannelsData {
int16_t data[AFHDS3_MAX_CHANNELS];
});
union ChannelsData_u
{
union ChannelsData_u {
ChannelsData data;
uint8_t buffer[sizeof(ChannelsData)];
};
PACK(struct TelemetryData
{
PACK(struct TelemetryData {
uint8_t sensorType;
uint8_t length;
uint8_t type;
@@ -141,14 +135,18 @@ PACK(struct TelemetryData
uint8_t data[8];
});
enum MODULE_POWER_SOURCE
{
enum MODULE_POWER_SOURCE {
INTERNAL = 0x01,
EXTERNAL = 0x02,
};
PACK(struct ModuleVersion
{
enum DeviceAddress {
TRANSMITTER = 0x01,
FRM303 = 0x04,
IRM301 = 0x05,
};
PACK(struct ModuleVersion {
uint32_t productNumber;
uint32_t hardwereVersion;
uint32_t bootloaderVersion;
@@ -156,15 +154,13 @@ PACK(struct ModuleVersion
uint32_t rfVersion;
});
PACK(struct CommandResult_s
{
PACK(struct CommandResult_s {
uint16_t command;
uint8_t result;
uint8_t respLen;
});
union AfhdsFrameData
{
union AfhdsFrameData {
uint8_t value;
// Config_s Config;
ChannelsData Channels;
@@ -183,32 +179,33 @@ class ProtoState
* @param moduleIndex index of module one of INTERNAL_MODULE, EXTERNAL_MODULE
* @param resetFrameCount flag if current frame count should be reseted
*/
void init(uint8_t moduleIndex, void* buffer, etx_module_state_t* mod_st);
void init(uint8_t moduleIndex, void* buffer, etx_module_state_t* mod_st,
uint8_t fAddr);
/**
* Fills DMA buffers with frame to be send depending on actual state
*/
void setupFrame();
/**
* Fills DMA buffers with frame to be send depending on actual state
*/
void setupFrame();
/**
* Sends prepared buffers
*/
void sendFrame() { trsp.sendBuffer(); }
/**
* Sends prepared buffers
*/
void sendFrame() { trsp.sendBuffer(); }
/**
/**
* Gets actual module status into provided buffer
* @param statusText target buffer for status
*/
void getStatusString(char * statusText) const;
void getStatusString(char* statusText) const;
/**
/**
* Sends stop command to prevent any further module operations
*/
void stop();
void stop();
Config_u* getConfig() { return &cfg; }
Config_u* getConfig() { return &cfg; }
void applyConfigFromModel();
void applyConfigFromModel();
protected:
@@ -468,10 +465,11 @@ void ProtoState::setupFrame()
}
}
void ProtoState::init(uint8_t moduleIndex, void* buffer, etx_module_state_t* mod_st)
void ProtoState::init(uint8_t moduleIndex, void* buffer,
etx_module_state_t* mod_st, uint8_t fAddr)
{
module_index = moduleIndex;
trsp.init(buffer, mod_st);
trsp.init(buffer, mod_st, fAddr);
//clear local vars because it is member of union
moduleData = &g_model.moduleData[module_index];
@@ -853,6 +851,10 @@ static void* initModule(uint8_t module)
etx_module_state_t* mod_st = nullptr;
etx_serial_init params(_uartParams);
uint16_t period = AFHDS3_UART_COMMAND_TIMEOUT * 1000;
uint8_t fAddr = (module == INTERNAL_MODULE ? DeviceAddress::IRM301
: DeviceAddress::FRM303)
<< 4 |
DeviceAddress::TRANSMITTER;
params.baudrate = AFHDS3_UART_BAUDRATE;
params.polarity =
@@ -871,7 +873,7 @@ static void* initModule(uint8_t module)
if (!mod_st) return nullptr;
auto p_state = &protoState[module];
p_state->init(module, pulsesGetModuleBuffer(module), mod_st);
p_state->init(module, pulsesGetModuleBuffer(module), mod_st, fAddr);
mod_st->user_data = (void*)p_state;
mixerSchedulerSetPeriod(module, period);
@@ -885,7 +887,8 @@ static void deinitModule(void* ctx)
modulePortDeInit(mod_st);
}
static void sendPulses(void* ctx, uint8_t* buffer, int16_t* channels, uint8_t nChannels)
static void sendPulses(void* ctx, uint8_t* buffer, int16_t* channels,
uint8_t nChannels)
{
(void)buffer;
(void)channels;
@@ -898,13 +901,11 @@ static void sendPulses(void* ctx, uint8_t* buffer, int16_t* channels, uint8_t nC
}
etx_proto_driver_t ProtoDriver = {
.protocol = PROTOCOL_CHANNELS_AFHDS3,
.init = initModule,
.deinit = deinitModule,
.sendPulses = sendPulses,
.processData = processTelemetryData,
.protocol = PROTOCOL_CHANNELS_AFHDS3,
.init = initModule,
.deinit = deinitModule,
.sendPulses = sendPulses,
.processData = processTelemetryData,
};
}
} // namespace afhds3
+14 -22
View File
@@ -51,18 +51,9 @@ enum AfhdsSpecialChars {
// ESC_ESC must be used
};
enum DeviceAddress
{
TRANSMITTER = 0x01,
// MODULE = 0x03,
MODULE = 0x05,
};
//Address used in transmitted frames - it constrains of target address and source address
const uint8_t FrameAddress = DeviceAddress::TRANSMITTER | (DeviceAddress::MODULE << 4);
void FrameTransport::init(void* buffer)
void FrameTransport::init(void* buffer, uint8_t fAddr)
{
frameAddress = fAddr;
trsp_buffer = (uint8_t*)buffer;
clear();
}
@@ -100,24 +91,25 @@ void FrameTransport::putBytes(uint8_t* data, int length)
}
}
void FrameTransport::putFrame(COMMAND command, FRAME_TYPE frameType, uint8_t* data,
uint8_t dataLength, uint8_t frameIndex)
void FrameTransport::putFrame(COMMAND command, FRAME_TYPE frameType,
uint8_t* data, uint8_t dataLength,
uint8_t frameIndex)
{
//header
// header
data_ptr = trsp_buffer;
crc = 0;
sendByte(START);
uint8_t buffer[] = {FrameAddress, frameIndex, frameType, command};
uint8_t buffer[] = {frameAddress, frameIndex, frameType, command};
putBytes(buffer, 4);
//payload
// payload
if (dataLength > 0) {
putBytes(data, dataLength);
}
//footer
// footer
uint8_t crcValue = crc ^ 0xff;
putBytes(&crcValue, 1);
sendByte(END);
@@ -223,9 +215,9 @@ void CommandFifo::enqueue(COMMAND command, FRAME_TYPE frameType, bool useData,
}
}
void Transport::init(void* buffer, etx_module_state_t* mod_st)
void Transport::init(void* buffer, etx_module_state_t* mod_st, uint8_t fAddr)
{
trsp.init(buffer);
trsp.init(buffer, fAddr);
this->mod_st = mod_st;
}
@@ -362,7 +354,8 @@ bool Transport::handleReply(uint8_t* buffer, uint8_t len)
bool Transport::processTelemetryData(uint8_t byte, uint8_t* rxBuffer,
uint8_t& rxBufferCount, uint8_t maxSize)
{
bool has_frame = trsp.processTelemetryData(byte, rxBuffer, rxBufferCount, maxSize);
bool has_frame =
trsp.processTelemetryData(byte, rxBuffer, rxBufferCount, maxSize);
if (has_frame && handleReply(rxBuffer, rxBufferCount)) {
rxBufferCount = 0;
return false;
@@ -370,5 +363,4 @@ bool Transport::processTelemetryData(uint8_t byte, uint8_t* rxBuffer,
return has_frame;
}
};
}; // namespace afhds3
+24 -32
View File
@@ -23,25 +23,22 @@
#include "afhds3_module.h"
#include "definitions.h"
#include "hal/module_port.h"
namespace afhds3
{
enum FRAME_TYPE: uint8_t
{
REQUEST_GET_DATA = 0x01, //Get data response: ACK + DATA
REQUEST_SET_EXPECT_DATA = 0x02, //Set data response: ACK + DATA
REQUEST_SET_EXPECT_ACK = 0x03, //Set data response: ACK
REQUEST_SET_NO_RESP = 0x05, //Set data response: none
RESPONSE_DATA = 0x10, //Response ACK + DATA
RESPONSE_ACK = 0x20, //Response ACK
enum FRAME_TYPE : uint8_t {
REQUEST_GET_DATA = 0x01, // Get data response: ACK + DATA
REQUEST_SET_EXPECT_DATA = 0x02, // Set data response: ACK + DATA
REQUEST_SET_EXPECT_ACK = 0x03, // Set data response: ACK
REQUEST_SET_NO_RESP = 0x05, // Set data response: none
RESPONSE_DATA = 0x10, // Response ACK + DATA
RESPONSE_ACK = 0x20, // Response ACK
NOT_USED = 0xff
};
enum COMMAND: uint8_t
{
enum COMMAND : uint8_t {
MODULE_READY = 0x01,
MODULE_STATE = 0x02,
MODULE_MODE = 0x03,
@@ -53,13 +50,12 @@ enum COMMAND: uint8_t
COMMAND_RESULT = 0x0D,
MODULE_VERSION = 0x20,
MODEL_ID = 0x2F,
VIRTUAL_FAILSAFE = 0x99, // virtual command used to trigger failsafe
VIRTUAL_FAILSAFE = 0x99, // virtual command used to trigger failsafe
UNDEFINED = 0xFF
};
// one byte frames for request queue
struct Frame
{
struct Frame {
enum COMMAND command;
enum FRAME_TYPE frameType;
uint8_t payload;
@@ -69,7 +65,7 @@ struct Frame
};
union AfhdsFrameData;
PACK(struct AfhdsFrame {
uint8_t startByte;
uint8_t address;
@@ -117,16 +113,16 @@ struct CommandFifo {
uint8_t byteContent);
};
struct FrameTransport
{
struct FrameTransport {
uint8_t* trsp_buffer;
uint8_t* data_ptr;
uint8_t crc;
uint8_t frameAddress;
// uint8_t timeout;
uint8_t esc_state;
void init(void* buffer);
void init(void* buffer, uint8_t fAddr);
void clear();
void sendByte(uint8_t b);
@@ -136,27 +132,23 @@ struct FrameTransport
uint8_t dataLength, uint8_t frameIndex);
uint32_t getFrameSize();
bool processTelemetryData(uint8_t byte, uint8_t* rxBuffer,
uint8_t& rxBufferCount, uint8_t maxSize);
};
class Transport
{
enum State {
UNKNOWN = 0,
SENDING_COMMAND,
AWAITING_RESPONSE,
IDLE
};
enum State { UNKNOWN = 0, SENDING_COMMAND, AWAITING_RESPONSE, IDLE };
etx_module_state_t* mod_st;
FrameTransport trsp;
CommandFifo fifo;
CommandFifo fifo;
/**
* Internal operation state one of UNKNOWN, SENDING_COMMAND, AWAITING_RESPONSE, IDLE
* Internal operation state one of UNKNOWN, SENDING_COMMAND,
* AWAITING_RESPONSE, IDLE
* Used to avoid sending commands when not allowed to
*/
State operationState;
@@ -173,12 +165,12 @@ class Transport
uint16_t repeatCount;
bool handleReply(uint8_t* buffer, uint8_t len);
public:
void init(void* buffer, etx_module_state_t* mod_st);
void init(void* buffer, etx_module_state_t* mod_st, uint8_t fAddr);
void clear();
void sendFrame(COMMAND command, FRAME_TYPE frameType, uint8_t* data = nullptr,
uint8_t dataLength = 0);
@@ -203,4 +195,4 @@ class Transport
bool processTelemetryData(uint8_t byte, uint8_t* rxBuffer,
uint8_t& rxBufferCount, uint8_t maxSize);
};
};
}; // namespace afhds3