@@ -29,13 +29,16 @@ extern "C" {
2929// make one instance for the user to use
3030FirmataClass Firmata;
3131
32- void printVersion (void ) {
33- Firmata.printVersion ();
34- }
35-
36- void printFirmwareVersion (void ) {
37- Firmata.printFirmwareVersion ();
38- }
32+ /* callback functions */
33+ callbackFunction FirmataClass::currentAnalogCallback = (callbackFunction)NULL ;
34+ callbackFunction FirmataClass::currentDigitalCallback = (callbackFunction)NULL ;
35+ callbackFunction FirmataClass::currentPinModeCallback = (callbackFunction)NULL ;
36+ callbackFunction FirmataClass::currentPinValueCallback = (callbackFunction)NULL ;
37+ callbackFunction FirmataClass::currentReportAnalogCallback = (callbackFunction)NULL ;
38+ callbackFunction FirmataClass::currentReportDigitalCallback = (callbackFunction)NULL ;
39+ stringCallbackFunction FirmataClass::currentStringCallback = (stringCallbackFunction)NULL ;
40+ sysexCallbackFunction FirmataClass::currentSysexCallback = (sysexCallbackFunction)NULL ;
41+ systemCallbackFunction FirmataClass::currentSystemResetCallback = (systemCallbackFunction)NULL ;
3942
4043// ******************************************************************************
4144// * Support Functions
@@ -81,8 +84,19 @@ FirmataClass::FirmataClass()
8184 firmwareVersionCount = 0 ;
8285 firmwareVersionVector = 0 ;
8386 blinkVersionDisabled = false ;
84- parser.attach (REPORT_FIRMWARE, ::printFirmwareVersion);
85- parser.attach (REPORT_VERSION, ::printVersion);
87+
88+ // Establish callback translation to parser callbacks
89+ parser.attach (ANALOG_MESSAGE, (FirmataParser::callbackFunction)staticAnalogCallback, (void *)NULL );
90+ parser.attach (DIGITAL_MESSAGE, (FirmataParser::callbackFunction)staticDigitalCallback, (void *)NULL );
91+ parser.attach (REPORT_ANALOG, (FirmataParser::callbackFunction)staticReportAnalogCallback, (void *)NULL );
92+ parser.attach (REPORT_DIGITAL, (FirmataParser::callbackFunction)staticReportDigitalCallback, (void *)NULL );
93+ parser.attach (SET_PIN_MODE, (FirmataParser::callbackFunction)staticPinModeCallback, (void *)NULL );
94+ parser.attach (SET_DIGITAL_PIN_VALUE, (FirmataParser::callbackFunction)staticPinValueCallback, (void *)NULL );
95+ parser.attach (STRING_DATA, (FirmataParser::stringCallbackFunction)staticStringCallback, (void *)NULL );
96+ parser.attach (START_SYSEX, (FirmataParser::sysexCallbackFunction)staticSysexCallback, (void *)NULL );
97+ parser.attach (REPORT_FIRMWARE, (FirmataParser::systemCallbackFunction)staticReportFirmwareCallback, this );
98+ parser.attach (REPORT_VERSION, (FirmataParser::systemCallbackFunction)staticReportVersionCallback, this );
99+ parser.attach (SYSTEM_RESET, (FirmataParser::systemCallbackFunction)staticSystemResetCallback, (void *)NULL );
86100}
87101
88102// ******************************************************************************
@@ -296,6 +310,8 @@ void FirmataClass::sendAnalog(byte pin, int value)
296310 */
297311void FirmataClass::sendDigital (byte pin, int value)
298312{
313+ (void )pin;
314+ (void )value;
299315 /* TODO add single pin digital messages to the protocol, this needs to
300316 * track the last digital data sent so that it can be sure to change just
301317 * one bit in the packet. This is complicated by the fact that the
@@ -376,9 +392,28 @@ void FirmataClass::write(byte c)
376392 * @param command The ID of the command to attach a callback function to.
377393 * @param newFunction A reference to the callback function to attach.
378394 */
379- void FirmataClass::attach (uint8_t command, callbackFunction newFunction)
380- {
381- parser.attach (command, (callbackFunction)newFunction);
395+ void FirmataClass::attach (uint8_t command, ::callbackFunction newFunction)
396+ {
397+ switch (command) {
398+ case ANALOG_MESSAGE:
399+ currentAnalogCallback = newFunction;
400+ break ;
401+ case DIGITAL_MESSAGE:
402+ currentDigitalCallback = newFunction;
403+ break ;
404+ case REPORT_ANALOG:
405+ currentReportAnalogCallback = newFunction;
406+ break ;
407+ case REPORT_DIGITAL:
408+ currentReportDigitalCallback = newFunction;
409+ break ;
410+ case SET_PIN_MODE:
411+ currentPinModeCallback = newFunction;
412+ break ;
413+ case SET_DIGITAL_PIN_VALUE:
414+ currentPinValueCallback = newFunction;
415+ break ;
416+ }
382417}
383418
384419/* *
@@ -388,7 +423,11 @@ void FirmataClass::attach(uint8_t command, callbackFunction newFunction)
388423 */
389424void FirmataClass::attach (uint8_t command, systemCallbackFunction newFunction)
390425{
391- parser.attach (command, (systemCallbackFunction)newFunction);
426+ switch (command) {
427+ case SYSTEM_RESET:
428+ currentSystemResetCallback = newFunction;
429+ break ;
430+ }
392431}
393432
394433/* *
@@ -398,7 +437,11 @@ void FirmataClass::attach(uint8_t command, systemCallbackFunction newFunction)
398437 */
399438void FirmataClass::attach (uint8_t command, stringCallbackFunction newFunction)
400439{
401- parser.attach (command, (stringCallbackFunction)newFunction);
440+ switch (command) {
441+ case STRING_DATA:
442+ currentStringCallback = newFunction;
443+ break ;
444+ }
402445}
403446
404447/* *
@@ -408,7 +451,8 @@ void FirmataClass::attach(uint8_t command, stringCallbackFunction newFunction)
408451 */
409452void FirmataClass::attach (uint8_t command, sysexCallbackFunction newFunction)
410453{
411- parser.attach (command, (sysexCallbackFunction)newFunction);
454+ (void )command;
455+ currentSysexCallback = newFunction;
412456}
413457
414458/* *
@@ -418,7 +462,20 @@ void FirmataClass::attach(uint8_t command, sysexCallbackFunction newFunction)
418462 */
419463void FirmataClass::detach (uint8_t command)
420464{
421- parser.detach (command);
465+ switch (command) {
466+ case SYSTEM_RESET:
467+ attach (command, (systemCallbackFunction)NULL );
468+ break ;
469+ case STRING_DATA:
470+ attach (command, (stringCallbackFunction)NULL );
471+ break ;
472+ case START_SYSEX:
473+ attach (command, (sysexCallbackFunction)NULL );
474+ break ;
475+ default :
476+ attach (command, (callbackFunction)NULL );
477+ break ;
478+ }
422479}
423480
424481/* *
0 commit comments