#include "macs.h" #include #include // timeval->tv_sec #include "timer.h" #include "network.h" Macs::Macs(BYTE_t nodeid, ostream &out=cout) : NodeDrv(nodeid, out), fMacId(2*nodeid+1), fPos(0), fPosTime(0.0), fPdoPos(0), fPdoTime(0.0), fPosActive(0), fRpmActive(0), fError(FALSE) { } Macs::~Macs() { } void Macs::HandleSDO(WORD_t idx, BYTE_t subidx, LWORD_t val, struct timeval *tv) { switch (idx) { case 0x100a: lout << "- Mac using Software Version V" << dec << (int)(val>>16) << "." << (int)(val&0xff) << endl; return; case 0x2002: cout << "Actual velocity: " << dec << val << endl; fVel = val; return; case 0x6004: if (subidx) return; // lout << "Actual Position: " << dec << (signed long)val << endl; fPos = (LWORDS_t)val; fPosTime.SetTimer(tv); return; /* case 0x2001: cout << "Axe Status: 0x" << hex << val << endl; cout << " - Motor " << (val&0x01?"standing":"moving") << endl; cout << " - Positioning " << (val&0x02?"active":"inactive") << endl; cout << " - Rotary mode " << (val&0x04?"active":"inactive") << endl; cout << " - Attitude control: " << (val&0x40?"off":"on") << endl; cout << " - Axe resetted: " << (val&0x80?"yes":"no") << endl; fPosActive = val&0x02; fRpmActive = val&0x04; return; case 0x2003: if (!subidx) { cout << "Input State: "; for (int i=0; i<8; i++) cout << (int)(val&(1<>8)&0xff) << endl; cout << " - Attitude control: " << (val&0x04?"off":"on") << endl; cout << " - Startswitch active: " << (val&0x20?"yes":"no") << endl; cout << " - Referenceswitch active: " << (val&0x40?"yes":"no") << endl; cout << " - Endswitch active: " << (val&0x80?"yes":"no") << endl; return; */ case 0x6002: lout << "- Velocity resolution #" << (int)GetId() << ": " << dec << val << " ticks/min" << endl; fVelRes = val; return; } cout << "Macs: SDO, idx=0x"<< hex << idx << "/" << (int)subidx; cout << ", val=0x"<SendCanFrame(fMacId, 0, 0, data[0], data[1], data[2], data[3], data[4], data[5]); } void Macs::SendMsg(BYTE_t d0=0, BYTE_t d1=0, BYTE_t d2=0, BYTE_t d3=0, BYTE_t d4=0, BYTE_t d5=0) { GetNetwork()->SendCanFrame(fMacId, 0, 0, d0, d1, d2, d3, d4, d5); } void Macs::HandlePDO1(BYTE_t *data, struct timeval *tv) { fPdoPos = (data[4]<<24) | (data[5]<<16) | (data[6]<<8) | data[7]; fPosActive = data[3]&0x02; fRpmActive = data[3]&0x04; fPdoTime.SetTimer(tv); } void Macs::HandlePDO2(BYTE_t *data, struct timeval *tv) { LWORDS_t errnum = (data[0]<<24) | (data[1]<<16) | (data[2]<<8) | data[3]; LWORDS_t errinf = (data[4]<<24) | (data[5]<<16) | (data[6]<<8) | data[7]; if (!errnum) { cout << "Mac #" << (int)GetId() << " reports Error occursion." << endl; fError = TRUE; return; } cout << "Mac #" << (int)GetId() << " reports: "; switch (errnum) { case 6: cout << "Home position not the first positioning command." << endl; return; case 8: cout << "Control deviation overflow." << endl; return; case 9: cout << "Zero index not found." << endl; return; case 25: switch (errinf) { case 1: cout << "Positive"; break; case 2: cout << "Negative"; break; default: cout << "-unknown-"; } cout << " endswitch activated." << endl; fError = FALSE; return; case 84: cout << "Too many (>12) ON TIME calls." << endl; return; default: cout << "Error Nr. " << errnum << ", " << errinf << endl; } } double Macs::GetTime() { return fPosTime.GetTime(); } double Macs::GetMjd() { return fPosTime.GetMjd(); } double Macs::GetPdoTime() { return fPdoTime.GetTime(); } double Macs::GetPdoMjd() { return fPdoTime.GetMjd(); }