@@ -29,13 +29,16 @@ extern "C" {
29
29
// make one instance for the user to use
30
30
FirmataClass Firmata;
31
31
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 ;
39
42
40
43
// ******************************************************************************
41
44
// * Support Functions
@@ -81,8 +84,19 @@ FirmataClass::FirmataClass()
81
84
firmwareVersionCount = 0 ;
82
85
firmwareVersionVector = 0 ;
83
86
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 );
86
100
}
87
101
88
102
// ******************************************************************************
@@ -296,6 +310,8 @@ void FirmataClass::sendAnalog(byte pin, int value)
296
310
*/
297
311
void FirmataClass::sendDigital (byte pin, int value)
298
312
{
313
+ (void )pin;
314
+ (void )value;
299
315
/* TODO add single pin digital messages to the protocol, this needs to
300
316
* track the last digital data sent so that it can be sure to change just
301
317
* one bit in the packet. This is complicated by the fact that the
@@ -376,9 +392,28 @@ void FirmataClass::write(byte c)
376
392
* @param command The ID of the command to attach a callback function to.
377
393
* @param newFunction A reference to the callback function to attach.
378
394
*/
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
+ }
382
417
}
383
418
384
419
/* *
@@ -388,7 +423,11 @@ void FirmataClass::attach(uint8_t command, callbackFunction newFunction)
388
423
*/
389
424
void FirmataClass::attach (uint8_t command, systemCallbackFunction newFunction)
390
425
{
391
- parser.attach (command, (systemCallbackFunction)newFunction);
426
+ switch (command) {
427
+ case SYSTEM_RESET:
428
+ currentSystemResetCallback = newFunction;
429
+ break ;
430
+ }
392
431
}
393
432
394
433
/* *
@@ -398,7 +437,11 @@ void FirmataClass::attach(uint8_t command, systemCallbackFunction newFunction)
398
437
*/
399
438
void FirmataClass::attach (uint8_t command, stringCallbackFunction newFunction)
400
439
{
401
- parser.attach (command, (stringCallbackFunction)newFunction);
440
+ switch (command) {
441
+ case STRING_DATA:
442
+ currentStringCallback = newFunction;
443
+ break ;
444
+ }
402
445
}
403
446
404
447
/* *
@@ -408,7 +451,8 @@ void FirmataClass::attach(uint8_t command, stringCallbackFunction newFunction)
408
451
*/
409
452
void FirmataClass::attach (uint8_t command, sysexCallbackFunction newFunction)
410
453
{
411
- parser.attach (command, (sysexCallbackFunction)newFunction);
454
+ (void )command;
455
+ currentSysexCallback = newFunction;
412
456
}
413
457
414
458
/* *
@@ -418,7 +462,20 @@ void FirmataClass::attach(uint8_t command, sysexCallbackFunction newFunction)
418
462
*/
419
463
void FirmataClass::detach (uint8_t command)
420
464
{
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
+ }
422
479
}
423
480
424
481
/* *
0 commit comments