Just a simple PPM out library
PPMOut.cpp@0:ab42e541f04d, 2017-01-08 (annotated)
- Committer:
- goodgod
- Date:
- Sun Jan 08 20:17:29 2017 +0000
- Revision:
- 0:ab42e541f04d
Initial ppm commit;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
goodgod | 0:ab42e541f04d | 1 | #include "mbed.h" |
goodgod | 0:ab42e541f04d | 2 | #include "PPMOut.h" |
goodgod | 0:ab42e541f04d | 3 | |
goodgod | 0:ab42e541f04d | 4 | PpmOut::PpmOut(PinName pin, uint8_t channel_number): ppm(pin) { |
goodgod | 0:ab42e541f04d | 5 | if(channel_number > MAX_CHANNELS){ |
goodgod | 0:ab42e541f04d | 6 | this->channel_number = MAX_CHANNELS; |
goodgod | 0:ab42e541f04d | 7 | } |
goodgod | 0:ab42e541f04d | 8 | this->channel_number = channel_number; |
goodgod | 0:ab42e541f04d | 9 | resetChannels(); |
goodgod | 0:ab42e541f04d | 10 | pulse_out = 1; |
goodgod | 0:ab42e541f04d | 11 | ppm = pulse_out; |
goodgod | 0:ab42e541f04d | 12 | current_dot = 0; |
goodgod | 0:ab42e541f04d | 13 | timeout.attach_us(this, &PpmOut::attimeout, FRAME_LEN); |
goodgod | 0:ab42e541f04d | 14 | } |
goodgod | 0:ab42e541f04d | 15 | |
goodgod | 0:ab42e541f04d | 16 | void PpmOut::setChannel(int channel_no, uint16_t value) { |
goodgod | 0:ab42e541f04d | 17 | //__disable_irq(); // Disable Interrupts |
goodgod | 0:ab42e541f04d | 18 | if(channel_no > channel_number-1){ |
goodgod | 0:ab42e541f04d | 19 | return; |
goodgod | 0:ab42e541f04d | 20 | } |
goodgod | 0:ab42e541f04d | 21 | if(value > MAX_CHANNEL_VALUE){ |
goodgod | 0:ab42e541f04d | 22 | value = MAX_CHANNEL_VALUE; |
goodgod | 0:ab42e541f04d | 23 | } |
goodgod | 0:ab42e541f04d | 24 | dots[channel_no*2] = CHANNEL_SYNC; |
goodgod | 0:ab42e541f04d | 25 | dots[channel_no*2+1] = CHANNEL_PAD_SYNC + value; |
goodgod | 0:ab42e541f04d | 26 | |
goodgod | 0:ab42e541f04d | 27 | setFrameSync(); |
goodgod | 0:ab42e541f04d | 28 | //__enable_irq(); // Enable Interrupts |
goodgod | 0:ab42e541f04d | 29 | } |
goodgod | 0:ab42e541f04d | 30 | |
goodgod | 0:ab42e541f04d | 31 | void PpmOut::setFrameSync(){ |
goodgod | 0:ab42e541f04d | 32 | uint16_t sum_channels = 0; |
goodgod | 0:ab42e541f04d | 33 | for(uint8_t channel = 0; channel < channel_number; channel++) { |
goodgod | 0:ab42e541f04d | 34 | sum_channels += dots[channel*2+1]; |
goodgod | 0:ab42e541f04d | 35 | } |
goodgod | 0:ab42e541f04d | 36 | sum_channels += channel_number*CHANNEL_SYNC; |
goodgod | 0:ab42e541f04d | 37 | dots[channel_number*2] = CHANNEL_SYNC; |
goodgod | 0:ab42e541f04d | 38 | dots[channel_number*2+1] = FRAME_LEN - CHANNEL_SYNC - sum_channels; |
goodgod | 0:ab42e541f04d | 39 | } |
goodgod | 0:ab42e541f04d | 40 | |
goodgod | 0:ab42e541f04d | 41 | void PpmOut::attimeout() { |
goodgod | 0:ab42e541f04d | 42 | pulse_out = !pulse_out; |
goodgod | 0:ab42e541f04d | 43 | ppm = pulse_out; |
goodgod | 0:ab42e541f04d | 44 | |
goodgod | 0:ab42e541f04d | 45 | timeout.attach_us(this, &PpmOut::attimeout, dots[current_dot]); |
goodgod | 0:ab42e541f04d | 46 | current_dot++; |
goodgod | 0:ab42e541f04d | 47 | |
goodgod | 0:ab42e541f04d | 48 | if(current_dot == channel_number*2+2) { // 2 for FRAME_SYNC |
goodgod | 0:ab42e541f04d | 49 | current_dot = 0; |
goodgod | 0:ab42e541f04d | 50 | } |
goodgod | 0:ab42e541f04d | 51 | } |
goodgod | 0:ab42e541f04d | 52 | |
goodgod | 0:ab42e541f04d | 53 | void PpmOut::resetChannels() { |
goodgod | 0:ab42e541f04d | 54 | int8_t channel; |
goodgod | 0:ab42e541f04d | 55 | uint16_t sum_channels = 0; |
goodgod | 0:ab42e541f04d | 56 | |
goodgod | 0:ab42e541f04d | 57 | current_dot = 0; |
goodgod | 0:ab42e541f04d | 58 | memset(dots, 0x00, DOTS); |
goodgod | 0:ab42e541f04d | 59 | for(channel = 0; channel < channel_number; channel++) { |
goodgod | 0:ab42e541f04d | 60 | dots[channel*2] = CHANNEL_SYNC; |
goodgod | 0:ab42e541f04d | 61 | dots[channel*2+1] = CHANNEL_PAD_SYNC; |
goodgod | 0:ab42e541f04d | 62 | } |
goodgod | 0:ab42e541f04d | 63 | setFrameSync(); |
goodgod | 0:ab42e541f04d | 64 | } |