Provides a simple way to generate complex square wave signals on any available pin. In addition the SignalGenerator can generate a carrier wave which is useful when generating IR signals to control electronic devices like a TV etc. The signal generation can be carried out either synchronously or asynchronously. In the case of synchronous signal generation all interrupts can optionally be disabled to improve timing accuracy.
Diff: SignalGenerator.h
- Revision:
- 4:64d2d834341b
- Parent:
- 3:f30dcc6e8e70
--- a/SignalGenerator.h Sat Sep 13 21:40:16 2014 +0000 +++ b/SignalGenerator.h Sun Sep 14 05:36:57 2014 +0000 @@ -12,13 +12,17 @@ /** Create a SignalGenerator tied to the specified pin. */ SignalGenerator(PinName pin); + /** Clean up the SignalGenerator data. */ + ~SignalGenerator(); + /** Set the state of the pin associated with the SignalGenerator. */ void set(bool pinState); - /** Set parameter and generate the corresponding signal on the pin associated with the SignalGenerator. + /** Generates the square wave signal on the pin associated with the SignalGenerator. * @param initialState Defines the initial state of the signal pin * @param timingBuffer Specificies the wime periods in microseconds before the signal pin changes state * @param bufferCount The count of transition times passed in the timingBuffer + * @param disableInterrupts If true disables interrupts during the generation of the signal * @param lastStateHoldTime The time in microseconds that the last state is held * @param carrierFrequency The carrier frequency in Hz */ @@ -26,10 +30,33 @@ bool initialState, uint32_t timingBuffer[], uint16_t bufferCount, + bool disableInterrupts, uint32_t lastStateHoldTime = 0, int32_t carrierFrequency = -1); + + /** Asynchronously generates the square wave signal on the pin associated with the SignalGenerator. + * @param initialState Defines the initial state of the signal pin + * @param timingBuffer Specificies the wime periods in microseconds before the signal pin changes state + * @param bufferCount The count of transition times passed in the timingBuffer + * @param repeat If true the signal generation will wrap around to the begining of the timingBuffer after each iteration through the buffer completes. + * @note To stop the asynchronous signal you can call any of the non-async set commands to set the pin to a final state. + */ + void setAsync( + bool initialState, + uint32_t timingBuffer[], + uint16_t bufferCount, + bool repeat); private: - DigitalOut _pin; + void asyncStep(); + void stopAsync(); + + private: + DigitalOut _pin; + Timeout *_pTicker; + uint32_t *_pInternalTimingBuffer; + uint16_t _bufferCount; + uint16_t _bufferIndex; + bool _repeat; }; #endif //__SIGNALGENERATOR_H__ \ No newline at end of file