@@ -448,6 +448,19 @@ protected override void Initialize()
448448
449449 _firmata . EnableDigitalReporting ( ) ;
450450
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+
451464 foreach ( ExtendedCommandHandler e in _extendedCommandHandlers )
452465 {
453466 e . Registered ( _firmata , this ) ;
@@ -458,41 +471,91 @@ protected override void Initialize()
458471 }
459472 }
460473
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+
461526 private void RegisterCommandHandlers ( )
462527 {
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 ( ) ;
468532 }
469533
470534 /// <summary>
471535 /// Registers the known supported modes. Should only be called once from Initialize.
472536 /// </summary>
473537 private void RegisterKnownSupportedModes ( )
474538 {
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 ( ) ;
496559 }
497560
498561 /// <summary>
0 commit comments