Read modify and generate PPM

Dependents:   pwm-output

Fork of PPM by good god

Committer:
edy05
Date:
Fri Jun 09 08:34:42 2017 +0000
Revision:
1:3649456c67ef
Parent:
0:ab42e541f04d
PPM read class

Who changed what in which revision?

UserRevisionLine numberNew 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;
edy05 1:3649456c67ef 55
goodgod 0:ab42e541f04d 56 current_dot = 0;
goodgod 0:ab42e541f04d 57 memset(dots, 0x00, DOTS);
goodgod 0:ab42e541f04d 58 for(channel = 0; channel < channel_number; channel++) {
goodgod 0:ab42e541f04d 59 dots[channel*2] = CHANNEL_SYNC;
goodgod 0:ab42e541f04d 60 dots[channel*2+1] = CHANNEL_PAD_SYNC;
goodgod 0:ab42e541f04d 61 }
goodgod 0:ab42e541f04d 62 setFrameSync();
goodgod 0:ab42e541f04d 63 }