Implemented UART_CTRL Interface (missing Hardware implementation)
This commit is contained in:
@@ -3,6 +3,11 @@ add_library(GobotRPC STATIC
|
||||
${CMAKE_CURRENT_LIST_DIR}/../init.cpp
|
||||
${CMAKE_CURRENT_LIST_DIR}/../protocol.cpp
|
||||
${CMAKE_CURRENT_LIST_DIR}/../error_msg.cpp
|
||||
|
||||
${CMAKE_CURRENT_LIST_DIR}/../uart_ctrl/uart_ctrl_base.cpp
|
||||
${CMAKE_CURRENT_LIST_DIR}/../uart_ctrl/uart_ctrl_registers.cpp
|
||||
${CMAKE_CURRENT_LIST_DIR}/../uart_ctrl/uart_ctrl_rx.cpp
|
||||
${CMAKE_CURRENT_LIST_DIR}/../uart_ctrl/uart_ctrl_tx.cpp
|
||||
)
|
||||
|
||||
target_include_directories(GobotRPC PUBLIC
|
||||
|
||||
@@ -23,9 +23,9 @@ char * mapFrameSubmitionResult2String(FrameSubmitionResult res) {
|
||||
|
||||
void GobotRPCParser::print_out_slots() {
|
||||
for(int i = 0; i < NUM_SLOTS; i++) {
|
||||
printf("[%d] %d%d (%x-%d) %d T%08x ", i,
|
||||
printf("[%d] %d%d (%x-%d) %d T%08x S=%02d ", i,
|
||||
buffer[i].is_complete, buffer[i].is_in_use, buffer[i].sender_address,
|
||||
buffer[i].rpcNum, buffer[i].type, buffer[i].timestamp
|
||||
buffer[i].rpcNum, buffer[i].type, buffer[i].timestamp, buffer[i].length
|
||||
);
|
||||
|
||||
for(int j = 0; j < MAX_PAGE_SIZES; j++) {
|
||||
|
||||
@@ -25,6 +25,7 @@ struct RPC_RX_PackageSlot {
|
||||
enum RPCType type;
|
||||
uint32_t used_bit_masked;
|
||||
uint32_t timestamp;
|
||||
size_t length;
|
||||
};
|
||||
|
||||
struct RPCPackage {
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
#pragma once
|
||||
#include <stdint.h>
|
||||
#include "gobotrpc.hpp"
|
||||
#include "uart_ctrl_hardware.hpp"
|
||||
|
||||
struct HubInfo {
|
||||
uint8_t slotNumbers;
|
||||
};
|
||||
|
||||
typedef void (*UART_CTRL_Callback_Packet)(void * args, RPCPackage package);
|
||||
typedef void (*UART_CTRL_Callback_PerformScan)(void * args, bool enable);
|
||||
typedef void (*UART_CTRL_Callback_ReqSlotUpdate)(void * args, bool enable);
|
||||
typedef HubInfo (*UART_CTRL_Callback_GetInfo)(void * args);
|
||||
|
||||
void externalCallback_RX(void * args, char * data, size_t length);
|
||||
|
||||
class UART_CTRL_Interface {
|
||||
private:
|
||||
UART_CTRL_Callback_Packet packetCallback;
|
||||
UART_CTRL_Callback_PerformScan performScanCallback;
|
||||
UART_CTRL_Callback_ReqSlotUpdate reqSlotUpdateCallback;
|
||||
UART_CTRL_Callback_GetInfo getInfoCallback;
|
||||
void * packetCallbackArgs;
|
||||
void * performScanCallbackArgs;
|
||||
void * reqSlotUpdateCallbackArgs;
|
||||
void * getInfoCallbackArgs;
|
||||
|
||||
I_UART_CTRL_Hardware_Handler * handler;
|
||||
protected:
|
||||
void onRX_Packet(char * data, size_t length);
|
||||
void onRX_PerformScan(char * data, size_t length);
|
||||
void onRX_ReqSlotUpdate(char * data, size_t length);
|
||||
void onRX_GetInfo(char * data, size_t length);
|
||||
|
||||
public:
|
||||
UART_CTRL_Interface(I_UART_CTRL_Hardware_Handler * handler);
|
||||
void onRX(char * data, size_t length);
|
||||
|
||||
void pushPacket(RPCPackage package);
|
||||
void pushScanResulst(uint32_t addr, bool running);
|
||||
void pushPackageSlotUpdate(bool complete, bool inUse, uint32_t slot, uint32_t addr, uint32_t timestamp, uint32_t bits);
|
||||
void pushInfo(uint8_t slotNumbers);
|
||||
|
||||
void registerCallback_Packet(UART_CTRL_Callback_Packet callback, void * args);
|
||||
void registerCallback_PerformScan(UART_CTRL_Callback_PerformScan callback, void * args);
|
||||
void registerCallback_ReqSlotUpdate(UART_CTRL_Callback_ReqSlotUpdate callback, void * args);
|
||||
void registerCallback_GetInfo(UART_CTRL_Callback_GetInfo callback, void * args);
|
||||
};
|
||||
|
||||
|
||||
enum UART_CTRL_Command_ID {
|
||||
UART_CMD_PACKET = 0x01, // Host <-> Hub
|
||||
UART_CMD_PERFORM_SCAN = 0x02, // Host -> Hub
|
||||
UART_CMD_SCAN_RESULT = 0x03, // Hub -> Host
|
||||
UART_CMD_SLOT_UPDATE = 0x04, // Hub -> Host
|
||||
UART_CMD_REQ_SLOT_UPDATE = 0x05, // Host -> Hub
|
||||
UART_CMD_INFO = 0xff, // Host -> Hub, Hub -> Host
|
||||
};
|
||||
@@ -0,0 +1,8 @@
|
||||
#pragma once
|
||||
typedef void (*UART_CTRL_Callback_RX)(void * args, char * data, size_t length);
|
||||
|
||||
class I_UART_CTRL_Hardware_Handler {
|
||||
public:
|
||||
virtual void send(char * data, size_t length) = 0;
|
||||
virtual void registerCallback(UART_CTRL_Callback_RX) = 0;
|
||||
};
|
||||
@@ -10,6 +10,7 @@ GobotRPCParser::GobotRPCParser() {
|
||||
buffer[i].sender_address = 0;
|
||||
buffer[i].rpcNum = Invalid;
|
||||
buffer[i].type = INVALID;
|
||||
buffer[i].length = 0;
|
||||
|
||||
memset(buffer[i].buffer, 0, MAX_PAGE_SIZES);
|
||||
}
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
#include "protocol.hpp"
|
||||
#include <string.h>
|
||||
|
||||
#define MAX(x, y) (((x) > (y)) ? (x) : (y))
|
||||
|
||||
RPCHeader parseRPCHeader(char data)
|
||||
{
|
||||
RPCHeader header;
|
||||
@@ -50,6 +52,7 @@ FrameSubmitionResult GobotRPCParser::submit_frame(char *data, size_t length, uin
|
||||
|
||||
insertFrameInPackageSlot(&this->buffer[slotNum], data, header.segment, length);
|
||||
this->buffer[slotNum].timestamp = timestamp;
|
||||
this->buffer[slotNum].length = MAX(this->buffer[slotNum].length, header.segment*7 + (length - 1));
|
||||
volatile FrameSubmitionResult res = getPackageStatus(&(this->buffer[slotNum]));
|
||||
|
||||
if (res == COMPLEATE) {
|
||||
@@ -112,6 +115,7 @@ void GobotRPCParser::retrivePackage(RPCPackage *dest, int index) {
|
||||
dest->addr = buffer[index].sender_address;
|
||||
dest->rpcNum = buffer[index].rpcNum;
|
||||
dest->type = buffer[index].type;
|
||||
dest->length = buffer[index].length;
|
||||
|
||||
freePackageSlot(index);
|
||||
}
|
||||
@@ -124,4 +128,5 @@ void GobotRPCParser::freePackageSlot(size_t index) {
|
||||
this->buffer[index].sender_address = 0;
|
||||
this->buffer[index].rpcNum = Invalid;
|
||||
this->buffer[index].type = INVALID;
|
||||
this->buffer[index].length = 0;
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
#include "uart_ctrl.hpp"
|
||||
#include <stdint.h>
|
||||
|
||||
UART_CTRL_Interface::UART_CTRL_Interface(I_UART_CTRL_Hardware_Handler *handler) {
|
||||
this->handler = handler;
|
||||
handler->registerCallback(externalCallback_RX);
|
||||
|
||||
packetCallback = nullptr;
|
||||
performScanCallback = nullptr;
|
||||
getInfoCallback = nullptr;
|
||||
|
||||
packetCallbackArgs = nullptr;
|
||||
performScanCallbackArgs = nullptr;
|
||||
getInfoCallbackArgs = nullptr;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
#include "uart_ctrl.hpp"
|
||||
#include <string.h>
|
||||
|
||||
void UART_CTRL_Interface::registerCallback_Packet(UART_CTRL_Callback_Packet callback, void *args) {
|
||||
packetCallback = callback;
|
||||
packetCallbackArgs = args;
|
||||
}
|
||||
|
||||
void UART_CTRL_Interface::registerCallback_PerformScan(UART_CTRL_Callback_PerformScan callback, void *args) {
|
||||
performScanCallback = callback;
|
||||
performScanCallbackArgs = args;
|
||||
}
|
||||
|
||||
void UART_CTRL_Interface::registerCallback_ReqSlotUpdate(UART_CTRL_Callback_ReqSlotUpdate callback, void *args) {
|
||||
reqSlotUpdateCallback = callback;
|
||||
reqSlotUpdateCallbackArgs = args;
|
||||
}
|
||||
|
||||
void UART_CTRL_Interface::registerCallback_GetInfo(UART_CTRL_Callback_GetInfo callback, void *args) {
|
||||
getInfoCallback = callback;
|
||||
getInfoCallbackArgs = args;
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
#include "uart_ctrl.hpp"
|
||||
#include "gobotrpc.hpp"
|
||||
#include <string.h>
|
||||
|
||||
void externalCallback_RX(void * args, char * data, size_t length) {
|
||||
UART_CTRL_Interface *interface = (UART_CTRL_Interface *)args;
|
||||
interface->onRX(data, length);
|
||||
}
|
||||
|
||||
void UART_CTRL_Interface::onRX(char * data, size_t length) {
|
||||
uint8_t cmd = data[0];
|
||||
switch (cmd) {
|
||||
case UART_CMD_PACKET:
|
||||
onRX_Packet(data, length);
|
||||
break;
|
||||
|
||||
case UART_CMD_PERFORM_SCAN:
|
||||
onRX_PerformScan(data, length);
|
||||
break;
|
||||
|
||||
case UART_CMD_REQ_SLOT_UPDATE:
|
||||
onRX_ReqSlotUpdate(data, length);
|
||||
break;
|
||||
|
||||
case UART_CMD_INFO:
|
||||
onRX_GetInfo(data, length);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void UART_CTRL_Interface::onRX_Packet(char *data, size_t length) {
|
||||
if(length < 7)
|
||||
return;
|
||||
|
||||
|
||||
if (packetCallback != nullptr) {
|
||||
RPCPackage package;
|
||||
package.length = data[1];
|
||||
package.type = RPCType(data[2] & 0b11);
|
||||
package.rpcNum = RPCNumber(data[2] >> 4);
|
||||
memcpy(&package.addr, &data[3], 4);
|
||||
memcpy(package.buffer, &data[7], package.length);
|
||||
|
||||
packetCallback(packetCallbackArgs, package);
|
||||
}
|
||||
}
|
||||
|
||||
void UART_CTRL_Interface::onRX_PerformScan(char *data, size_t length) {
|
||||
if(length < 2)
|
||||
return;
|
||||
|
||||
if (performScanCallback != nullptr)
|
||||
performScanCallback(performScanCallbackArgs, data[1] == 1);
|
||||
}
|
||||
|
||||
void UART_CTRL_Interface::onRX_ReqSlotUpdate(char *data, size_t length) {
|
||||
if (length < 2)
|
||||
return;
|
||||
|
||||
if (reqSlotUpdateCallback != nullptr)
|
||||
reqSlotUpdateCallback(reqSlotUpdateCallbackArgs, data[1] == 1);
|
||||
}
|
||||
|
||||
void UART_CTRL_Interface::onRX_GetInfo(char *data, size_t length) {
|
||||
if (length < 1)
|
||||
return;
|
||||
|
||||
if (getInfoCallback != nullptr)
|
||||
getInfoCallback(getInfoCallbackArgs);
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
#include "uart_ctrl.hpp"
|
||||
#include <string.h>
|
||||
|
||||
// This function should be called when a package is sent
|
||||
void UART_CTRL_Interface::pushPacket(RPCPackage package) {
|
||||
char buffer[MAX_PAGE_SIZES + 7];
|
||||
|
||||
buffer[0] = UART_CMD_PACKET;
|
||||
buffer[1] = package.length;
|
||||
buffer[2] = package.type | (package.rpcNum << 4);
|
||||
memcpy(&buffer[3], &package.addr, 4);
|
||||
memcpy(&buffer[7], package.buffer, package.length);
|
||||
|
||||
handler->send(buffer, package.length + 2);
|
||||
}
|
||||
|
||||
void UART_CTRL_Interface::pushScanResulst(uint32_t addr, bool running) {
|
||||
char buffer[7];
|
||||
|
||||
buffer[0] = UART_CMD_SCAN_RESULT;
|
||||
buffer[1] = running ? 1 : 0;
|
||||
memcpy(&buffer[2], &addr, 4);
|
||||
buffer[6] = 0; // This is where the type would go
|
||||
|
||||
handler->send(buffer, 7);
|
||||
}
|
||||
|
||||
void UART_CTRL_Interface::pushPackageSlotUpdate(bool complete, bool inUse, uint32_t slot, uint32_t addr, uint32_t timestamp, uint32_t bits) {
|
||||
char buffer[16];
|
||||
|
||||
buffer[0] = UART_CMD_SLOT_UPDATE;
|
||||
buffer[1] = complete ? 1 : 0;
|
||||
buffer[2] = inUse ? 1 : 0;
|
||||
buffer[3] = slot;
|
||||
memcpy(&buffer[4], &addr, 4);
|
||||
memcpy(&buffer[8], ×tamp, 4);
|
||||
memcpy(&buffer[12], &bits, 4);
|
||||
|
||||
handler->send(buffer, 14);
|
||||
}
|
||||
|
||||
void UART_CTRL_Interface::pushInfo(uint8_t slotNumbers) {
|
||||
char buffer[2];
|
||||
|
||||
buffer[0] = UART_CMD_INFO;
|
||||
buffer[1] = slotNumbers;
|
||||
|
||||
handler->send(buffer, 2);
|
||||
}
|
||||
@@ -21,7 +21,7 @@ void TaskFn(void * args) {
|
||||
char data2[] = "\x84\xaa\xbb";
|
||||
|
||||
|
||||
rpcRXParser.submit_frame(data0, 7, 0x42, xTaskGetTickCount());
|
||||
rpcRXParser.submit_frame(data2, 3, 0x42, xTaskGetTickCount());
|
||||
rpcRXParser.print_out_slots();
|
||||
printf("\n");
|
||||
|
||||
@@ -39,7 +39,7 @@ void TaskFn(void * args) {
|
||||
rpcRXParser.print_out_slots();
|
||||
printf("\n");
|
||||
|
||||
rpcRXParser.submit_frame(data2, 3, 0x42, xTaskGetTickCount());
|
||||
rpcRXParser.submit_frame(data0, 7, 0x42, xTaskGetTickCount());
|
||||
rpcRXParser.print_out_slots();
|
||||
printf("\n");
|
||||
|
||||
|
||||
Reference in New Issue
Block a user