12 commSerial =
new SoftwareSerial(rx, tx);
19 commSerial->begin(_baudrate, SERIAL_8N1);
21 timeout_ms = millis() + timeout_ms;
22 while (millis() < timeout_ms) {
40 uint8_t data[2] = {(1 << --num), (uint8_t)dir};
48 if (!CommReadData(b, 1)) {
65 uint8_t data[2] = {(1 << --num), (uint8_t)dir};
73 if (!CommReadData(b, 1)) {
91 uint8_t data[2] = {(1 << --num), (uint8_t)dir};
99 if (!CommReadData(b, 1)) {
118 data[0] = (1 << --num);
128 if (!CommReadData(b, 1)) {
147 data[0] = (1 << --num);
157 if (!CommReadData(b, 1)) {
184 data[0] = (1 << --num);
194 if (!CommReadData(b, 1)) {
221 data[0] = (uint8_t)mode;
230 if (!CommReadData(b, 1)) {
257 data[0] = (uint8_t)accFSR;
258 data[1] = (uint8_t)gyroFSR;
259 data[2] = (uint8_t)odr;
260 data[3] = (uint8_t)fifo;
268 if (!CommReadData(b, 1)) {
299 data[0] = (uint8_t)(fullVolt * 10.0f);
300 data[1] = (uint8_t)(cutOffVolt * 10.0f);
301 data[2] = (uint8_t)(alarmVolt * 10.0f);
309 if (!CommReadData(b, 1, 5)) {
332 data[0] = (1 << --num);
342 if (!CommReadData(b, 1)) {
365 data[0] = (1 << --num);
375 if (!CommReadData(b, 1)) {
398 data[0] = (1 << --num);
408 if (!CommReadData(b, 1)) {
427 data[0] = (uint8_t)param.
m1_dir;
428 data[0] |= ((uint8_t)param.
m2_dir) << 1;
429 data[0] |= ((uint8_t)param.
m3_dir) << 2;
430 data[0] |= ((uint8_t)param.
m4_dir) << 3;
442 if (!CommReadData(b, 1)) {
477 data[0] = (1 << --num);
486 if (!CommReadData(b, 1)) {
505 uint16_t angle1, uint16_t angle2, uint16_t angle3, uint16_t angle4)
521 if (!CommReadData(b, 1)) {
556 data[0] = (uint8_t)type;
557 data[1] = (uint8_t)action;
567 if (!CommReadData(b, 1)) {
597 uint8_t data[1] = {(1 << --num)};
605 if (!CommReadData(b, 1)) {
620 uint8_t data[8] = {(1 << --num), pidNum};
632 if (!CommReadData(b, 1)) {
648 uint8_t data[1] = {(1 << --num)};
656 if (!CommReadData(b, 1)) {
674 data[0] = brightness;
675 data[1] = (uint8_t)(colorRGB >> 16);
676 data[2] = (uint8_t)(colorRGB >> 8);
677 data[3] = (uint8_t)(colorRGB);
685 if (!CommReadData(b, 1, 10)) {
709 if (!CommReadData(b, 1, 10)) {
726 uint8_t data[1] = {--num};
734 if (!CommReadData(b, 1)) {
738 btnState = (bool)b[0];
755 if (!CommReadData(b, 2)) {
760 btnsState[0] = (bool)(flag);
761 btnsState[1] = (bool)(flag >> 1);
771 uint8_t data[1] = {--num};
779 if (!CommReadData(b, 4)) {
800 if (!CommReadData(b, 16)) {
824 if (!CommReadData(b, 6)) {
848 if (!CommReadData(b, 6)) {
871 if (!CommReadData(b, 6)) {
894 if (!CommReadData(b, 3)) {
900 curVolt = (float)voltRaw / 1000.0f;
901 curVoltPerc = (float)b[2];
911 uint8_t data[1] = {--num};
919 if (!CommReadData(b, 1)) {
933 uint8_t data[1] = {0x55};
941 if (!CommReadData(b, 1)) {
945 if (b[0] == data[0]) {
964 if (!CommReadData(b, 1)) {
969 version = String(b[0] / 10.0f);
986 if (!CommReadData(b, 4)) {
992 uint8_t month = b[2];
996 sprintf(str,
"%04d-%02d-%02d", year, month, day);
1014 if (!CommReadData(b, 1)) {
1020 uint8_t str[len + 1];
1021 if (!CommReadData(str, len)) {
1026 descriptor = String((
char*)str);
1042 if (!CommReadData(b, 1)) {
1063 if (!CommReadData(b, 6)) {
1068 uint8_t month = b[2];
1072 sprintf(str,
"%04d-%02d-%02d", year, month, day);
1093 if (!CommReadData(b, 1)) {
1098 if ((b[0] & 0x01) == 0x00) {
1114 callbackFunc = callback;
1117void MMLower::CommSendData(COMM_CMD cmd, uint8_t* data, uint16_t size)
1119 uint8_t arr[3 + size];
1123 *ptr++ = ((~MatrixR4_COMM_LEAD) & 0xFF);
1124 *ptr++ = (uint8_t)cmd;
1126 for (uint16_t i = 0; i < size; i++) {
1129 commSerial->write(arr, 3 + size);
1130 commSerial->flush();
1133void MMLower::CommSendData(COMM_CMD cmd, uint8_t data)
1135 uint8_t _data[1] = {data};
1136 CommSendData((
COMM_CMD)cmd, _data, 1);
1139bool MMLower::CommReadData(uint8_t* data, uint16_t size, uint32_t timeout_ms)
1141 uint32_t timeout = millis() + timeout_ms;
1142 while (millis() <= timeout) {
1143 if (commSerial->available() >= size) {
1144 for (uint16_t i = 0; i < size; i++) {
1145 data[i] = commSerial->read();
1152 while (commSerial->available() > 0) {
1158bool MMLower::WaitData(COMM_CMD cmd, uint32_t timeout_ms)
1162 uint32_t timeout = millis() + timeout_ms;
1163 while (millis() <= timeout) {
1164 if (commSerial->available() <= 0) {
1170 uint8_t b = commSerial->read();
1178 uint8_t b = commSerial->read();
1187 uint8_t b = commSerial->read();
1188 if (b == (uint8_t)cmd) {
1212void MMLower::HandleCommand(uint8_t cmd)
1218 if (CommReadData(b, 2)) {
1219 if (callbackFunc == NULL)
break;
1221 callbackFunc(b[0] + 1, (
BTN_STATE)b[1]);
1228 if (CommReadData(b, 8)) {
1237 if (CommReadData(b, 6)) {}
1242 if (CommReadData(b, 6)) {
1251 if (CommReadData(b, 6)) {
MiniR4 low level functions.
Handling the Lower MCU (STM32) communication.
#define MR4_DEBUG_PRINT_HEADER(...)
#define MatrixR4_ENCODER_NUM
#define MR4_DEBUG_PRINTLN(...)
#define MatrixR4_BUTTON_NUM
#define MR4_DEBUG_PRINT_TAIL(...)
#define MatrixR4_COMM_LEAD
#define MR4_DEBUG_PRINT(...)
static int16_t ToInt16(uint8_t *value, int startIdx)
static void GetBytes(uint8_t *buff, uint32_t value)
static int32_t ToInt32(uint8_t *value, int startIdx)
static uint16_t ToUInt16(uint8_t *value, int startIdx)
Handling the Lower MCU (STM32) communication.
RESULT SetAllServoAngle(uint16_t angle1, uint16_t angle2, uint16_t angle3, uint16_t angle4)
RESULT GetAllInfo(AllInfo_t &info)
RESULT GetRotateState(uint8_t num, bool &isEnd)
RESULT SetEncoderDir(uint8_t num, DIR dir)
RESULT SetStateLED(uint8_t brightness, uint32_t colorRGB)
RESULT SetServoAngleRange(uint8_t num, uint16_t min, uint16_t max)
RESULT SetServoPulseRange(uint8_t num, uint16_t min, uint16_t max)
RESULT SetDCMotorPower(uint8_t num, int16_t power)
@ SET_ENCODER_RESET_COUNTER
@ AUTO_SEND_ENCODER_COUNTER
@ GET_ALL_ENCODER_COUNTER
@ SET_DC_MOTOR_SPEED_RANGE
int32_t enCounter[MatrixR4_ENCODER_NUM]
RESULT SetDCMotorRotate(uint8_t num, int16_t maxSpeed, uint16_t degree)
RESULT GetIMUGyro(double &x, double &y, double &z)
RESULT SetServoAngle(uint8_t num, uint16_t angle)
RESULT GetFWVersion(String &version)
RESULT GetFWBuildDay(String &date)
RESULT Init(uint32_t timeout_ms=1000)
RESULT GetFWDescriptor(String &descriptor)
RESULT GetEncoderCounter(uint8_t num, int32_t &enCounter)
RESULT SetDCMotorSpeed(uint8_t num, int16_t speed)
RESULT GetPowerInfo(float &curVolt, float &curVoltPerc)
RESULT GetButtonState(uint8_t num, bool &btnState)
RESULT SetEncoderResetCounter(uint8_t num)
RESULT GetIMUAcc(double &x, double &y, double &z)
RESULT SetIMUEchoMode(IMU_ECHO_MODE mode, uint16_t echoIntervalMs)
RESULT GetModelIndex(uint8_t &index)
RESULT SetAllDCMotorSpeed(Motors_Param_t param)
void onBtnChg(BtnChgCallback callback)
RESULT SetServoDir(uint8_t num, DIR dir)
RESULT SetMoveDistance(MOVE_TYPE type, MOVE_ACTION action, uint16_t speed, uint16_t enCounter)
RESULT GetIMUEuler(int16_t &roll, int16_t &pitch, int16_t &yaw)
RESULT GetAllEncoderCounter(int32_t *enCounter)
RESULT SetPIDParam(uint8_t num, uint8_t pidNum, float kp, float ki, float kd)
RESULT SetIMUToZero(void)
MMLower(uint8_t rx, uint8_t tx, uint32_t baudrate)
RESULT SetDCMotorSpeedRange(uint8_t num, uint16_t min, uint16_t max)
RESULT GetButtonsState(bool *btnsState)
RESULT SetDCBrake(uint8_t num)
RESULT SetIMUInit(IMU_ACC_FSR accFSR, IMU_GYRO_FSR gyroFSR, IMU_ODR odr, IMU_FIFO fifo)
RESULT SetDCMotorDir(uint8_t num, DIR dir)
RESULT SetPowerParam(float fullVolt, float cutOffVolt, float alarmVolt)