@@ -448,6 +448,19 @@ protected override void Initialize()
448
448
449
449
_firmata . EnableDigitalReporting ( ) ;
450
450
451
+ string ? result = _firmata . CheckSystemVariablesSupported ( ) ;
452
+ if ( result != null )
453
+ {
454
+ Logger . LogInformation ( $ "System variable support not available in firmware. Error: { result } ") ;
455
+ }
456
+ else
457
+ {
458
+ Logger . LogInformation ( "System variable support detected" ) ;
459
+ GetSystemVariable ( SystemVariable . MaxSysexSize , - 1 , out int bufferSize ) ;
460
+ // Should be excluding the SYSEX byte itself and the terminator, but see https://github.com/firmata/ConfigurableFirmata/issues/136
461
+ Logger . LogInformation ( $ "Maximum SYSEX message size: { bufferSize } ") ;
462
+ }
463
+
451
464
foreach ( ExtendedCommandHandler e in _extendedCommandHandlers )
452
465
{
453
466
e . Registered ( _firmata , this ) ;
@@ -458,41 +471,91 @@ protected override void Initialize()
458
471
}
459
472
}
460
473
474
+ /// <summary>
475
+ /// Queries the given system variable.
476
+ /// </summary>
477
+ /// <param name="variableId">The variable to query</param>
478
+ /// <param name="value">Receives the value</param>
479
+ /// <returns>True on success, false otherwise (value not supported, etc. Check the log output)</returns>
480
+ /// <exception cref="IOException">There was an error sending the command</exception>
481
+ public bool GetSystemVariable ( SystemVariable variableId , out int value )
482
+ {
483
+ value = 0 ;
484
+ return Firmata . GetOrSetSystemVariable ( variableId , - 1 , true , ref value ) ;
485
+ }
486
+
487
+ /// <summary>
488
+ /// Queries the given system variable.
489
+ /// </summary>
490
+ /// <param name="variableId">The variable to query</param>
491
+ /// <param name="pinNumber">The pin number to use (-1 if not applicable for the given parameter)</param>
492
+ /// <param name="value">Receives the value</param>
493
+ /// <returns>True on success, false otherwise (value not supported, etc. Check the log output)</returns>
494
+ /// <exception cref="IOException">There was an error sending the command</exception>
495
+ public bool GetSystemVariable ( SystemVariable variableId , int pinNumber , out int value )
496
+ {
497
+ value = 0 ;
498
+ return Firmata . GetOrSetSystemVariable ( variableId , pinNumber , true , ref value ) ;
499
+ }
500
+
501
+ /// <summary>
502
+ /// Update the given system variable.
503
+ /// </summary>
504
+ /// <param name="variableId">The variable to update</param>
505
+ /// <param name="value">The new value</param>
506
+ /// <returns>True on success, false otherwise (check the log output)</returns>
507
+ /// <exception cref="IOException">There was a communication error</exception>
508
+ public bool SetSystemVariable ( SystemVariable variableId , int value )
509
+ {
510
+ return Firmata . GetOrSetSystemVariable ( variableId , - 1 , false , ref value ) ;
511
+ }
512
+
513
+ /// <summary>
514
+ /// Update the given system variable.
515
+ /// </summary>
516
+ /// <param name="variableId">The variable to update</param>
517
+ /// <param name="pinNumber">The pin number to use, or -1 if not relevant</param>
518
+ /// <param name="value">The new value</param>
519
+ /// <returns>True on success, false otherwise (check the log output)</returns>
520
+ /// <exception cref="IOException">There was a communication error</exception>
521
+ public bool SetSystemVariable ( SystemVariable variableId , int pinNumber , int value )
522
+ {
523
+ return Firmata . GetOrSetSystemVariable ( variableId , pinNumber , false , ref value ) ;
524
+ }
525
+
461
526
private void RegisterCommandHandlers ( )
462
527
{
463
- lock ( _commandHandlersLock )
464
- {
465
- _extendedCommandHandlers . Add ( new DhtSensor ( ) ) ;
466
- _extendedCommandHandlers . Add ( new FrequencySensor ( ) ) ;
467
- }
528
+ _commandHandlersLock . EnterWriteLock ( ) ;
529
+ _extendedCommandHandlers . Add ( new DhtSensor ( ) ) ;
530
+ _extendedCommandHandlers . Add ( new FrequencySensor ( ) ) ;
531
+ _commandHandlersLock . ExitWriteLock ( ) ;
468
532
}
469
533
470
534
/// <summary>
471
535
/// Registers the known supported modes. Should only be called once from Initialize.
472
536
/// </summary>
473
537
private void RegisterKnownSupportedModes ( )
474
538
{
475
- lock ( _commandHandlersLock )
476
- {
477
- // We add all known modes to the list, even though we don't really support them all in the core
478
- _knownSupportedModes . Add ( SupportedMode . DigitalInput ) ;
479
- _knownSupportedModes . Add ( SupportedMode . DigitalOutput ) ;
480
- _knownSupportedModes . Add ( SupportedMode . AnalogInput ) ;
481
- _knownSupportedModes . Add ( SupportedMode . Pwm ) ;
482
- _knownSupportedModes . Add ( SupportedMode . Servo ) ;
483
- _knownSupportedModes . Add ( SupportedMode . Shift ) ;
484
- _knownSupportedModes . Add ( SupportedMode . I2c ) ;
485
- _knownSupportedModes . Add ( SupportedMode . OneWire ) ;
486
- _knownSupportedModes . Add ( SupportedMode . Stepper ) ;
487
- _knownSupportedModes . Add ( SupportedMode . Encoder ) ;
488
- _knownSupportedModes . Add ( SupportedMode . Serial ) ;
489
- _knownSupportedModes . Add ( SupportedMode . InputPullup ) ;
490
- _knownSupportedModes . Add ( SupportedMode . Spi ) ;
491
- _knownSupportedModes . Add ( SupportedMode . Sonar ) ;
492
- _knownSupportedModes . Add ( SupportedMode . Tone ) ;
493
- _knownSupportedModes . Add ( SupportedMode . Dht ) ;
494
- _knownSupportedModes . Add ( SupportedMode . Frequency ) ;
495
- }
539
+ _commandHandlersLock . EnterWriteLock ( ) ;
540
+ // We add all known modes to the list, even though we don't really support them all in the core
541
+ _knownSupportedModes . Add ( SupportedMode . DigitalInput ) ;
542
+ _knownSupportedModes . Add ( SupportedMode . DigitalOutput ) ;
543
+ _knownSupportedModes . Add ( SupportedMode . AnalogInput ) ;
544
+ _knownSupportedModes . Add ( SupportedMode . Pwm ) ;
545
+ _knownSupportedModes . Add ( SupportedMode . Servo ) ;
546
+ _knownSupportedModes . Add ( SupportedMode . Shift ) ;
547
+ _knownSupportedModes . Add ( SupportedMode . I2c ) ;
548
+ _knownSupportedModes . Add ( SupportedMode . OneWire ) ;
549
+ _knownSupportedModes . Add ( SupportedMode . Stepper ) ;
550
+ _knownSupportedModes . Add ( SupportedMode . Encoder ) ;
551
+ _knownSupportedModes . Add ( SupportedMode . Serial ) ;
552
+ _knownSupportedModes . Add ( SupportedMode . InputPullup ) ;
553
+ _knownSupportedModes . Add ( SupportedMode . Spi ) ;
554
+ _knownSupportedModes . Add ( SupportedMode . Sonar ) ;
555
+ _knownSupportedModes . Add ( SupportedMode . Tone ) ;
556
+ _knownSupportedModes . Add ( SupportedMode . Dht ) ;
557
+ _knownSupportedModes . Add ( SupportedMode . Frequency ) ;
558
+ _commandHandlersLock . ExitWriteLock ( ) ;
496
559
}
497
560
498
561
/// <summary>
0 commit comments