35 #include <boost/timer.hpp>
36 #include <boost/signals2/signal.hpp>
37 #include <boost/bind.hpp>
38 #include "ofSerialWin.h"
39 #include "ofSerialLinux.h"
47 #define FIRMATA_MAJOR_VERSION 2
48 #define FIRMATA_MINOR_VERSION 0
49 #define FIRMATA_MAX_DATA_BYTES 32
51 #define FIRMATA_DIGITAL_MESSAGE 0x90
52 #define FIRMATA_ANALOG_MESSAGE 0xE0
53 #define FIRMATA_REPORT_ANALOG 0xC0
54 #define FIRMATA_REPORT_DIGITAL 0xD0
56 #define FIRMATA_SET_PIN_MODE 0xF4
58 #define FIRMATA_REPORT_VERSION 0xF9
59 #define FIRMATA_SYSTEM_RESET 0xFF
61 #define FIRMATA_START_SYSEX 0xF0
62 #define FIRMATA_END_SYSEX 0xF7
64 #define FIRMATA_INPUT 0x00
65 #define FIRMATA_OUTPUT 0x01
66 #define FIRMATA_ANALOG 0x02
67 #define FIRMATA_PWM 0x03
68 #define FIRMATA_SERVO 0x04
71 #define FIRMATA_INPUT_PULLUP 0x07
72 #define TOTAL_PIN_MODES 8
75 #define FIRMATA_SYSEX_SERVO_CONFIG 0x70
76 #define FIRMATA_SYSEX_FIRMATA_STRING 0x71
77 #define SHIFT_DATA 0x75
78 #define I2C_REQUEST 0x76
79 #define I2C_REPLY 0x77
80 #define I2C_CONFIG 0x78
81 #define EXTENDED_ANALOG 0x6F
82 #define PIN_STATE_QUERY 0x6D
83 #define PIN_STATE_RESPONSE 0x6E
84 #define CAPABILITY_QUERY 0x6B
85 #define CAPABILITY_RESPONSE 0x6C
86 #define ANALOG_MAPPING_QUERY 0x69
87 #define ANALOG_MAPPING_RESPONSE 0x6A
88 #define FIRMATA_SYSEX_REPORT_FIRMWARE 0x79
89 #define SAMPLING_INTERVAL 0x7A
90 #define FIRMATA_SYSEX_NON_REALTIME 0x7E
91 #define FIRMATA_SYSEX_REALTIME 0x7F
93 #define MAX_DYNAMIXEL_SERVOS 50
94 #define DYNAMIXEL_KEY_DATA_LENGTH 6*2+1
95 #define DYNAMIXEL_ALL_DATA_LENGTH 10*2+1
96 #define DYNAMIXEL_GET_REGISTER_LENGTH 5*2+1
97 #define COMMANDER_DATA_LENGTH 6*2+1
99 #define SYSEX_DYNAMIXEL_KEY_SERVO_DATA 0x68
100 #define SYSEX_DYNAMIXEL_ALL_SERVO_DATA 0x67
101 #define SYSEX_DYNAMIXEL_CONFIG 0x66
102 #define SYSEX_DYNAMIXEL_SYNCH_MOVE_START 0x65
103 #define SYSEX_DYNAMIXEL_SYNCH_MOVE_ADD 0x64
104 #define SYSEX_DYNAMIXEL_SYNCH_MOVE_EXECUTE 0x63
105 #define SYSEX_DYNAMIXEL_MOVE 0x62
106 #define SYSEX_DYNAMIXEL_STOP 0x61
107 #define SYSEX_DYNAMIXEL_TRANSMIT_ERROR 0x60
108 #define SYSEX_DYNAMIXEL_SET_REGISTER 0x59
109 #define SYSEX_DYNAMIXEL_GET_REGISTER 0x58
110 #define SYSEX_DYNAMIXEL_CONFIGURE_SERVO 0x57
111 #define SYSEX_DYNAMIXEL_STOPPED 0x56
112 #define SYSEX_COMMANDER_DATA 0x55
117 #define ARD_TOTAL_DIGITAL_PINS 22
118 #define ARD_TOTAL_ANALOG_PINS 6
119 #define ARD_TOTAL_PORTS 3
121 #define ARD_INPUT 0x00
122 #define ARD_OUTPUT 0x01
123 #define ARD_ANALOG 0x02
125 #define ARD_SERVO 0x04
126 #define ARD_INPUT_PULLUP 0x07
157 #define SYSEX_SERVO_ATTACH 0x00
158 #define SYSEX_SERVO_DETACH 0x01
159 #define SYSEX_SERVO_WRITE 0x02
161 #define OF_ARDUINO_DELAY_LENGTH 10.0
163 #define FIRMWARE2_2 22
164 #define FIRMWARE2_3 23
178 unsigned int _goalPosition;
179 unsigned int _actualPosition;
180 unsigned int _goalSpeed;
181 unsigned int _actualSpeed;
183 unsigned char _temperature;
184 unsigned char _voltage;
187 unsigned char _alarm;
214 unsigned char _buttons;
239 virtual bool connect(std::string device,
int baud = 57600);
242 virtual void disconnect();
245 virtual bool isArduinoReady();
247 virtual void setUseDelay(
bool bDelay);
249 virtual void update();
252 virtual bool isInitialized();
255 virtual void setDigitalHistoryLength(
int length);
256 virtual void setAnalogHistoryLength(
int length);
257 virtual void setStringHistoryLength(
int length);
258 virtual void setSysExHistoryLength(
int nSysEx);
262 virtual void sendDigitalPinMode(
int pin,
int mode);
268 virtual void sendAnalogPinReporting(
int pin,
int mode);
273 virtual void sendDigital(
int pin,
int value,
bool force =
false);
279 virtual void sendPwm(
int pin,
int value,
bool force =
false);
285 virtual void sendSysEx(
int command, std::vector<unsigned char> data);
287 virtual void sendString(std::string str);
290 virtual void sendProtocolVersionRequest();
292 virtual void sendFirmwareVersionRequest();
294 virtual void sendReset();
298 virtual void sendSysExBegin();
301 virtual void sendSysExEnd();
304 virtual void sendByte(
unsigned char value);
308 virtual void sendValueAsTwo7bitBytes(
int value);
314 virtual int getPwm(
int pin);
320 virtual int getDigital(
int pin);
325 virtual int getAnalog(
int pin);
329 virtual std::vector<unsigned char> getSysEx();
332 virtual std::string getString();
335 virtual int getMajorProtocolVersion();
338 virtual int getMinorProtocolVersion();
341 virtual int getMajorFirmwareVersion();
344 virtual int getMinorFirmwareVersion();
347 virtual std::string getFirmwareName();
350 virtual std::list<int>* getDigitalHistory(
int pin);
355 virtual std::list<int>* getAnalogHistory(
int pin);
359 virtual std::list<std::vector<unsigned char> >* getSysExHistory();
362 virtual std::list<std::string>* getStringHistory();
365 virtual int makeWord(
unsigned char low,
unsigned char high);
368 virtual unsigned char getLowByte(
int val);
371 virtual unsigned char getHighByte(
int val);
378 int getDigitalPinMode(
int pin);
381 int getAnalogPinReporting(
int pin);
384 int getValueFromTwo7bitBytes(
unsigned char lsb,
unsigned char msb);
387 unsigned int getByteFromDataIterator(std::vector<unsigned char>::iterator &it, std::vector<unsigned char>::iterator &end);
390 unsigned int GetWordFromDataIterator(std::vector<unsigned char>::iterator &it, std::vector<unsigned char>::iterator &end);
395 boost::signals2::signal<void (
const int)> EDigitalPinChanged;
398 boost::signals2::signal<void (
const int)> EAnalogPinChanged;
401 boost::signals2::signal<void (
const std::vector<unsigned char>)> ESysExReceived;
404 boost::signals2::signal<void (
const int)> EProtocolVersionReceived;
407 boost::signals2::signal<void (
const int)> EFirmwareVersionReceived;
410 boost::signals2::signal<void (
const int)> EInitialized;
414 boost::signals2::signal<void (
const std::string)> EStringReceived;
417 boost::signals2::signal<void (
const int)> EDynamixelAllReceived;
420 boost::signals2::signal<void (
const int)> EDynamixelKeyReceived;
423 boost::signals2::signal<void (
const int,
const int)> EDynamixelTransmitError;
426 boost::signals2::signal<void (
const unsigned char,
const unsigned char,
const unsigned int)> EDynamixelGetRegister;
429 boost::signals2::signal<void (
const int)> EDynamixelStopped;
432 boost::signals2::signal<void (
const int)> ECommanderDataReceived;
436 virtual void sendServo(
int pin,
int value,
bool force=
false);
441 virtual void sendServoAttach(
int pin,
int minPulse=544,
int maxPulse=2400,
int angle=180);
446 virtual void sendServoDetach(
int pin);
450 virtual int getServo(
int pin);
454 virtual void sendDynamixelServoAttach(
unsigned char servo);
457 virtual void sendDynamixelServoDetach(
unsigned char servo);
460 virtual void sendDynamixelSynchMoveStart();
465 virtual void sendDynamixelSynchMoveAdd(
unsigned char servo,
int pos,
int speed);
468 virtual void sendDynamixelSynchMoveExecute();
471 virtual void sendDynamixelMove(
unsigned char servo,
int pos,
int speed);
476 virtual void sendDynamixelStop(
unsigned char servo);
479 virtual void sendDynamixelSetRegister(
unsigned char servo,
unsigned char reg,
unsigned char length,
unsigned int value);
482 virtual void sendDynamixelGetRegister(
unsigned char servo,
unsigned char reg,
unsigned char length);
485 virtual void sendDynamixelConfigureServo(
unsigned char servo,
unsigned int cwlimit,
unsigned int ccwlimit,
486 unsigned int maxtorque,
unsigned char delaytime,
487 unsigned char cwcomplmargin,
unsigned char ccwcomplmargin,
488 unsigned char cwcomplslope,
unsigned char ccwcomplslope);
491 virtual void sendDynamixelStopped(
unsigned char servo);
493 virtual bool waitForSysExMessage(
unsigned char cmd,
unsigned int timeout_sec = 1);
499 int _totalDigitalPins;
501 virtual void sendDigitalPinReporting(
int pin,
int mode);
505 virtual void sendDigitalPortReporting(
int port,
int mode);
512 virtual void processData(
unsigned char inputData);
513 virtual void processDigitalPort(
int port,
unsigned char value);
514 virtual void processSysExData(std::vector<unsigned char> data);
516 virtual void checkIncomingSysExMessage(
unsigned char cmd);
522 int _analogHistoryLength;
523 int _digitalHistoryLength;
524 int _stringHistoryLength;
525 int _sysExHistoryLength;
529 int _executeMultiByteCommand;
530 int _multiByteChannel;
533 unsigned char _storedInputData[FIRMATA_MAX_DATA_BYTES];
534 std::vector<unsigned char> _sysExData;
535 int _majorProtocolVersion;
536 int _minorProtocolVersion;
537 int _majorFirmwareVersion;
538 int _minorFirmwareVersion;
539 std::string _firmwareName;
540 bool _firmwareReceived;
543 int _firmwareVersionSum;
545 std::list<std::vector<unsigned char> > _sysExHistory;
548 std::list<std::string> _stringHistory;
551 std::list<int> _analogHistory[ARD_TOTAL_ANALOG_PINS];
554 std::list<int> _digitalHistory[ARD_TOTAL_DIGITAL_PINS];
557 int _digitalPinMode[ARD_TOTAL_DIGITAL_PINS];
560 int _digitalPinValue[ARD_TOTAL_DIGITAL_PINS];
563 int _digitalPortValue[ARD_TOTAL_PORTS];
566 int _digitalPortReporting[ARD_TOTAL_PORTS];
569 int _digitalPinReporting[ARD_TOTAL_DIGITAL_PINS];
572 int _analogPinReporting[ARD_TOTAL_ANALOG_PINS];
579 int _servoValue[ARD_TOTAL_DIGITAL_PINS];
585 int _dynamixelMoveAdds;
588 int _waitingForSysExMessage;
591 bool _sysExMessageFound;
Definition: ofArduino.h:230
Definition: ofArduino.h:207
This class extend ofStandardFirmata and provides additional functionality like servo support through ...
Definition: ofArduino.h:173
Definition: ofSerial.h:27