final1
SBUS.cpp@11:afe8c7d2cdf0, 2019-07-13 (annotated)
- Committer:
- sshogo
- Date:
- Sat Jul 13 02:14:09 2019 +0000
- Revision:
- 11:afe8c7d2cdf0
- Parent:
- 10:ac27dfde496e
- Child:
- 12:ac222684f449
fix convertReceivedData
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
sshogo | 0:e2bc011508c7 | 1 | #include "mbed.h" |
sshogo | 0:e2bc011508c7 | 2 | #include "SBUS.h" |
sshogo | 0:e2bc011508c7 | 3 | |
sshogo | 0:e2bc011508c7 | 4 | SBUS::SBUS(PinName tx, PinName rx) : |
sshogo | 0:e2bc011508c7 | 5 | com(tx, rx), |
sshogo | 4:da8728f3d289 | 6 | /*stickMaximumValue(0x068F), |
sshogo | 0:e2bc011508c7 | 7 | stickNeutralValue(0x03FF), |
sshogo | 4:da8728f3d289 | 8 | stickMinimumValue(0x016F),*/ |
sshogo | 4:da8728f3d289 | 9 | stickMaximumValue(0x0690), |
sshogo | 4:da8728f3d289 | 10 | stickNeutralValue(0x0400), |
sshogo | 4:da8728f3d289 | 11 | stickMinimumValue(0x0170), |
sshogo | 0:e2bc011508c7 | 12 | stickResolution(stickMaximumValue - stickMinimumValue) |
sshogo | 0:e2bc011508c7 | 13 | { |
sshogo | 0:e2bc011508c7 | 14 | com.baud(100000); |
sshogo | 0:e2bc011508c7 | 15 | com.attach(this, &SBUS::receiveData, Serial::RxIrq); |
sshogo | 0:e2bc011508c7 | 16 | com.format(8, Serial::Even, 2); |
sshogo | 4:da8728f3d289 | 17 | /*switchPositionValue[0] = 0x076F; |
sshogo | 4:da8728f3d289 | 18 | switchPositionValue[1] = 0x03FF; |
sshogo | 4:da8728f3d289 | 19 | switchPositionValue[2] = 0x008F; |
sshogo | 4:da8728f3d289 | 20 | switchFPositionValue[0] = 0x076F; |
sshogo | 4:da8728f3d289 | 21 | switchFPositionValue[1] = 0x0074;*/ |
sshogo | 0:e2bc011508c7 | 22 | switchPositionValue[0] = 0x076F; |
sshogo | 0:e2bc011508c7 | 23 | switchPositionValue[1] = 0x03FF; |
sshogo | 2:493d10424466 | 24 | switchPositionValue[2] = 0x008F; |
sshogo | 0:e2bc011508c7 | 25 | switchFPositionValue[0] = 0x076F; |
sshogo | 0:e2bc011508c7 | 26 | switchFPositionValue[1] = 0x0074; |
sshogo | 0:e2bc011508c7 | 27 | } |
sshogo | 0:e2bc011508c7 | 28 | |
sshogo | 0:e2bc011508c7 | 29 | float SBUS::getStickValue(int tag) { |
sshogo | 0:e2bc011508c7 | 30 | return stickValue[tag]; |
sshogo | 0:e2bc011508c7 | 31 | } |
sshogo | 0:e2bc011508c7 | 32 | |
sshogo | 0:e2bc011508c7 | 33 | int SBUS::getSwitchValue(int tag) { |
sshogo | 0:e2bc011508c7 | 34 | return switchValue[tag]; |
sshogo | 0:e2bc011508c7 | 35 | } |
sshogo | 0:e2bc011508c7 | 36 | |
sshogo | 0:e2bc011508c7 | 37 | int SBUS::getChannelValue(int tag) { |
sshogo | 0:e2bc011508c7 | 38 | return channel[tag]; |
sshogo | 0:e2bc011508c7 | 39 | } |
sshogo | 0:e2bc011508c7 | 40 | |
sshogo | 0:e2bc011508c7 | 41 | void SBUS::receiveData() { |
sshogo | 0:e2bc011508c7 | 42 | static int count = 0; |
sshogo | 0:e2bc011508c7 | 43 | char buf; |
sshogo | 0:e2bc011508c7 | 44 | |
sshogo | 4:da8728f3d289 | 45 | buf = com.getc(); |
sshogo | 0:e2bc011508c7 | 46 | |
sshogo | 4:da8728f3d289 | 47 | if(buf == 0x0F) { |
sshogo | 0:e2bc011508c7 | 48 | decordReceivedData(); |
sshogo | 0:e2bc011508c7 | 49 | count = 0; |
sshogo | 0:e2bc011508c7 | 50 | } |
sshogo | 0:e2bc011508c7 | 51 | if(count >= 25) return; |
sshogo | 0:e2bc011508c7 | 52 | receivedData[count] = buf; |
sshogo | 0:e2bc011508c7 | 53 | count++; |
sshogo | 0:e2bc011508c7 | 54 | } |
sshogo | 0:e2bc011508c7 | 55 | |
sshogo | 0:e2bc011508c7 | 56 | void SBUS::decordReceivedData() { |
sshogo | 0:e2bc011508c7 | 57 | channel[0] = ((receivedData[1] |receivedData[2]<<8) & 0x07FF); |
sshogo | 0:e2bc011508c7 | 58 | channel[1] = ((receivedData[2]>>3 |receivedData[3]<<5) & 0x07FF); |
sshogo | 0:e2bc011508c7 | 59 | channel[2] = ((receivedData[3]>>6 |receivedData[4]<<2 |receivedData[5]<<10) & 0x07FF); |
sshogo | 0:e2bc011508c7 | 60 | channel[3] = ((receivedData[5]>>1 |receivedData[6]<<7) & 0x07FF); |
sshogo | 0:e2bc011508c7 | 61 | channel[4] = ((receivedData[6]>>4 |receivedData[7]<<4) & 0x07FF); |
sshogo | 0:e2bc011508c7 | 62 | channel[5] = ((receivedData[7]>>7 |receivedData[8]<<1 |receivedData[9]<<9) & 0x07FF); |
sshogo | 0:e2bc011508c7 | 63 | channel[6] = ((receivedData[9]>>2 |receivedData[10]<<6) & 0x07FF); |
sshogo | 0:e2bc011508c7 | 64 | channel[7] = ((receivedData[10]>>5|receivedData[11]<<3) & 0x07FF); |
sshogo | 0:e2bc011508c7 | 65 | channel[8] = ((receivedData[12] |receivedData[13]<<8) & 0x07FF); |
sshogo | 0:e2bc011508c7 | 66 | channel[9] = ((receivedData[13]>>3|receivedData[14]<<5) & 0x07FF); |
sshogo | 0:e2bc011508c7 | 67 | channel[10] = ((receivedData[14]>>6|receivedData[15]<<2|receivedData[16]<<10) & 0x07FF); |
sshogo | 0:e2bc011508c7 | 68 | channel[11] = ((receivedData[16]>>1|receivedData[17]<<7) & 0x07FF); |
sshogo | 0:e2bc011508c7 | 69 | channel[12] = ((receivedData[17]>>4|receivedData[18]<<4) & 0x07FF); |
sshogo | 0:e2bc011508c7 | 70 | channel[13] = ((receivedData[18]>>7|receivedData[19]<<1|receivedData[20]<<9) & 0x07FF); |
sshogo | 0:e2bc011508c7 | 71 | channel[14] = ((receivedData[20]>>2|receivedData[21]<<6) & 0x07FF); |
sshogo | 0:e2bc011508c7 | 72 | channel[15] = ((receivedData[21]>>5|receivedData[22]<<3) & 0x07FF); |
sshogo | 0:e2bc011508c7 | 73 | convertReceivedData(); |
sshogo | 0:e2bc011508c7 | 74 | } |
sshogo | 0:e2bc011508c7 | 75 | |
sshogo | 0:e2bc011508c7 | 76 | void SBUS::convertReceivedData() { |
sshogo | 1:a1307d47b1b8 | 77 | for(int i = 0; i < 4; i++) { |
sshogo | 1:a1307d47b1b8 | 78 | float buf; |
sshogo | 11:afe8c7d2cdf0 | 79 | if(channel[i] > (stickNeutralValue + 15)) buf = ((channel[i] - stickNeutralValue) / (float)(stickMaximumValue - stickNeutralValue)); |
sshogo | 11:afe8c7d2cdf0 | 80 | else if(channel[i] < (stickNeutralValue - 15)) buf = -((channel[i] - stickNeutralValue) / (float)(stickMinimumValue - stickNeutralValue)); |
sshogo | 10:ac27dfde496e | 81 | else buf = 0.0f; |
sshogo | 7:0a43fd370575 | 82 | buf = (int)(buf*100)/100.0f; |
sshogo | 9:0c412933b84f | 83 | buf = (buf > 1.0f) ? 1.0f : buf; |
sshogo | 1:a1307d47b1b8 | 84 | switch(i) { |
sshogo | 1:a1307d47b1b8 | 85 | case right_RL: |
sshogo | 7:0a43fd370575 | 86 | stickValue[analog_rx] = buf; |
sshogo | 1:a1307d47b1b8 | 87 | break; |
sshogo | 1:a1307d47b1b8 | 88 | case right_UD: |
sshogo | 4:da8728f3d289 | 89 | stickValue[analog_ry] = buf; |
sshogo | 1:a1307d47b1b8 | 90 | break; |
sshogo | 1:a1307d47b1b8 | 91 | case left_RL: |
sshogo | 4:da8728f3d289 | 92 | stickValue[analog_lx] = buf; |
sshogo | 1:a1307d47b1b8 | 93 | break; |
sshogo | 1:a1307d47b1b8 | 94 | case left_UD: |
sshogo | 4:da8728f3d289 | 95 | stickValue[analog_ly] = -buf; |
sshogo | 1:a1307d47b1b8 | 96 | break; |
sshogo | 1:a1307d47b1b8 | 97 | default: |
sshogo | 1:a1307d47b1b8 | 98 | break; |
sshogo | 1:a1307d47b1b8 | 99 | } |
sshogo | 1:a1307d47b1b8 | 100 | } |
sshogo | 2:493d10424466 | 101 | for(int i = 0; i < 12; i++) { |
sshogo | 2:493d10424466 | 102 | switch(channel[i + 4]) { |
sshogo | 4:da8728f3d289 | 103 | case 0x078b: |
sshogo | 4:da8728f3d289 | 104 | case 0x770: |
sshogo | 2:493d10424466 | 105 | switchValue[i] = High; |
sshogo | 2:493d10424466 | 106 | break; |
sshogo | 4:da8728f3d289 | 107 | case 0x0400: |
sshogo | 2:493d10424466 | 108 | switchValue[i] = Neutral; |
sshogo | 2:493d10424466 | 109 | break; |
sshogo | 4:da8728f3d289 | 110 | case 0x0090: |
sshogo | 2:493d10424466 | 111 | switchValue[i] = Low; |
sshogo | 2:493d10424466 | 112 | break; |
sshogo | 2:493d10424466 | 113 | default: |
sshogo | 8:1294344216eb | 114 | switchValue[i] = 3; |
sshogo | 2:493d10424466 | 115 | break; |
sshogo | 2:493d10424466 | 116 | } |
sshogo | 2:493d10424466 | 117 | } |
sshogo | 0:e2bc011508c7 | 118 | } |