The function library of serial servo controller
Dependents: DR-ArmServoTest ros_button_2021 DR-ArmServoTest
LSCServo.cpp
- Committer:
- stivending
- Date:
- 2021-06-03
- Revision:
- 2:acaaf1126d76
- Parent:
- 1:1398d9ddd4ef
File content as of revision 2:acaaf1126d76:
//mbed library #include "mbed.h" //ros library #include "BufferedSerial.h" #include <vector> #include <cstdarg> #include "LSCServo.h" #define GET_LOW_char(A) (uint8_t)((A)) //Macro function get lower 8 bits of A #define GET_HIGH_char(A) (uint8_t)((A) >> 8) //Macro function get higher 8 bits of A #define char_TO_HW(A, B) ((((uint16_t)(A)) << 8) | (uint8_t)(B)) //put A as higher 8 bits B as lower 8 bits which amalgamated into 16 bits integer using namespace std; //constructor LSCServo::LSCServo(PinName tx, PinName rx, uint32_t buf_size, uint32_t tx_multiple, const char* name) : serial(tx, rx, buf_size, tx_multiple) { } //destructor LSCServo::~LSCServo() { } void LSCServo::receive_buffer(char* destination, int length) { int index = 0; while(index < length) { while(!serial.readable()); while(serial.readable()) { destination[index++] = serial.getc(); } } } void LSCServo::LobotSerialoneServoMove(uint16_t id, int16_t position, uint16_t time) //control one serial servo move dedicated position { char buf[10]; if(position < 0) position = 0; if(position > 1000) position = 1000; buf[0] = buf[1] = LOBOT_SERVO_FRAME_HEADER; buf[2] = 0x08; buf[3] = 0x03; buf[4] = 0x01; buf[5] = GET_LOW_char(time); buf[6] = GET_HIGH_char(time); buf[7] = GET_LOW_char(id); buf[8] = GET_LOW_char(position); buf[9] = GET_HIGH_char(position); serial.write(buf, 10); } void LSCServo::LobotSerialServoMove(vector<uint16_t> id, vector<int16_t> position, uint16_t time) //control list of serial servo move dedicated position { char buf[126]; int limit = id.size(); int checksum = limit*3 + 6; buf[0] = buf[1] = LOBOT_SERVO_FRAME_HEADER; buf[2] = GET_LOW_char(checksum-2); buf[3] = 0x03; buf[4] = GET_LOW_char(limit); buf[5] = GET_LOW_char(time); buf[6] = GET_HIGH_char(time); int index = 7; for(int i = 0; i < limit; i++) { buf[index]=GET_LOW_char(id[i]); index++; if(position[i] < 0) position[i] = 0; if(position[i] > 1000) position[i] = 1000; buf[index]=GET_LOW_char(position[i]); index++; buf[index]=GET_HIGH_char(position[i]); index++; } serial.write(buf,checksum); } void LSCServo::LobotSerialActionGroupRun(uint16_t gpid, uint16_t count) //run action group(action group id, repeat time) { char buf[7]; buf[0]=buf[1]=LOBOT_SERVO_FRAME_HEADER; buf[2]=0x05; buf[3]=0x06; buf[4]=GET_LOW_char(gpid); buf[5]=GET_LOW_char(count); buf[6]=GET_HIGH_char(count); serial.write(buf,7); char word[7]; receive_buffer(word, 7); } void LSCServo::LobotSerialActionGroupSpeed(uint16_t gpid, uint16_t speed) //Set Run speed Action Group in XXX% { char buf[7]; buf[0]=buf[1]=LOBOT_SERVO_FRAME_HEADER; buf[2]=0x05; buf[3]=0x0B; buf[4]=GET_LOW_char(gpid); buf[5]=GET_LOW_char(speed); buf[6]=GET_HIGH_char(speed); serial.write(buf,7); } int LSCServo::LobotSerialGetBatteryVoltage() //get voltage of board in terms of mV { char buf[4]; buf[0]=buf[1]=LOBOT_SERVO_FRAME_HEADER; buf[2]=0x02; buf[3]=0x0F; serial.write(buf,4); char word[6]; receive_buffer(word, 6); int voltage = char_TO_HW(word[5], word[4]); return voltage; } void LSCServo::LobotSerialActionGroupStop() //Stop current action group { char buf[4]; buf[0]=buf[1]=LOBOT_SERVO_FRAME_HEADER; buf[2]=0x02; buf[3]=0x07; serial.write(buf,4); } void LSCServo::moveServos(uint8_t Num, uint16_t Time, ...) { uint8_t buf[128]; va_list arg_ptr; va_start(arg_ptr, Time); if (Num < 1 || Num > 32 || (!(Time > 0))) { return; } buf[0] = LOBOT_SERVO_FRAME_HEADER; buf[1] = LOBOT_SERVO_FRAME_HEADER; buf[2] = Num * 3 + 5; buf[3] = 0x03; buf[4] = Num; buf[5] = GET_LOW_char(Time); buf[6] = GET_HIGH_char(Time); uint8_t index = 7; for (uint8_t i = 0; i < Num; i++) { uint16_t tmp = va_arg(arg_ptr, uint16_t); buf[index++] = GET_LOW_char(tmp); uint16_t pos = va_arg(arg_ptr, uint16_t); buf[index++] = GET_LOW_char(pos); buf[index++] = GET_HIGH_char(pos); } va_end(arg_ptr); serial.write(buf, buf[2] + 2); wait_ms(Time); }