/* * SMS_STS.cpp * FIT SMS_STS series serial servo application layer program */ #include "SMS_STS.h" SMS_STS::SMS_STS() { End = 0; } SMS_STS::SMS_STS(u8 End):SCSerial(End) { } SMS_STS::SMS_STS(u8 End, u8 Level):SCSerial(End, Level) { } int SMS_STS::WritePosEx(u8 ID, s16 Position, u16 Speed, u8 ACC) { if(Position<0){ Position = -Position; Position |= (1<<15); } u8 bBuf[7]; bBuf[0] = ACC; Host2SCS(bBuf+1, bBuf+2, Position); Host2SCS(bBuf+3, bBuf+4, 0); Host2SCS(bBuf+5, bBuf+6, Speed); return genWrite(ID, SMS_STS_ACC, bBuf, 7); } int SMS_STS::RegWritePosEx(u8 ID, s16 Position, u16 Speed, u8 ACC) { if(Position<0){ Position = -Position; Position |= (1<<15); } u8 bBuf[7]; bBuf[0] = ACC; Host2SCS(bBuf+1, bBuf+2, Position); Host2SCS(bBuf+3, bBuf+4, 0); Host2SCS(bBuf+5, bBuf+6, Speed); return regWrite(ID, SMS_STS_ACC, bBuf, 7); } void SMS_STS::SyncWritePosEx(u8 ID[], u8 IDN, s16 Position[], u16 Speed[], u8 ACC[]) { u8 offbuf[7*IDN]; for(u8 i = 0; i<IDN; i++){ if(Position[i]<0){ Position[i] = -Position[i]; Position[i] |= (1<<15); } u16 V; if(Speed){ V = Speed[i]; }else{ V = 0; } if(ACC){ offbuf[i*7] = ACC[i]; }else{ offbuf[i*7] = 0; } Host2SCS(offbuf+i*7+1, offbuf+i*7+2, Position[i]); Host2SCS(offbuf+i*7+3, offbuf+i*7+4, 0); Host2SCS(offbuf+i*7+5, offbuf+i*7+6, V); } syncWrite(ID, IDN, SMS_STS_ACC, offbuf, 7); } int SMS_STS::WheelMode(u8 ID) { return writeByte(ID, SMS_STS_MODE, 1); } int SMS_STS::WriteSpe(u8 ID, s16 Speed, u8 ACC) { if(Speed<0){ Speed = -Speed; Speed |= (1<<15); } u8 bBuf[2]; bBuf[0] = ACC; genWrite(ID, SMS_STS_ACC, bBuf, 1); Host2SCS(bBuf+0, bBuf+1, Speed); return genWrite(ID, SMS_STS_GOAL_SPEED_L, bBuf, 2); } int SMS_STS::EnableTorque(u8 ID, u8 Enable) { return writeByte(ID, SMS_STS_TORQUE_ENABLE, Enable); } int SMS_STS::unLockEprom(u8 ID) { return writeByte(ID, SMS_STS_LOCK, 0); } int SMS_STS::LockEprom(u8 ID) { return writeByte(ID, SMS_STS_LOCK, 1); } int SMS_STS::CalibrationOfs(u8 ID) { return writeByte(ID, SMS_STS_TORQUE_ENABLE, 128); } int SMS_STS::FeedBack(int ID) { int nLen = Read(ID, SMS_STS_PRESENT_POSITION_L, Mem, sizeof(Mem)); if(nLen!=sizeof(Mem)){ Err = 1; return -1; } Err = 0; return nLen; } int SMS_STS::ReadPos(int ID) { int Pos = -1; if(ID==-1){ Pos = Mem[SMS_STS_PRESENT_POSITION_H-SMS_STS_PRESENT_POSITION_L]; Pos <<= 8; Pos |= Mem[SMS_STS_PRESENT_POSITION_L-SMS_STS_PRESENT_POSITION_L]; }else{ Err = 0; Pos = readWord(ID, SMS_STS_PRESENT_POSITION_L); if(Pos==-1){ Err = 1; } } if(!Err && (Pos&(1<<15))){ Pos = -(Pos&~(1<<15)); } return Pos; } int SMS_STS::ReadSpeed(int ID) { int Speed = -1; if(ID==-1){ Speed = Mem[SMS_STS_PRESENT_SPEED_H-SMS_STS_PRESENT_POSITION_L]; Speed <<= 8; Speed |= Mem[SMS_STS_PRESENT_SPEED_L-SMS_STS_PRESENT_POSITION_L]; }else{ Err = 0; Speed = readWord(ID, SMS_STS_PRESENT_SPEED_L); if(Speed==-1){ Err = 1; return -1; } } if(!Err && (Speed&(1<<15))){ Speed = -(Speed&~(1<<15)); } return Speed; } int SMS_STS::ReadLoad(int ID) { int Load = -1; if(ID==-1){ Load = Mem[SMS_STS_PRESENT_LOAD_H-SMS_STS_PRESENT_POSITION_L]; Load <<= 8; Load |= Mem[SMS_STS_PRESENT_LOAD_L-SMS_STS_PRESENT_POSITION_L]; }else{ Err = 0; Load = readWord(ID, SMS_STS_PRESENT_LOAD_L); if(Load==-1){ Err = 1; } } if(!Err && (Load&(1<<10))){ Load = -(Load&~(1<<10)); } return Load; } int SMS_STS::ReadVoltage(int ID) { int Voltage = -1; if(ID==-1){ Voltage = Mem[SMS_STS_PRESENT_VOLTAGE-SMS_STS_PRESENT_POSITION_L]; }else{ Err = 0; Voltage = readByte(ID, SMS_STS_PRESENT_VOLTAGE); if(Voltage==-1){ Err = 1; } } return Voltage; } int SMS_STS::ReadTemper(int ID) { int Temper = -1; if(ID==-1){ Temper = Mem[SMS_STS_PRESENT_TEMPERATURE-SMS_STS_PRESENT_POSITION_L]; }else{ Err = 0; Temper = readByte(ID, SMS_STS_PRESENT_TEMPERATURE); if(Temper==-1){ Err = 1; } } return Temper; } int SMS_STS::ReadMove(int ID) { int Move = -1; if(ID==-1){ Move = Mem[SMS_STS_MOVING-SMS_STS_PRESENT_POSITION_L]; }else{ Err = 0; Move = readByte(ID, SMS_STS_MOVING); if(Move==-1){ Err = 1; } } return Move; } int SMS_STS::ReadMode(int ID) { int Mode = -1; if(ID==-1){ Mode = Mem[SMS_STS_MODE-SMS_STS_PRESENT_POSITION_L]; }else{ Err = 0; Mode = readByte(ID, SMS_STS_MODE); if(Mode==-1){ Err = 1; } } return Mode; } int SMS_STS::ReadCurrent(int ID) { int Current = -1; if(ID==-1){ Current = Mem[SMS_STS_PRESENT_CURRENT_H-SMS_STS_PRESENT_POSITION_L]; Current <<= 8; Current |= Mem[SMS_STS_PRESENT_CURRENT_L-SMS_STS_PRESENT_POSITION_L]; }else{ Err = 0; Current = readWord(ID, SMS_STS_PRESENT_CURRENT_L); if(Current==-1){ Err = 1; return -1; } } if(!Err && (Current&(1<<15))){ Current = -(Current&~(1<<15)); } return Current; }