Fixed Python Interface
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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();
|
||||
};
|
||||
@@ -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 {
|
||||
|
||||
@@ -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();
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -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();
|
||||
@@ -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);
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user