Fixed Python Interface

This commit is contained in:
AlexanderHD27
2025-01-07 17:10:28 +01:00
parent 1f5148dcdd
commit 2a038367a8
36 changed files with 404 additions and 237 deletions

View File

@@ -1,6 +1,11 @@
#include "ci/base.hpp"
#include "pinConfig.hpp"
#include "protocol.hpp"
#include "pico/stdlib.h"
#include "hardware/watchdog.h"
#include "FreeRTOSConfig.h"
#include "FreeRTOS.h"
#include "task.h"
@@ -32,6 +37,10 @@ void GobotRPC_CI::onRxData(char *data, size_t len) {
this->cb_TxPacket(this->cb_TxPacket_args, data+6, len-6, addr);
}
break;
case RESET_CI_PACKET:
// Register Reset Magic
softwareReset();
break;
default:
break;
}

View File

@@ -23,11 +23,19 @@ void GobotRPC_CI::txCIInstructionTask() {
send_ErrorTransmission(rx, addr);
break;
}
case CI_INSTRUCTION_SEND_TRANMISSION_SUCCESS: {
uint32_t addr = ciInstruction.data[1] | (ciInstruction.data[2] << 8) | (ciInstruction.data[3] << 16) | (ciInstruction.data[4] << 24);
uint32_t addr = ciInstruction.data[0] \
| (ciInstruction.data[1] << 8) \
| (ciInstruction.data[2] << 16) \
| (ciInstruction.data[3] << 24);
send_SuccessTransmission(addr);
break;
}
case CI_INSTRUCTION_SEND_INFO_RESET:
send_InfoReset();
break;
}
}
}
@@ -57,4 +65,13 @@ void GobotRPC_CI::send_SuccessTransmission(uint64_t addr) {
successPacket[5] = addr & 0xff;
this->hardware->send(successPacket, 6);
}
void GobotRPC_CI::send_InfoReset() {
char resetPacket[2];
resetPacket[0] = RESET_INFO_CI_PACKET;
resetPacket[1] = 2;
this->hardware->send(resetPacket, 2);
}

View File

@@ -5,11 +5,13 @@
enum GobotRPC_CI_CMD {
TX_CI_PACKET = 0x01,
RX_CI_PACKET = 0x02,
PERFORM_SCAN_CI_PACKET = 0x03,
SCAN_RESULT_CI_PACKET = 0x04,
SUCESS_TRANMISSION = 0xfc,
ERROR_TRANMISSION = 0xfd,
HEARTBEAT = 0xff
HEARTBEAT = 0xff,
RESET_CI_PACKET = 0xcc,
RESET_INFO_CI_PACKET = 0xcd
};
#define CI_TX_PACKAGE_DATA_OFFSET 6
@@ -48,4 +50,5 @@ public:
void txCIInstructionTask();
void send_ErrorTransmission(bool rx, uint64_t addr);
void send_SuccessTransmission(uint64_t addr);
void send_InfoReset();
};

View File

@@ -1,6 +1,7 @@
enum CI_Instruction_Type {
CI_INSTRUCTION_SEND_TRANMISSION_ERROR,
CI_INSTRUCTION_SEND_TRANMISSION_SUCCESS
CI_INSTRUCTION_SEND_TRANMISSION_SUCCESS,
CI_INSTRUCTION_SEND_INFO_RESET
};
struct CI_Instruction_Transport {

View File

@@ -30,6 +30,10 @@ public:
virtual void registerPushPackageCB(callback_pushPackage cb, void *args) = 0;
virtual void registerPushCIInstructionCB(callback_pushCIInstruction cb, void *args) = 0;
virtual void setAddrMap(uint32_t addr, int intNum) = 0;
void raiseTranmissionError(bool rx, uint32_t addr);
void raiseTransmissionSuceess(uint32_t addr);
void raiseInfoReset();
};
void i2cRxTaskFn(void * args);
@@ -78,6 +82,7 @@ public:
void raiseTranmissionError(bool rx, uint32_t addr);
void raiseTransmissionSuceess(uint32_t addr);
void raiseInfoReset();
};

View File

@@ -3,7 +3,8 @@
#include <strings.h>
enum GobotRPCNumber {
VACUM = 0x8
VACUM = 0x8,
RESET = 0xc
};
enum GobotRPCTypes {
@@ -30,4 +31,6 @@ void assembleGobotRPCHeader(char * buffer, GobotRPCNumber number, GobotRPCTypes
void assembleCRC(char * buffer, size_t data_len);
bool checkCRC(char * buffer, size_t data_len);
GobotRPCHeaderInfo extractGobotRPCHeader(char * buffer);
GobotRPCHeaderInfo extractGobotRPCHeader(char * buffer);
void softwareReset();

View File

@@ -59,6 +59,7 @@ void GobotRPC_NI::rxTask() {
void GobotRPC_NI::sendPackage(char *data, size_t len, GobotRPCTypes type, GobotRPCNumber number) {
GobotRPC_NI_Package_Transport package;
package.length = len + GobotRPC_Package_DATA_OFFSET + 2;
memcpy(package.data + GobotRPC_Package_DATA_OFFSET, data, len);
assembleGobotRPCHeader(package.data, number, type, len);
assembleCRC(package.data, len);

View File

@@ -71,6 +71,9 @@ GobotRPC_NI_Hardware_RP2040_I2C::GobotRPC_NI_Hardware_RP2040_I2C(
this->core = core;
this->readState = I2C_READ_STAGE_FIRST;
this->writeState = I2C_WRITE_STATE_FIRST;
this->isrRXQueue = RXQueue;
this->isrPreTxQueue = TXQueue;
this->isrTXQueue = xQueueCreate(3, sizeof(GobotRPC_NI_Package_Transport));

View File

@@ -40,7 +40,8 @@ void GobotRPC_NI_Hardware_RP2040_I2C::onI2CIRQ(I2C_SLAVE_EVENT event, BaseType_t
break;
}
case I2C_SLAVE_REQUEST: { // I2C Read from Master
case I2C_SLAVE_REQUEST: {
// I2C Read from Master
//if(xQueueIsQueueEmptyFromISR(isrTXQueue) == pdTRUE) {
// readState = I2C_READ_STAGE_INVALID;
//}
@@ -58,15 +59,13 @@ void GobotRPC_NI_Hardware_RP2040_I2C::onI2CIRQ(I2C_SLAVE_EVENT event, BaseType_t
break;
case I2C_READ_STAGE_WIP:
if(txPackage.index == txPackage.length - 1) {
readState = I2C_READ_STAGE_DONE;
} else {
i2c_write_byte_raw(i2c_inst, txPackage.data[txPackage.index++]);
i2c_write_byte_raw(i2c_inst, txPackage.data[txPackage.index++]);
if(txPackage.index == txPackage.length) {
readState = I2C_READ_STAGE_FIRST;
gpio_put(int_PIN, 0);
}
break;
case I2C_READ_STAGE_DONE:
i2c_write_byte_raw(i2c_inst, 0x00);
break;
default:
@@ -78,8 +77,9 @@ void GobotRPC_NI_Hardware_RP2040_I2C::onI2CIRQ(I2C_SLAVE_EVENT event, BaseType_t
case I2C_SLAVE_FINISH:
writeState = I2C_WRITE_STATE_FIRST;
readState = I2C_READ_STAGE_FIRST;
rxPackage.index = 0;
txPackage.index = 0;
break;
default:

View File

@@ -2,6 +2,7 @@
#include <stdint.h>
#include "pico/stdlib.h"
#include "hardware/watchdog.h"
#include "crc16.hpp"
@@ -28,4 +29,9 @@ bool checkCRC(char * buffer, size_t data_len) {
unsigned short crc = crc16(buffer, data_len - 2);
unsigned short crc_received = buffer[data_len - GobotRPC_Package_DATA_OFFSET + 1] | (buffer[data_len - GobotRPC_Package_DATA_OFFSET + 0] << 8);
return crc == crc_received;
}
void softwareReset() {
watchdog_enable(1, 1);
while(1);
}

View File

@@ -23,5 +23,12 @@ void GobotRPC_TI_Hardware_RP2040_I2C::raiseTransmissionSuceess(uint32_t addr) {
ciInstruction.data[2] = (addr >> 16) & 0xff;
ciInstruction.data[3] = (addr >> 24) & 0xff;
this->pushCIInstructionCB(&ciInstruction, pushCIInstructionCBArgs);
}
void GobotRPC_TI_Hardware_RP2040_I2C::raiseInfoReset() {
CI_Instruction_Transport ciInstruction;
ciInstruction.type = CI_INSTRUCTION_SEND_INFO_RESET;
this->pushCIInstructionCB(&ciInstruction, pushCIInstructionCBArgs);
}

View File

@@ -1,4 +1,5 @@
#include "transmission_interface.hpp"
#include "ci/base.hpp"
void i2cRxTaskFn(void * args) {
GobotRPC_TI_Hardware_RP2040_I2C * hw = (GobotRPC_TI_Hardware_RP2040_I2C *)args;
@@ -25,10 +26,10 @@ void GobotRPC_TI_Hardware_RP2040_I2C::i2cRxTask() {
bool read_res = readI2C(&pkg, addr);
xSemaphoreGive(i2cMutex);
if(read_res) {
if(pushPackageCB != NULL)
pushPackageCB(&pkg, pushPackageCBArgs);
}
//if(read_res) {
if(pushPackageCB != NULL)
pushPackageCB(&pkg, pushPackageCBArgs);
//}
break;
}
@@ -41,21 +42,16 @@ void GobotRPC_TI_Hardware_RP2040_I2C::i2cRxTask() {
}
bool GobotRPC_TI_Hardware_RP2040_I2C::readI2C(GoRPCPackage_Transport * pkg, uint32_t addr) {
uint res = i2c_read_burst_blocking(i2c, addr, (uint8_t *)pkg->data, 2);
if(res == PICO_ERROR_GENERIC)
return false; // I2C error
size_t len = pkg->data[1];
unsigned int res;
//uint res = i2c_read_blocking(i2c, addr, (uint8_t *)pkg->data, 2, true);
size_t remaining = len >= 2 ? len - 2 : 0;
i2c_read_blocking(i2c, addr, (uint8_t *)pkg->data + CI_RX_PACKAGE_DATA_OFFSET, 2, true);
res = i2c_read_burst_blocking(i2c, addr, ((uint8_t *)pkg->data) + 2, len - 2);
if(res == PICO_ERROR_GENERIC)
return false; // I2C error
size_t len = pkg->data[CI_RX_PACKAGE_DATA_OFFSET + 1];
res = i2c_read_blocking(i2c, addr, ((uint8_t *)pkg->data) + CI_RX_PACKAGE_DATA_OFFSET, len, false);
pkg->len = len;
pkg->addr = addr;
return true;

View File

@@ -41,6 +41,17 @@ void onTxPacket(void * args, char *data, size_t len, uint32_t addr) {
//gobotRPC_ci->send_RxPacket(pkg.data, CALC_SIZE_GobotRPC_PACKAGE(0), addr);
}
void onRXFromI2CTask(void * pvParameters) {
GobotRPC_CI * gobotRPC_ci = (GobotRPC_CI *)pvParameters;
GoRPCPackage_Transport pkg;
while (true) {
xQueueReceive(appData.rxQueue, &pkg, portMAX_DELAY);
gobotRPC_ci->send_RxPacket(pkg.data, pkg.len, pkg.addr);
}
}
int main() {
gpio_init(LED_PIN);
gpio_set_dir(LED_PIN, true);
@@ -57,8 +68,10 @@ int main() {
TaskHandle_t taskHandleCore0;
TaskHandle_t taskHandleCore1;
TaskHandle_t taskRXFromI2CTask;
xTaskCreateAffinitySet(vTaskMain, "Main Task Core 0", 2048, &gobotRPC_ci, 1, UART_CORE_MASK, &taskHandleCore0);
xTaskCreateAffinitySet(main_core2, "Main Task Core 1", 2048, &gobotRPC_ci, 1, UART_CORE_MASK, &taskHandleCore1);
xTaskCreateAffinitySet(onRXFromI2CTask, "RX From I2C Task", 2048, &gobotRPC_ci, 3, UART_CORE_MASK, &taskRXFromI2CTask);
vTaskStartScheduler();

View File

@@ -28,12 +28,14 @@ void pushCIInstruction(CI_Instruction_Transport * src, void *args) {
void main_core2(void * pvParameters) {
AppData appData = *((AppData *)pvParameters);
GobotRPC_TI_Hardware_RP2040_I2C gobotrpc_ti_hardware(UART_CORE_MASK, i2c0);
gobotrpc_ti_hardware.setAddrMap(0x21, 2);
gobotrpc_ti_hardware.setAddrMap(0x21, 0);
gobotrpc_ti_hardware.registerPullPackageCB(pullPackageCB, appData.txQueue);
gobotrpc_ti_hardware.registerPushPackageCB(pushPackage, appData.rxQueue);
gobotrpc_ti_hardware.registerPushCIInstructionCB(pushCIInstruction, appData.ciInstructionQueue);
gobotrpc_ti_hardware.raiseInfoReset();
while(1) {
vTaskDelay(pdMS_TO_TICKS(10000));
}