diff --git a/Multiprotocol/A7105_SPI.ino b/Multiprotocol/A7105_SPI.ino
index 561f6b6..baaff12 100644
--- a/Multiprotocol/A7105_SPI.ino
+++ b/Multiprotocol/A7105_SPI.ino
@@ -195,7 +195,7 @@ void A7105_AdjustLOBaseFreq(uint8_t cmd)
}
}
if(offset==1024) // Use channel 15 as an input
- offset=map(Channel_data[14],CHANNEL_MIN_100,CHANNEL_MAX_100,-300,300);
+ offset=convert_channel_16b_nolimit(CH15,-300,300);
if(old_offset==offset) // offset is the same as before...
return;
diff --git a/Multiprotocol/AFHDS2A_a7105.ino b/Multiprotocol/AFHDS2A_a7105.ino
index 7d501d7..4cb1675 100644
--- a/Multiprotocol/AFHDS2A_a7105.ino
+++ b/Multiprotocol/AFHDS2A_a7105.ino
@@ -171,8 +171,9 @@ static void AFHDS2A_build_packet(uint8_t type)
packet[0] = 0x58;
for(uint8_t ch=0; ch<14; ch++)
{
- packet[9 + ch*2] = Servo_data[CH_AETR[ch]]&0xFF;
- packet[10 + ch*2] = (Servo_data[CH_AETR[ch]]>>8)&0xFF;
+ uint16_t channelMicros = convert_channel_ppm(CH_AETR[ch]);
+ packet[9 + ch*2] = channelMicros&0xFF;
+ packet[10 + ch*2] = (channelMicros>>8)&0xFF;
}
break;
case AFHDS2A_PACKET_FAILSAFE:
@@ -180,7 +181,8 @@ static void AFHDS2A_build_packet(uint8_t type)
for(uint8_t ch=0; ch<14; ch++)
{
#ifdef FAILSAFE_ENABLE
- uint16_t failsafeMicros = (Failsafe_data[CH_AETR[ch]]*5)/8+860;
+ uint16_t failsafeMicros = Failsafe_data[CH_AETR[ch]];
+ failsafeMicros = (((failsafeMicros<<2)+failsafeMicros)>>3)+860;
if( failsafeMicros!=FAILSAFE_CHANNEL_HOLD+860)
{ // Failsafe values
packet[9 + ch*2] = failsafeMicros & 0xff;
diff --git a/Multiprotocol/ASSAN_nrf24l01.ino b/Multiprotocol/ASSAN_nrf24l01.ino
index aa34ac0..4504654 100644
--- a/Multiprotocol/ASSAN_nrf24l01.ino
+++ b/Multiprotocol/ASSAN_nrf24l01.ino
@@ -50,16 +50,13 @@ void ASSAN_init()
void ASSAN_send_packet()
{
- uint16_t temp;
for(uint8_t i=0;i<8;i++)
{
- if(mode_select != MODE_SERIAL) // If in PPM mode extend the output to 1000...2000µs
- temp=convert_channel_16b_nolim(i,1000,2000);
- else
- temp=Servo_data[i];
- temp<<=3;
- packet[2*i]=temp>>8;
- packet[2*i+1]=temp;
+ uint16_t val=Channel_data[i];
+ val=((val<<2)+val)+(860<<3); // PPM value <<3
+
+ packet[2*i]=val>>8;
+ packet[2*i+1]=val;
}
for(uint8_t i=0;i.
*/
-#ifndef STM32_BOARD
/************************************/
/************************************/
/** Arduino replacement routines **/
/************************************/
// replacement map()
-int16_t map( int16_t x, int16_t in_min, int16_t in_max, int16_t out_min, int16_t out_max)
+int16_t map16b( int16_t x, int16_t in_min, int16_t in_max, int16_t out_min, int16_t out_max)
{
// return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
long y ;
@@ -29,6 +28,7 @@ int16_t map( int16_t x, int16_t in_min, int16_t in_max, int16_t out_min, int16_t
return x + out_min ;
}
+#ifndef STM32_BOARD
// replacement millis() and micros()
// These work polled, no interrupts
// micros() MUST be called at least once every 32 milliseconds
@@ -38,6 +38,17 @@ uint32_t TotalMicros ;
uint32_t TotalMillis ;
uint8_t Correction ;
+int16_t map( int16_t x, int16_t in_min, int16_t in_max, int16_t out_min, int16_t out_max)
+{
+// return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
+ long y ;
+ x -= in_min ;
+ y = out_max - out_min ;
+ y *= x ;
+ x = y / (in_max - in_min) ;
+ return x + out_min ;
+}
+
uint32_t micros()
{
uint16_t elapsed ;
diff --git a/Multiprotocol/Bayang_nrf24l01.ino b/Multiprotocol/Bayang_nrf24l01.ino
index 92241e8..e294da5 100644
--- a/Multiprotocol/Bayang_nrf24l01.ino
+++ b/Multiprotocol/Bayang_nrf24l01.ino
@@ -90,28 +90,28 @@ static void __attribute__((unused)) BAYANG_send_packet(uint8_t bind)
//Flags packet[2]
packet[2] = 0x00;
- if(Servo_AUX1)
+ if(CH5_SW)
packet[2] = BAYANG_FLAG_FLIP;
- if(Servo_AUX2)
+ if(CH6_SW)
packet[2] |= BAYANG_FLAG_RTH;
- if(Servo_AUX3)
+ if(CH7_SW)
packet[2] |= BAYANG_FLAG_PICTURE;
- if(Servo_AUX4)
+ if(CH8_SW)
packet[2] |= BAYANG_FLAG_VIDEO;
- if(Servo_AUX5)
+ if(CH9_SW)
{
packet[2] |= BAYANG_FLAG_HEADLESS;
dyntrim = 0;
}
//Flags packet[3]
packet[3] = 0x00;
- if(Servo_AUX6)
+ if(CH10_SW)
packet[3] = BAYANG_FLAG_INVERTED;
- if(Servo_AUX7)
+ if(CH11_SW)
dyntrim = 0;
- if(Servo_AUX8)
+ if(CH12_SW)
packet[3] |= BAYANG_FLAG_TAKE_OFF;
- if(Servo_AUX9)
+ if(CH13_SW)
packet[3] |= BAYANG_FLAG_EMG_STOP;
//Aileron
val = convert_channel_10b(AILERON);
diff --git a/Multiprotocol/CABELL_nrf224l01.ino b/Multiprotocol/CABELL_nrf224l01.ino
index 2741feb..ce48808 100644
--- a/Multiprotocol/CABELL_nrf224l01.ino
+++ b/Multiprotocol/CABELL_nrf224l01.ino
@@ -208,7 +208,7 @@ static void __attribute__((unused)) CABELL_send_packet(uint8_t bindMode)
case 3 : adjusted_x = THROTTLE; break;
default : adjusted_x = x; break;
}
- holdValue = map(limit_channel_100(adjusted_x),servo_min_100,servo_max_100,1000,2000); // valid channel values are 1000 to 2000
+ holdValue = convert_channel_16b_limit(adjusted_x,1000,2000); // valid channel values are 1000 to 2000
if (bindMode)
{
switch (adjusted_x)
diff --git a/Multiprotocol/CG023_nrf24l01.ino b/Multiprotocol/CG023_nrf24l01.ino
index 6cd4a96..77f4509 100644
--- a/Multiprotocol/CG023_nrf24l01.ino
+++ b/Multiprotocol/CG023_nrf24l01.ino
@@ -54,13 +54,13 @@ static void __attribute__((unused)) CG023_send_packet(uint8_t bind)
// throttle : 0x00 - 0xFF
throttle=convert_channel_8b(THROTTLE);
// rudder
- rudder = convert_channel_8b_scale(RUDDER,0x44,0xBC); // yaw right : 0x80 (neutral) - 0xBC (right)
+ rudder = convert_channel_16b_limit(RUDDER,0x44,0xBC); // yaw right : 0x80 (neutral) - 0xBC (right)
if (rudder<=0x80)
rudder=0x80-rudder; // yaw left : 0x00 (neutral) - 0x3C (left)
// elevator : 0xBB - 0x7F - 0x43
- elevator = convert_channel_8b_scale(ELEVATOR, 0x43, 0xBB);
+ elevator = convert_channel_16b_limit(ELEVATOR, 0x43, 0xBB);
// aileron : 0x43 - 0x7F - 0xBB
- aileron = convert_channel_8b_scale(AILERON, 0x43, 0xBB);
+ aileron = convert_channel_16b_limit(AILERON, 0x43, 0xBB);
if (bind)
packet[0]= 0xaa;
@@ -86,20 +86,20 @@ static void __attribute__((unused)) CG023_send_packet(uint8_t bind)
{
// rate
packet[13] = CG023_FLAG_RATE_HIGH
- | GET_FLAG(Servo_AUX1,CG023_FLAG_FLIP)
- | GET_FLAG(Servo_AUX2,CG023_FLAG_LED_OFF)
- | GET_FLAG(Servo_AUX3,CG023_FLAG_STILL)
- | GET_FLAG(Servo_AUX4,CG023_FLAG_VIDEO)
- | GET_FLAG(Servo_AUX5,CG023_FLAG_EASY);
+ | GET_FLAG(CH5_SW,CG023_FLAG_FLIP)
+ | GET_FLAG(CH6_SW,CG023_FLAG_LED_OFF)
+ | GET_FLAG(CH7_SW,CG023_FLAG_STILL)
+ | GET_FLAG(CH8_SW,CG023_FLAG_VIDEO)
+ | GET_FLAG(CH9_SW,CG023_FLAG_EASY);
}
else
{// YD829
// rate
packet[13] = YD829_FLAG_RATE_HIGH
- | GET_FLAG(Servo_AUX1,YD829_FLAG_FLIP)
- | GET_FLAG(Servo_AUX3,YD829_FLAG_STILL)
- | GET_FLAG(Servo_AUX4,YD829_FLAG_VIDEO)
- | GET_FLAG(Servo_AUX5,YD829_FLAG_HEADLESS);
+ | GET_FLAG(CH5_SW,YD829_FLAG_FLIP)
+ | GET_FLAG(CH7_SW,YD829_FLAG_STILL)
+ | GET_FLAG(CH8_SW,YD829_FLAG_VIDEO)
+ | GET_FLAG(CH9_SW,YD829_FLAG_HEADLESS);
}
packet[14] = 0;
diff --git a/Multiprotocol/CX10_nrf24l01.ino b/Multiprotocol/CX10_nrf24l01.ino
index 6b3786d..8a35cba 100644
--- a/Multiprotocol/CX10_nrf24l01.ino
+++ b/Multiprotocol/CX10_nrf24l01.ino
@@ -57,18 +57,18 @@ static void __attribute__((unused)) CX10_Write_Packet(uint8_t bind)
packet[3] = rx_tx_addr[2];
packet[4] = rx_tx_addr[3];
// packet[5] to [8] (aircraft id) is filled during bind for blue board
- uint16_t aileron=map(limit_channel_100(AILERON),servo_min_100,servo_max_100,1000,2000);
- uint16_t elevator=map(limit_channel_100(ELEVATOR),servo_min_100,servo_max_100,2000,1000);
- uint16_t throttle=map(limit_channel_100(THROTTLE),servo_min_100,servo_max_100,1000,2000);
- uint16_t rudder=map(limit_channel_100(RUDDER),servo_min_100,servo_max_100,2000,1000);
+ uint16_t aileron= convert_channel_16b_limit(AILERON ,1000,2000);
+ uint16_t elevator=convert_channel_16b_limit(ELEVATOR,2000,1000);
+ uint16_t throttle=convert_channel_16b_limit(THROTTLE,1000,2000);
+ uint16_t rudder= convert_channel_16b_limit(RUDDER ,2000,1000);
// Channel 5 - flip flag
- packet[12+offset] = GET_FLAG(Servo_AUX1,CX10_FLAG_FLIP); // flip flag applied on rudder
+ packet[12+offset] = GET_FLAG(CH5_SW,CX10_FLAG_FLIP); // flip flag applied on rudder
// Channel 6 - rate mode is 2 lsb of packet 13
- if(Servo_data[AUX2] > PPM_MAX_COMMAND) // rate 3 / headless on CX-10A
+ if(CH6_SW) // rate 3 / headless on CX-10A
flags = 0x02;
else
- if(Servo_data[AUX2] < PPM_MIN_COMMAND)
+ if(Channel_data[CH6] < CHANNEL_MIN_COMMAND)
flags = 0x00; // rate 1
else
flags = 0x01; // rate 2
@@ -78,66 +78,66 @@ static void __attribute__((unused)) CX10_Write_Packet(uint8_t bind)
switch(sub_protocol)
{
case CX10_BLUE:
- flags |= GET_FLAG(!Servo_AUX3, 0x10) // Channel 7 - picture
- |GET_FLAG( Servo_AUX4, 0x08); // Channel 8 - video
+ flags |= GET_FLAG(!CH7_SW, 0x10) // Channel 7 - picture
+ |GET_FLAG( CH8_SW, 0x08); // Channel 8 - video
break;
case Q282:
case Q242:
case Q222:
memcpy(&packet[15], "\x10\x10\xaa\xaa\x00\x00", 6);
//FLIP|LED|PICTURE|VIDEO|HEADLESS|RTH|XCAL|YCAL
- flags2 = GET_FLAG(Servo_AUX1, 0x80) // Channel 5 - FLIP
- |GET_FLAG(!Servo_AUX2, 0x40) // Channel 6 - LED
- |GET_FLAG(Servo_AUX5, 0x08) // Channel 9 - HEADLESS
- |GET_FLAG(Servo_AUX7, 0x04) // Channel 11 - XCAL
- |GET_FLAG(Servo_AUX8, 0x02); // Channel 12 - YCAL or Start/Stop motors on JXD 509
+ flags2 = GET_FLAG(CH5_SW, 0x80) // Channel 5 - FLIP
+ |GET_FLAG(!CH6_SW, 0x40) // Channel 6 - LED
+ |GET_FLAG(CH9_SW, 0x08) // Channel 9 - HEADLESS
+ |GET_FLAG(CH11_SW, 0x04) // Channel 11 - XCAL
+ |GET_FLAG(CH12_SW, 0x02); // Channel 12 - YCAL or Start/Stop motors on JXD 509
if(sub_protocol==Q242)
{
flags=2;
- flags2|= GET_FLAG(Servo_AUX3,0x01) // Channel 7 - picture
- |GET_FLAG(Servo_AUX4,0x10); // Channel 8 - video
+ flags2|= GET_FLAG(CH7_SW,0x01) // Channel 7 - picture
+ |GET_FLAG(CH8_SW,0x10); // Channel 8 - video
packet[17]=0x00;
packet[18]=0x00;
}
else
{ // Q282 & Q222
flags=3; // expert
- if(Servo_AUX4) // Channel 8 - Q282 video / Q222 Module 1
+ if(CH8_SW) // Channel 8 - Q282 video / Q222 Module 1
{
if (!(video_state & 0x20)) video_state ^= 0x21;
}
else
if (video_state & 0x20) video_state &= 0x01;
flags2 |= video_state
- |GET_FLAG(Servo_AUX3,0x10); // Channel 7 - Q282 picture / Q222 Module 2
+ |GET_FLAG(CH7_SW,0x10); // Channel 7 - Q282 picture / Q222 Module 2
}
- if(Servo_AUX6) flags |=0x80; // Channel 10 - RTH
+ if(CH10_SW) flags |=0x80; // Channel 10 - RTH
break;
case DM007:
aileron = 3000 - aileron;
//FLIP|MODE|PICTURE|VIDEO|HEADLESS
- flags2= GET_FLAG(Servo_AUX3,CX10_FLAG_SNAPSHOT) // Channel 7 - picture
- |GET_FLAG(Servo_AUX4,CX10_FLAG_VIDEO); // Channel 8 - video
- if(Servo_AUX5) flags |= CX10_FLAG_HEADLESS; // Channel 9 - headless
+ flags2= GET_FLAG(CH7_SW,CX10_FLAG_SNAPSHOT) // Channel 7 - picture
+ |GET_FLAG(CH8_SW,CX10_FLAG_VIDEO); // Channel 8 - video
+ if(CH9_SW) flags |= CX10_FLAG_HEADLESS; // Channel 9 - headless
break;
case JC3015_2:
aileron = 3000 - aileron;
elevator = 3000 - elevator;
//FLIP|MODE|LED|DFLIP
- if(Servo_AUX4) packet[12] &= ~CX10_FLAG_FLIP;
+ if(CH8_SW) packet[12] &= ~CX10_FLAG_FLIP;
case JC3015_1:
//FLIP|MODE|PICTURE|VIDEO
- flags2= GET_FLAG(Servo_AUX3,_BV(3)) // Channel 7
- |GET_FLAG(Servo_AUX4,_BV(4)); // Channel 8
+ flags2= GET_FLAG(CH7_SW,_BV(3)) // Channel 7
+ |GET_FLAG(CH8_SW,_BV(4)); // Channel 8
break;
case MK33041:
elevator = 3000 - elevator;
//FLIP|MODE|PICTURE|VIDEO|HEADLESS|RTH
- flags|=GET_FLAG(Servo_AUX3,_BV(7)) // Channel 7 - picture
- |GET_FLAG(Servo_AUX6,_BV(2)); // Channel 10 - rth
- flags2=GET_FLAG(Servo_AUX4,_BV(0)) // Channel 8 - video
- |GET_FLAG(Servo_AUX5,_BV(5)); // Channel 9 - headless
+ flags|=GET_FLAG(CH7_SW,_BV(7)) // Channel 7 - picture
+ |GET_FLAG(CH10_SW,_BV(2)); // Channel 10 - rth
+ flags2=GET_FLAG(CH8_SW,_BV(0)) // Channel 8 - video
+ |GET_FLAG(CH9_SW,_BV(5)); // Channel 9 - headless
break;
}
packet[5+offset] = lowByte(aileron);
diff --git a/Multiprotocol/Common.ino b/Multiprotocol/Common.ino
index 97d6c82..4622b6b 100644
--- a/Multiprotocol/Common.ino
+++ b/Multiprotocol/Common.ino
@@ -35,30 +35,73 @@ void InitFailsafe()
#endif
}
#endif
+#ifdef ENABLE_PPM
+void InitPPM()
+{
+ for(uint8_t i=0;i=2048) val=2047;
+ Channel_data[num]=val;
+}
+// Channel value is converted to ppm 860<->2140 -125%<->+125% and 988<->2012 -100%<->+100%
+uint16_t convert_channel_ppm(uint8_t num)
+{
+ uint16_t val=Channel_data[num];
+ return (((val<<2)+val)>>3)+860; //value range 860<->2140 -125%<->+125%
+}
+// Channel value 100% is converted to 10bit values 0<->1023
+uint16_t convert_channel_10b(uint8_t num)
+{
+ uint16_t val=Channel_data[num];
+ val=((val<<2)+val)>>3;
+ if(val<=128) return 0;
+ if(val>=1152) return 1023;
+ return val-128;
+}
+// Channel value 100% is converted to 8bit values 0<->255
uint8_t convert_channel_8b(uint8_t num)
{
- return (uint8_t) (map(limit_channel_100(num),servo_min_100,servo_max_100,0,255));
+ uint16_t val=Channel_data[num];
+ val=((val<<2)+val)>>5;
+ if(val<=32) return 0;
+ if(val>=288) return 255;
+ return val-32;
}
-// Channel value is converted to 8bit values to provided values scale
-uint8_t convert_channel_8b_scale(uint8_t num,uint8_t min,uint8_t max)
+// Channel value 100% is converted to value scaled
+int16_t convert_channel_16b_limit(uint8_t num,int16_t min,int16_t max)
{
- return (uint8_t) (map(limit_channel_100(num),servo_min_100,servo_max_100,min,max));
+ int32_t val=limit_channel_100(num); // 204<->1844
+ val=(val-CHANNEL_MIN_100)*(max-min)/(CHANNEL_MAX_100-CHANNEL_MIN_100)+min;
+ return (uint16_t)val;
+}
+
+// Channel value -125%<->125% is scaled to 16bit value with no limit
+int16_t convert_channel_16b_nolimit(uint8_t num, int16_t min, int16_t max)
+{
+ int32_t val=Channel_data[num]; // 0<->2047
+ val=(val-CHANNEL_MIN_100)*(max-min)/(CHANNEL_MAX_100-CHANNEL_MIN_100)+min;
+ return (uint16_t)val;
}
// Channel value is converted sign + magnitude 8bit values
@@ -69,27 +112,25 @@ uint8_t convert_channel_s8b(uint8_t num)
return (ch < 128 ? 127-ch : ch);
}
-// Channel value is converted to 10bit values
-uint16_t convert_channel_10b(uint8_t num)
+// Channel value is limited to 100%
+uint16_t limit_channel_100(uint8_t num)
{
- return (uint16_t) (map(limit_channel_100(num),servo_min_100,servo_max_100,1,1023));
-}
-
-// Channel value is multiplied by 1.5
-uint16_t convert_channel_frsky(uint8_t num)
-{
- return Servo_data[num] + Servo_data[num]/2;
+ if(Channel_data[num]>=CHANNEL_MAX_100)
+ return CHANNEL_MAX_100;
+ if (Channel_data[num]<=CHANNEL_MIN_100)
+ return CHANNEL_MIN_100;
+ return Channel_data[num];
}
// Channel value is converted for HK310
void convert_channel_HK310(uint8_t num, uint8_t *low, uint8_t *high)
{
- uint16_t temp=0xFFFF-(4*Servo_data[num])/3;
+ uint16_t temp=0xFFFF-(3440+((Channel_data[num]*5)>>1))/3;
*low=(uint8_t)(temp&0xFF);
*high=(uint8_t)(temp>>8);
}
-// Failsafe value is converted for HK310
#ifdef FAILSAFE_ENABLE
+// Failsafe value is converted for HK310
void convert_failsafe_HK310(uint8_t num, uint8_t *low, uint8_t *high)
{
uint16_t temp=0xFFFF-(3440+((Failsafe_data[num]*5)>>1))/3;
@@ -98,27 +139,11 @@ void convert_failsafe_HK310(uint8_t num, uint8_t *low, uint8_t *high)
}
#endif
-// Channel value is converted to 16bit values
-uint16_t convert_channel_16b(uint8_t num, int16_t out_min, int16_t out_max)
+// Channel value for FrSky (PPM is multiplied by 1.5)
+uint16_t convert_channel_frsky(uint8_t num)
{
- return (uint16_t) (map(limit_channel_100(num),servo_min_100,servo_max_100,out_min,out_max));
-}
-
-// Channel value is converted to 16bit values with no limit
-uint16_t convert_channel_16b_nolim(uint8_t num, int16_t out_min, int16_t out_max)
-{
- return (uint16_t) (map(Servo_data[num],servo_min_100,servo_max_100,out_min,out_max));
-}
-
-// Channel value is limited to PPM_100
-uint16_t limit_channel_100(uint8_t ch)
-{
- if(Servo_data[ch]>servo_max_100)
- return servo_max_100;
- else
- if (Servo_data[ch]>4)+1290;
}
/******************************/
diff --git a/Multiprotocol/Corona_cc2500.ino b/Multiprotocol/Corona_cc2500.ino
index 8b2c7ff..920bff5 100644
--- a/Multiprotocol/Corona_cc2500.ino
+++ b/Multiprotocol/Corona_cc2500.ino
@@ -120,8 +120,9 @@ static void __attribute__((unused)) CORONA_send_packet()
memset(packet+9, 0x00, 4);
for(uint8_t i=0; i<8; i++)
{ // Channel values are packed
- packet[i+1] = Servo_data[i];
- packet[9 + (i>>1)] |= (i&0x01)?(Servo_data[i]>>4)&0xF0:(Servo_data[i]>>8)&0x0F;
+ uint16_t val=convert_channel_ppm(i);
+ packet[i+1] = val;
+ packet[9 + (i>>1)] |= (i&0x01)?(val>>4)&0xF0:(val>>8)&0x0F;
}
//TX ID
diff --git a/Multiprotocol/DM002_nrf24l01.ino b/Multiprotocol/DM002_nrf24l01.ino
index 9c9ca55..c87d89d 100644
--- a/Multiprotocol/DM002_nrf24l01.ino
+++ b/Multiprotocol/DM002_nrf24l01.ino
@@ -52,19 +52,19 @@ static void __attribute__((unused)) DM002_send_packet(uint8_t bind)
{
packet[0]=0x55;
// Throttle : 0 .. 200
- packet[1]=convert_channel_8b_scale(THROTTLE,0,200);
+ packet[1]=convert_channel_16b_limit(THROTTLE,0,200);
// Other channels min 0x57, mid 0x7F, max 0xA7
- packet[2] = convert_channel_8b_scale(RUDDER,0x57,0xA7);
- packet[3] = convert_channel_8b_scale(AILERON, 0x57,0xA7);
- packet[4] = convert_channel_8b_scale(ELEVATOR, 0xA7, 0x57);
+ packet[2] = convert_channel_16b_limit(RUDDER,0x57,0xA7);
+ packet[3] = convert_channel_16b_limit(AILERON, 0x57,0xA7);
+ packet[4] = convert_channel_16b_limit(ELEVATOR, 0xA7, 0x57);
// Features
- packet[9] = GET_FLAG(Servo_AUX1,DM002_FLAG_FLIP)
- | GET_FLAG(!Servo_AUX2,DM002_FLAG_LED)
- | GET_FLAG(Servo_AUX3,DM002_FLAG_CAMERA1)
- | GET_FLAG(Servo_AUX4,DM002_FLAG_CAMERA2)
- | GET_FLAG(Servo_AUX5,DM002_FLAG_HEADLESS)
- | GET_FLAG(Servo_AUX6,DM002_FLAG_RTH)
- | GET_FLAG(!Servo_AUX7,DM002_FLAG_HIGH);
+ packet[9] = GET_FLAG(CH5_SW,DM002_FLAG_FLIP)
+ | GET_FLAG(!CH6_SW,DM002_FLAG_LED)
+ | GET_FLAG(CH7_SW,DM002_FLAG_CAMERA1)
+ | GET_FLAG(CH8_SW,DM002_FLAG_CAMERA2)
+ | GET_FLAG(CH9_SW,DM002_FLAG_HEADLESS)
+ | GET_FLAG(CH10_SW,DM002_FLAG_RTH)
+ | GET_FLAG(!CH11_SW,DM002_FLAG_HIGH);
// Packet counter
if(packet_count&0x03)
{
diff --git a/Multiprotocol/DSM_cyrf6936.ino b/Multiprotocol/DSM_cyrf6936.ino
index f1d3a4c..c68b3b9 100644
--- a/Multiprotocol/DSM_cyrf6936.ino
+++ b/Multiprotocol/DSM_cyrf6936.ino
@@ -245,7 +245,6 @@ static void __attribute__((unused)) DSM_update_channels()
static void __attribute__((unused)) DSM_build_data_packet(uint8_t upper)
{
- uint16_t max = 2047;
uint8_t bits = 11;
if(prev_option!=option)
@@ -261,10 +260,7 @@ static void __attribute__((unused)) DSM_build_data_packet(uint8_t upper)
packet[0] = (0xff ^ cyrfmfg_id[2]);
packet[1] = (0xff ^ cyrfmfg_id[3]);
if(sub_protocol==DSM2_22)
- {
- max=1023; // Only DSM_22 is using a resolution of 1024
- bits=10;
- }
+ bits=10; // Only DSM_22 is using a resolution of 1024
}
for (uint8_t i = 0; i < 7; i++)
@@ -276,7 +272,8 @@ static void __attribute__((unused)) DSM_build_data_packet(uint8_t upper)
/* Spektrum own remotes transmit normal values during bind and actually
* use this (e.g. Nano CP X) to select the transmitter mode (e.g. computer vs
* non-computer radio, so always end normal output */
- value=map(Servo_data[CH_TAER[idx]],servo_min_125,servo_max_125,0,max);
+ value=Channel_data[CH_TAER[idx]];
+ if(bits==10) value>>=1;
value |= (upper && i==0 ? 0x8000 : 0) | (idx << bits);
}
packet[i*2+2] = (value >> 8) & 0xff;
diff --git a/Multiprotocol/Devo_cyrf6936.ino b/Multiprotocol/Devo_cyrf6936.ino
index fccc698..d848a00 100644
--- a/Multiprotocol/Devo_cyrf6936.ino
+++ b/Multiprotocol/Devo_cyrf6936.ino
@@ -148,7 +148,7 @@ static void __attribute__((unused)) DEVO_build_data_pkt()
uint8_t sign = 0x0b;
for (uint8_t i = 0; i < 4; i++)
{
- int16_t value=map(Servo_data[CH_EATR[ch_idx * 4 + i]],servo_min_100,servo_max_100,-1600,1600);//range -1600..+1600
+ int16_t value=convert_channel_16b_nolimit(CH_EATR[ch_idx * 4 + i],-1600,1600);//range -1600..+1600
if(value < 0)
{
value = -value;
diff --git a/Multiprotocol/ESky150_nrf24l01.ino b/Multiprotocol/ESky150_nrf24l01.ino
index eee07ef..bbc88c5 100644
--- a/Multiprotocol/ESky150_nrf24l01.ino
+++ b/Multiprotocol/ESky150_nrf24l01.ino
@@ -84,19 +84,19 @@ static void __attribute__((unused)) ESKY150_bind_init()
static void __attribute__((unused)) ESKY150_send_packet()
{
// Build packet
- uint16_t throttle=convert_channel_16b(THROTTLE,1000,2000);
- uint16_t aileron=convert_channel_16b(AILERON,1000,2000);
- uint16_t elevator=convert_channel_16b(ELEVATOR,1000,2000);
- uint16_t rudder=convert_channel_16b(RUDDER,1000,2000);
+ uint16_t throttle=convert_channel_16b_limit(THROTTLE,1000,2000);
+ uint16_t aileron=convert_channel_16b_limit(AILERON,1000,2000);
+ uint16_t elevator=convert_channel_16b_limit(ELEVATOR,1000,2000);
+ uint16_t rudder=convert_channel_16b_limit(RUDDER,1000,2000);
//set unused channels to zero, for compatibility with older 4 channel models
uint8_t flight_mode=0;
uint16_t aux_ch6=0;
uint8_t aux_ch7=0;
if(option==1)
{
- flight_mode=ESKY150_convert_2bit_channel(AUX1);
- aux_ch6=convert_channel_16b(AUX2,1000,2000);
- aux_ch7=ESKY150_convert_2bit_channel(AUX3);
+ flight_mode=ESKY150_convert_2bit_channel(CH5);
+ aux_ch6=convert_channel_16b_limit(CH6,1000,2000);
+ aux_ch7=ESKY150_convert_2bit_channel(CH7);
}
packet[0] = hopping_frequency[0];
packet[1] = hopping_frequency[1];
@@ -137,13 +137,13 @@ static void __attribute__((unused)) ESKY150_send_packet()
uint8_t ESKY150_convert_2bit_channel(uint8_t num)
{
- if(Servo_data[num] > PPM_MAX_COMMAND)
+ if(Channel_data[num] > CHANNEL_MAX_COMMAND)
return 0x03;
else
- if(Servo_data[num] < PPM_MIN_COMMAND)
+ if(Channel_data[num] < CHANNEL_MIN_COMMAND)
return 0x00;
else
- if(Servo_data[num] > PPM_SWITCH)
+ if(Channel_data[num] > CHANNEL_SWITCH)
return 0x02;
return 0x01;
}
diff --git a/Multiprotocol/ESky_nrf24l01.ino b/Multiprotocol/ESky_nrf24l01.ino
index 1a0eaee..9a72c94 100644
--- a/Multiprotocol/ESky_nrf24l01.ino
+++ b/Multiprotocol/ESky_nrf24l01.ino
@@ -119,8 +119,9 @@ static void __attribute__((unused)) ESKY_send_packet(uint8_t bind)
{
for (uint8_t i = 0; i < 6; i++)
{
- packet[i*2] = Servo_data[CH_AETR[i]]>>8; //high byte of servo timing(1000-2000us)
- packet[i*2+1] = Servo_data[CH_AETR[i]]&0xFF; //low byte of servo timing(1000-2000us)
+ uint16_t val=convert_channel_ppm(CH_AETR[i]);
+ packet[i*2] = val>>8; //high byte of servo timing(1000-2000us)
+ packet[i*2+1] = val&0xFF; //low byte of servo timing(1000-2000us)
}
}
rf_ch = hopping_frequency[hopping_frequency_no];
diff --git a/Multiprotocol/FQ777_nrf24l01.ino b/Multiprotocol/FQ777_nrf24l01.ino
index 4978406..a40c4e5 100644
--- a/Multiprotocol/FQ777_nrf24l01.ino
+++ b/Multiprotocol/FQ777_nrf24l01.ino
@@ -125,15 +125,15 @@ static void __attribute__((unused)) FQ777_send_packet(uint8_t bind)
else // roll
trim_val = 0x60;
- packet_ori[0] = convert_channel_8b_scale(THROTTLE,0,0x64);
- packet_ori[1] = convert_channel_8b_scale(RUDDER,0,0x64);
- packet_ori[2] = convert_channel_8b_scale(ELEVATOR,0,0x64);
- packet_ori[3] = convert_channel_8b_scale(AILERON,0,0x64);
+ packet_ori[0] = convert_channel_16b_limit(THROTTLE,0,0x64);
+ packet_ori[1] = convert_channel_16b_limit(RUDDER,0,0x64);
+ packet_ori[2] = convert_channel_16b_limit(ELEVATOR,0,0x64);
+ packet_ori[3] = convert_channel_16b_limit(AILERON,0,0x64);
packet_ori[4] = trim_val; // calculated above
- packet_ori[5] = GET_FLAG(Servo_AUX1, FQ777_FLAG_FLIP)
- | GET_FLAG(Servo_AUX3, FQ777_FLAG_HEADLESS)
- | GET_FLAG(!Servo_AUX2, FQ777_FLAG_RETURN)
- | GET_FLAG(Servo_AUX4,FQ777_FLAG_EXPERT);
+ packet_ori[5] = GET_FLAG(CH5_SW, FQ777_FLAG_FLIP)
+ | GET_FLAG(CH7_SW, FQ777_FLAG_HEADLESS)
+ | GET_FLAG(!CH6_SW, FQ777_FLAG_RETURN)
+ | GET_FLAG(CH8_SW,FQ777_FLAG_EXPERT);
packet_ori[6] = 0x00;
// calculate checksum
uint8_t checksum = 0;
diff --git a/Multiprotocol/FY326_nrf24l01.ino b/Multiprotocol/FY326_nrf24l01.ino
index 2daaae2..117c7fe 100644
--- a/Multiprotocol/FY326_nrf24l01.ino
+++ b/Multiprotocol/FY326_nrf24l01.ino
@@ -43,15 +43,15 @@ static void __attribute__((unused)) FY326_send_packet(uint8_t bind)
if(bind)
packet[1] = 0x55;
else
- packet[1] = GET_FLAG(Servo_AUX3, 0x80) // Headless
- | GET_FLAG(Servo_AUX2, 0x40) // RTH
- | GET_FLAG(Servo_AUX1, 0x02) // Flip
- | GET_FLAG(Servo_AUX5, 0x01) // Calibrate
- | GET_FLAG(Servo_AUX4, 0x04); // Expert
- packet[2] = convert_channel_8b_scale(AILERON, 0, 200); // aileron
- packet[3] = convert_channel_8b_scale(ELEVATOR, 0, 200); // elevator
- packet[4] = convert_channel_8b_scale(RUDDER, 0, 200); // rudder
- packet[5] = convert_channel_8b_scale(THROTTLE, 0, 200); // throttle
+ packet[1] = GET_FLAG(CH7_SW, 0x80) // Headless
+ | GET_FLAG(CH6_SW, 0x40) // RTH
+ | GET_FLAG(CH5_SW, 0x02) // Flip
+ | GET_FLAG(CH9_SW, 0x01) // Calibrate
+ | GET_FLAG(CH8_SW, 0x04); // Expert
+ packet[2] = convert_channel_16b_limit(AILERON, 0, 200); // aileron
+ packet[3] = convert_channel_16b_limit(ELEVATOR, 0, 200); // elevator
+ packet[4] = convert_channel_16b_limit(RUDDER, 0, 200); // rudder
+ packet[5] = convert_channel_16b_limit(THROTTLE, 0, 200); // throttle
if(sub_protocol==FY319)
{
packet[6] = convert_channel_8b(AILERON);
diff --git a/Multiprotocol/FlySky_a7105.ino b/Multiprotocol/FlySky_a7105.ino
index a058a9f..40ad7b9 100644
--- a/Multiprotocol/FlySky_a7105.ino
+++ b/Multiprotocol/FlySky_a7105.ino
@@ -58,37 +58,37 @@ static void __attribute__((unused)) flysky_apply_extension_flags()
switch(sub_protocol)
{
case V9X9:
- if(Servo_AUX1)
+ if(CH5_SW)
packet[12] |= FLAG_V9X9_FLIP;
- if(Servo_AUX2)
+ if(CH6_SW)
packet[12] |= FLAG_V9X9_LED;
- if(Servo_AUX3)
+ if(CH7_SW)
packet[10] |= FLAG_V9X9_CAMERA;
- if(Servo_AUX4)
+ if(CH8_SW)
packet[10] |= FLAG_V9X9_VIDEO;
break;
case V6X6:
packet[13] = 0x03; // 3 = 100% rate (0=40%, 1=60%, 2=80%)
packet[14] = 0x00;
- if(Servo_AUX1)
+ if(CH5_SW)
packet[14] |= FLAG_V6X6_FLIP;
- if(Servo_AUX2)
+ if(CH6_SW)
packet[14] |= FLAG_V6X6_LED;
- if(Servo_AUX3)
+ if(CH7_SW)
packet[14] |= FLAG_V6X6_CAMERA;
- if(Servo_AUX4)
+ if(CH8_SW)
packet[14] |= FLAG_V6X6_VIDEO;
- if(Servo_AUX5)
+ if(CH9_SW)
{
packet[13] |= FLAG_V6X6_HLESS1;
packet[14] |= FLAG_V6X6_HLESS2;
}
- if(Servo_AUX6)
+ if(CH10_SW)
packet[14] |= FLAG_V6X6_RTH;
- if(Servo_AUX7)
+ if(CH11_SW)
packet[14] |= FLAG_V6X6_XCAL;
- if(Servo_AUX8)
+ if(CH12_SW)
packet[14] |= FLAG_V6X6_YCAL;
packet[15] = 0x10; // unknown
packet[16] = 0x10; // unknown
@@ -105,9 +105,9 @@ static void __attribute__((unused)) flysky_apply_extension_flags()
packet[12] |= 0x20; // bit 6 is always set ?
packet[13] = 0x00; // unknown
packet[14] = 0x00;
- if(Servo_AUX1)
+ if(CH5_SW)
packet[14] = FLAG_V912_BTMBTN;
- if(Servo_AUX2)
+ if(CH6_SW)
packet[14] |= FLAG_V912_TOPBTN;
packet[15] = 0x27; // [15] and [16] apparently hold an analog channel with a value lower than 1000
packet[16] = 0x03; // maybe it's there for a pitch channel for a CP copter ?
@@ -136,7 +136,7 @@ static void __attribute__((unused)) flysky_build_packet(uint8_t init)
//-100% =~ 0x03e8//=1000us(min)
//+100% =~ 0x07ca//=1994us(max)
//Center = 0x5d9//=1497us(center)
- //channel order AIL;ELE;THR;RUD;AUX1;AUX2;AUX3;AUX4
+ //channel order AIL;ELE;THR;RUD;CH5;CH6;CH7;CH8
packet[0] = init ? 0xaa : 0x55;
packet[1] = rx_tx_addr[3];
packet[2] = rx_tx_addr[2];
@@ -144,11 +144,9 @@ static void __attribute__((unused)) flysky_build_packet(uint8_t init)
packet[4] = rx_tx_addr[0];
for(i = 0; i < 8; i++)
{
- uint16_t temp=Servo_data[CH_AETR[i]];
- if(sub_protocol == CX20 && CH_AETR[i] == ELEVATOR)
- temp=servo_mid-temp; //reverse channel
- if(mode_select != MODE_SERIAL) //if in PPM mode extend the output to 1000...2000µs
- temp=map(temp,servo_min_100,servo_max_100,1000,2000);
+ uint16_t temp=convert_channel_ppm(CH_AETR[i]);
+ if(sub_protocol == CX20 && CH_AETR[i]==ELEVATOR)
+ temp=3000-temp;
packet[5 + i*2]=temp&0xFF; //low byte of servo timing(1000-2000us)
packet[6 + i*2]=(temp>>8)&0xFF; //high byte of servo timing(1000-2000us)
}
diff --git a/Multiprotocol/FrSkyX_cc2500.ino b/Multiprotocol/FrSkyX_cc2500.ino
index 8cc7d8b..4a317af 100644
--- a/Multiprotocol/FrSkyX_cc2500.ino
+++ b/Multiprotocol/FrSkyX_cc2500.ino
@@ -105,7 +105,7 @@ static void __attribute__((unused)) frskyX_build_bind_packet()
//64=860,1024=1500,1984=2140//Taranis 125%
static uint16_t __attribute__((unused)) frskyX_scaleForPXX( uint8_t i )
{ //mapped 860,2140(125%) range to 64,1984(PXX values);
- uint16_t chan_val=(((Servo_data[i]-servo_min_125)*3)>>1)+64;
+ uint16_t chan_val=convert_channel_frsky(i)-1226;
if(i>7) chan_val|=2048; // upper channels offset
return chan_val;
}
diff --git a/Multiprotocol/GW008_nrf24l01.ino b/Multiprotocol/GW008_nrf24l01.ino
index 6c2d4f4..2296730 100644
--- a/Multiprotocol/GW008_nrf24l01.ino
+++ b/Multiprotocol/GW008_nrf24l01.ino
@@ -47,11 +47,11 @@ static void __attribute__((unused)) send_packet(uint8_t bind)
}
else
{
- packet[1] = 0x01 | GET_FLAG(AUX1, 0x40); // flip
- packet[2] = convert_channel_8b_scale(AILERON , 200, 0); // aileron
- packet[3] = convert_channel_8b_scale(ELEVATOR, 0, 200); // elevator
- packet[4] = convert_channel_8b_scale(RUDDER , 200, 0); // rudder
- packet[5] = convert_channel_8b_scale(THROTTLE, 0, 200); // throttle
+ packet[1] = 0x01 | GET_FLAG(CH5, 0x40); // flip
+ packet[2] = convert_channel_16b_limit(AILERON , 200, 0); // aileron
+ packet[3] = convert_channel_16b_limit(ELEVATOR, 0, 200); // elevator
+ packet[4] = convert_channel_16b_limit(RUDDER , 200, 0); // rudder
+ packet[5] = convert_channel_16b_limit(THROTTLE, 0, 200); // throttle
packet[6] = 0xaa;
packet[7] = 0x02; // max rate
packet[8] = 0x00;
diff --git a/Multiprotocol/H8_3D_nrf24l01.ino b/Multiprotocol/H8_3D_nrf24l01.ino
index 01c94f0..8fe92f5 100644
--- a/Multiprotocol/H8_3D_nrf24l01.ino
+++ b/Multiprotocol/H8_3D_nrf24l01.ino
@@ -74,7 +74,7 @@ static void __attribute__((unused)) H8_3D_send_packet(uint8_t bind)
packet[5] = hopping_frequency_no;
packet[7] = 0x03;
- rudder = convert_channel_8b_scale(RUDDER,0x44,0xBC); // yaw right : 0x80 (neutral) - 0xBC (right)
+ rudder = convert_channel_16b_limit(RUDDER,0x44,0xBC); // yaw right : 0x80 (neutral) - 0xBC (right)
if(sub_protocol!=H20H)
{ // H8_3D, H20MINI, H30MINI
packet[6] = 0x08;
@@ -89,7 +89,7 @@ static void __attribute__((unused)) H8_3D_send_packet(uint8_t bind)
else
{ //H20H
packet[6] = hopping_frequency_no == 0 ? 8 - packet_count : 16 - packet_count;
- packet[9] = convert_channel_8b_scale(THROTTLE, 0x43, 0xBB); // throttle : 0x43 - 0x7F - 0xBB
+ packet[9] = convert_channel_16b_limit(THROTTLE, 0x43, 0xBB); // throttle : 0x43 - 0x7F - 0xBB
packet[15]= 0x40; // trims
packet[16]= 0x40; // trims
rudder--; // rudder : 0x43 - 0x7F - 0xBB
@@ -97,24 +97,24 @@ static void __attribute__((unused)) H8_3D_send_packet(uint8_t bind)
rudder=0x7F; // Small deadband
}
packet[10] = rudder;
- packet[11] = convert_channel_8b_scale(ELEVATOR, 0x43, 0xBB); // elevator : 0x43 - 0x7F - 0xBB
- packet[12] = convert_channel_8b_scale(AILERON, 0x43, 0xBB); // aileron : 0x43 - 0x7F - 0xBB
+ packet[11] = convert_channel_16b_limit(ELEVATOR, 0x43, 0xBB); // elevator : 0x43 - 0x7F - 0xBB
+ packet[12] = convert_channel_16b_limit(AILERON, 0x43, 0xBB); // aileron : 0x43 - 0x7F - 0xBB
// neutral trims
packet[13] = 0x20;
packet[14] = 0x20;
// flags
packet[17] = H8_3D_FLAG_RATE_HIGH
- | GET_FLAG(Servo_AUX1,H8_3D_FLAG_FLIP)
- | GET_FLAG(Servo_AUX2,H8_3D_FLAG_LIGTH) //H22 light
- | GET_FLAG(Servo_AUX5,H8_3D_FLAG_HEADLESS)
- | GET_FLAG(Servo_AUX6,H8_3D_FLAG_RTH); // 180/360 flip mode on H8 3D
- packet[18] = GET_FLAG(Servo_AUX3,H8_3D_FLAG_PICTURE)
- | GET_FLAG(Servo_AUX4,H8_3D_FLAG_VIDEO)
- | GET_FLAG(Servo_AUX7,H8_3D_FLAG_CALIBRATE1)
- | GET_FLAG(Servo_AUX8,H8_3D_FLAG_CALIBRATE2);
- if(Servo_data[AUX9]PPM_MAX_COMMAND)
+ if(CH13_SW)
packet[18] |= H8_3D_FLAG_CAM_UP;
}
uint8_t sum = packet[9];
diff --git a/Multiprotocol/Hisky_nrf24l01.ino b/Multiprotocol/Hisky_nrf24l01.ino
index bd42296..2596c9a 100644
--- a/Multiprotocol/Hisky_nrf24l01.ino
+++ b/Multiprotocol/Hisky_nrf24l01.ino
@@ -122,10 +122,10 @@ static void __attribute__((unused)) build_ch_data()
uint8_t i,j;
for (i = 0; i< 8; i++) {
j=CH_AETR[i];
- temp=map(limit_channel_100(j),servo_min_100,servo_max_100,0,1000);
+ temp=convert_channel_16b_limit(j,0,1000);
if (j == THROTTLE) // It is clear that hisky's throttle stick is made reversely, so I adjust it here on purpose
temp = 1000 -temp;
- if (j == AUX3)
+ if (j == CH7)
temp = temp < 400 ? 0 : 3; // Gyro mode, 0 - 6 axis, 3 - 3 axis
packet[i] = (uint8_t)(temp&0xFF);
packet[i<4?8:9]>>=2;
@@ -156,7 +156,7 @@ uint16_t hisky_cb()
{ // send failsafe every 100ms
convert_failsafe_HK310(RUDDER, &packet[0],&packet[1]);
convert_failsafe_HK310(THROTTLE,&packet[2],&packet[3]);
- convert_failsafe_HK310(AUX1, &packet[4],&packet[5]);
+ convert_failsafe_HK310(CH5, &packet[4],&packet[5]);
packet[7]=0xAA;
packet[8]=0x5A;
}
@@ -165,7 +165,7 @@ uint16_t hisky_cb()
{
convert_channel_HK310(RUDDER, &packet[0],&packet[1]);
convert_channel_HK310(THROTTLE,&packet[2],&packet[3]);
- convert_channel_HK310(AUX1, &packet[4],&packet[5]);
+ convert_channel_HK310(CH5, &packet[4],&packet[5]);
packet[7]=0x55;
packet[8]=0x67;
}
diff --git a/Multiprotocol/Hontai_nrf24l01.ino b/Multiprotocol/Hontai_nrf24l01.ino
index be99427..4e5b5ba 100644
--- a/Multiprotocol/Hontai_nrf24l01.ino
+++ b/Multiprotocol/Hontai_nrf24l01.ino
@@ -69,60 +69,60 @@ static void __attribute__((unused)) HONTAI_send_packet(uint8_t bind)
else
{
memset(packet,0,HONTAI_PACKET_SIZE);
- packet[3] = convert_channel_8b_scale(THROTTLE, 0, 127) << 1; // Throttle
- packet[4] = convert_channel_8b_scale(AILERON, 63, 0); // Aileron
- packet[5] = convert_channel_8b_scale(ELEVATOR, 0, 63); // Elevator
- packet[6] = convert_channel_8b_scale(RUDDER, 0, 63); // Rudder
+ packet[3] = convert_channel_16b_limit(THROTTLE, 0, 127) << 1; // Throttle
+ packet[4] = convert_channel_16b_limit(AILERON, 63, 0); // Aileron
+ packet[5] = convert_channel_16b_limit(ELEVATOR, 0, 63); // Elevator
+ packet[6] = convert_channel_16b_limit(RUDDER, 0, 63); // Rudder
if(sub_protocol == FORMAT_X5C1)
- packet[7] = convert_channel_8b_scale(AILERON, 0, 63)-31; // Aileron trim
+ packet[7] = convert_channel_16b_limit(AILERON, 0, 63)-31; // Aileron trim
else
- packet[7] = convert_channel_8b_scale(AILERON, 0, 32)-16; // Aileron trim
- packet[8] = convert_channel_8b_scale(RUDDER, 0, 32)-16; // Rudder trim
+ packet[7] = convert_channel_16b_limit(AILERON, 0, 32)-16; // Aileron trim
+ packet[8] = convert_channel_16b_limit(RUDDER, 0, 32)-16; // Rudder trim
if (sub_protocol == FORMAT_X5C1)
- packet[9] = convert_channel_8b_scale(ELEVATOR, 0, 63)-31; // Elevator trim
+ packet[9] = convert_channel_16b_limit(ELEVATOR, 0, 63)-31; // Elevator trim
else
- packet[9] = convert_channel_8b_scale(ELEVATOR, 0, 32)-16; // Elevator trim
+ packet[9] = convert_channel_16b_limit(ELEVATOR, 0, 32)-16; // Elevator trim
switch(sub_protocol)
{
case FORMAT_HONTAI:
packet[0] = 0x0B;
- packet[3] |= GET_FLAG(Servo_AUX3, 0x01); // Picture
- packet[4] |= GET_FLAG(Servo_AUX6, 0x80) // RTH
- | GET_FLAG(Servo_AUX5, 0x40); // Headless
- packet[5] |= GET_FLAG(Servo_AUX7, 0x80) // Calibrate
- | GET_FLAG(Servo_AUX1, 0x40); // Flip
- packet[6] |= GET_FLAG(Servo_AUX4, 0x80); // Video
+ packet[3] |= GET_FLAG(CH7_SW, 0x01); // Picture
+ packet[4] |= GET_FLAG(CH10_SW, 0x80) // RTH
+ | GET_FLAG(CH9_SW, 0x40); // Headless
+ packet[5] |= GET_FLAG(CH11_SW, 0x80) // Calibrate
+ | GET_FLAG(CH5_SW, 0x40); // Flip
+ packet[6] |= GET_FLAG(CH8_SW, 0x80); // Video
break;
case FORMAT_JJRCX1:
- packet[0] = GET_FLAG(Servo_AUX2, 0x02); // Arm
- packet[3] |= GET_FLAG(Servo_AUX3, 0x01); // Picture
+ packet[0] = GET_FLAG(CH6_SW, 0x02); // Arm
+ packet[3] |= GET_FLAG(CH7_SW, 0x01); // Picture
packet[4] |= 0x80; // unknown
- packet[5] |= GET_FLAG(Servo_AUX7, 0x80) // Calibrate
- | GET_FLAG(Servo_AUX1, 0x40); // Flip
- packet[6] |= GET_FLAG(Servo_AUX4, 0x80); // Video
+ packet[5] |= GET_FLAG(CH11_SW, 0x80) // Calibrate
+ | GET_FLAG(CH5_SW, 0x40); // Flip
+ packet[6] |= GET_FLAG(CH8_SW, 0x80); // Video
packet[8] = 0xC0 // high rate, no rudder trim
- | GET_FLAG(Servo_AUX6, 0x02) // RTH
- | GET_FLAG(Servo_AUX5, 0x01); // Headless
+ | GET_FLAG(CH10_SW, 0x02) // RTH
+ | GET_FLAG(CH9_SW, 0x01); // Headless
break;
case FORMAT_X5C1:
packet[0] = 0x0B;
- packet[3] |= GET_FLAG(Servo_AUX3, 0x01); // Picture
+ packet[3] |= GET_FLAG(CH7_SW, 0x01); // Picture
packet[4] = 0x80 // unknown
- | GET_FLAG(Servo_AUX2, 0x40); // Lights
- packet[5] |= GET_FLAG(Servo_AUX7, 0x80) // Calibrate
- | GET_FLAG(Servo_AUX1, 0x40); // Flip
- packet[6] |= GET_FLAG(Servo_AUX4, 0x80); // Video
+ | GET_FLAG(CH6_SW, 0x40); // Lights
+ packet[5] |= GET_FLAG(CH11_SW, 0x80) // Calibrate
+ | GET_FLAG(CH5_SW, 0x40); // Flip
+ packet[6] |= GET_FLAG(CH8_SW, 0x80); // Video
packet[8] = 0xC0 // high rate, no rudder trim
- | GET_FLAG(Servo_AUX6, 0x02) // RTH
- | GET_FLAG(Servo_AUX5, 0x01); // Headless
+ | GET_FLAG(CH10_SW, 0x02) // RTH
+ | GET_FLAG(CH9_SW, 0x01); // Headless
break;
case FORMAT_FQ777_951:
- packet[0] = GET_FLAG(Servo_AUX3, 0x01) // Picture
- | GET_FLAG(Servo_AUX4, 0x02); // Video
- packet[3] |= GET_FLAG(Servo_AUX1, 0x01); // Flip
+ packet[0] = GET_FLAG(CH7_SW, 0x01) // Picture
+ | GET_FLAG(CH8_SW, 0x02); // Video
+ packet[3] |= GET_FLAG(CH5_SW, 0x01); // Flip
packet[4] |= 0xC0; // High rate (mid=0xa0, low=0x60)
- packet[5] |= GET_FLAG(Servo_AUX7, 0x80); // Calibrate
- packet[6] |= GET_FLAG(Servo_AUX5, 0x40); // Headless
+ packet[5] |= GET_FLAG(CH11_SW, 0x80); // Calibrate
+ packet[6] |= GET_FLAG(CH9_SW, 0x40); // Headless
break;
}
}
diff --git a/Multiprotocol/Hubsan_a7105.ino b/Multiprotocol/Hubsan_a7105.ino
index 09157dc..5f94855 100644
--- a/Multiprotocol/Hubsan_a7105.ino
+++ b/Multiprotocol/Hubsan_a7105.ino
@@ -162,11 +162,11 @@ static void __attribute__((unused)) hubsan_build_packet()
{
packet[9] = 0x02;
// Channel 5
- if(Servo_AUX1) packet[9] |= HUBSAN_FLAG_FLIP;
+ if(CH5_SW) packet[9] |= HUBSAN_FLAG_FLIP;
// Channel 6
- if(Servo_AUX2) packet[9] |= HUBSAN_FLAG_LED;
+ if(CH6_SW) packet[9] |= HUBSAN_FLAG_LED;
// Channel 8
- if(Servo_AUX4) packet[9] |= HUBSAN_FLAG_VIDEO; // H102D
+ if(CH8_SW) packet[9] |= HUBSAN_FLAG_VIDEO; // H102D
}
packet[10] = 0x64;
//const uint32_t txid = 0xdb042679;
@@ -183,10 +183,10 @@ static void __attribute__((unused)) hubsan_build_packet()
}
else
{
- packet[9] = GET_FLAG(Servo_AUX2, FLAG_H301_LED)
- | GET_FLAG(Servo_AUX3, FLAG_H301_STAB)
- | GET_FLAG(Servo_AUX4, FLAG_H301_VIDEO)
- | GET_FLAG(Servo_AUX1, FLAG_H301_RTH);
+ packet[9] = GET_FLAG(CH6_SW, FLAG_H301_LED)
+ | GET_FLAG(CH7_SW, FLAG_H301_STAB)
+ | GET_FLAG(CH8_SW, FLAG_H301_VIDEO)
+ | GET_FLAG(CH5_SW, FLAG_H301_RTH);
}
packet[10] = 0x18; // ?
packet[12] = 0x5c; // ?
@@ -201,27 +201,27 @@ static void __attribute__((unused)) hubsan_build_packet()
if(sub_protocol==H501)
{ // H501S
packet[9] = 0x02
- | GET_FLAG(Servo_AUX2, FLAG_H501_LED)
- | GET_FLAG(Servo_AUX4, FLAG_H501_VIDEO)
- | GET_FLAG(Servo_AUX1, FLAG_H501_RTH)
- | GET_FLAG(Servo_AUX7, FLAG_H501_GPS_HOLD)
- | GET_FLAG(Servo_AUX5, FLAG_H501_HEADLESS1);
+ | GET_FLAG(CH6_SW, FLAG_H501_LED)
+ | GET_FLAG(CH8_SW, FLAG_H501_VIDEO)
+ | GET_FLAG(CH5_SW, FLAG_H501_RTH)
+ | GET_FLAG(CH11_SW, FLAG_H501_GPS_HOLD)
+ | GET_FLAG(CH9_SW, FLAG_H501_HEADLESS1);
//packet[10]= 0x1A;
- packet[13] = GET_FLAG(Servo_AUX6, FLAG_H501_HEADLESS2)
- | GET_FLAG(Servo_AUX8, FLAG_H501_ALT_HOLD)
- | GET_FLAG(Servo_AUX3, FLAG_H501_SNAPSHOT);
+ packet[13] = GET_FLAG(CH10_SW, FLAG_H501_HEADLESS2)
+ | GET_FLAG(CH12_SW, FLAG_H501_ALT_HOLD)
+ | GET_FLAG(CH7_SW, FLAG_H501_SNAPSHOT);
}
else
{ // H107P/C+/D+
packet[9] = 0x06;
//FLIP|LIGHT|PICTURE|VIDEO|HEADLESS
- if(Servo_AUX4) packet[9] |= HUBSAN_FLAG_VIDEO;
- if(Servo_AUX5) packet[9] |= HUBSAN_FLAG_HEADLESS;
+ if(CH8_SW) packet[9] |= HUBSAN_FLAG_VIDEO;
+ if(CH9_SW) packet[9] |= HUBSAN_FLAG_HEADLESS;
packet[10]= 0x19;
packet[12]= 0x5C; // ghost channel ?
packet[13] = 0;
- if(Servo_AUX3) packet[13] = HUBSAN_FLAG_SNAPSHOT;
- if(Servo_AUX1) packet[13] |= HUBSAN_FLAG_FLIP_PLUS;
+ if(CH7_SW) packet[13] = HUBSAN_FLAG_SNAPSHOT;
+ if(CH5_SW) packet[13] |= HUBSAN_FLAG_FLIP_PLUS;
packet[14]= 0x49; // ghost channel ?
}
if(packet_count < 100)
diff --git a/Multiprotocol/KN_nrf24l01.ino b/Multiprotocol/KN_nrf24l01.ino
index 43f5959..40c8f92 100644
--- a/Multiprotocol/KN_nrf24l01.ino
+++ b/Multiprotocol/KN_nrf24l01.ino
@@ -138,19 +138,19 @@ static void __attribute__((unused)) kn_update_packet_control_data()
packet[6] = (value >> 8) & 0xFF;
packet[7] = value & 0xFF;
// Trims, middle is 0x64 (100) range 0-200
- packet[8] = convert_channel_8b_scale(AUX5,0,200); // 0x64; // T
- packet[9] = convert_channel_8b_scale(AUX6,0,200); // 0x64; // A
- packet[10] = convert_channel_8b_scale(AUX7,0,200); // 0x64; // E
+ packet[8] = convert_channel_16b_limit(CH9,0,200); // 0x64; // T
+ packet[9] = convert_channel_16b_limit(CH10,0,200); // 0x64; // A
+ packet[10] = convert_channel_16b_limit(CH11,0,200); // 0x64; // E
packet[11] = 0x64; // R
flags=0;
- if (Servo_AUX1)
+ if (CH5_SW)
flags = KN_FLAG_DR;
- if (Servo_AUX2)
+ if (CH6_SW)
flags |= KN_FLAG_TH;
- if (Servo_AUX3)
+ if (CH7_SW)
flags |= KN_FLAG_IDLEUP;
- if (Servo_AUX4)
+ if (CH8_SW)
flags |= KN_FLAG_GYRO3;
packet[12] = flags;
diff --git a/Multiprotocol/MJXQ_nrf24l01.ino b/Multiprotocol/MJXQ_nrf24l01.ino
index c54d58b..a5f1856 100644
--- a/Multiprotocol/MJXQ_nrf24l01.ino
+++ b/Multiprotocol/MJXQ_nrf24l01.ino
@@ -80,19 +80,19 @@ const uint8_t PROGMEM E010_map_rfchan[][2] = {
#define MJXQ_TILT_UP 0x10
static uint8_t __attribute__((unused)) MJXQ_pan_tilt_value()
{
-// Servo_AUX8 PAN // H26D
-// Servo_AUX9 TILT
+// CH12_SW PAN // H26D
+// CH13_SW TILT
uint8_t pan = 0;
packet_count++;
if(packet_count & MJXQ_PAN_TILT_COUNT)
{
- if(Servo_data[AUX8]>PPM_MAX_COMMAND)
+ if(CH12_SW)
pan=MJXQ_PAN_UP;
- if(Servo_data[AUX8]PPM_MAX_COMMAND)
+ if(CH13_SW)
pan+=MJXQ_TILT_UP;
- if(Servo_data[AUX9]= sizeof(ls_mys_byte))
ls_counter=0;
@@ -125,10 +125,10 @@ static void __attribute__((unused)) MT99XX_send_packet()
}
else
{ // YZ
- packet[0] = convert_channel_8b_scale(THROTTLE,0x00,0x64); // throttle
- packet[1] = convert_channel_8b_scale(RUDDER ,0x64,0x00); // rudder
- packet[2] = convert_channel_8b_scale(ELEVATOR,0x00,0x64); // elevator
- packet[3] = convert_channel_8b_scale(AILERON ,0x64,0x00); // aileron
+ packet[0] = convert_channel_16b_limit(THROTTLE,0x00,0x64); // throttle
+ packet[1] = convert_channel_16b_limit(RUDDER ,0x64,0x00); // rudder
+ packet[2] = convert_channel_16b_limit(ELEVATOR,0x00,0x64); // elevator
+ packet[3] = convert_channel_16b_limit(AILERON ,0x64,0x00); // aileron
if(packet_count++ >= 23)
{
yz_seq_num ++;
@@ -138,11 +138,11 @@ static void __attribute__((unused)) MT99XX_send_packet()
}
packet[4] = yz_p4_seq[yz_seq_num];
packet[5] = 0x02 // expert ? (0=unarmed, 1=normal)
- | GET_FLAG(Servo_AUX4, 0x10) //VIDEO
- | GET_FLAG(Servo_AUX1, 0x80) //FLIP
- | GET_FLAG(Servo_AUX5, 0x04) //HEADLESS
- | GET_FLAG(Servo_AUX3, 0x20); //SNAPSHOT
- packet[6] = GET_FLAG(Servo_AUX2, 0x80); //LED
+ | GET_FLAG(CH8_SW, 0x10) //VIDEO
+ | GET_FLAG(CH5_SW, 0x80) //FLIP
+ | GET_FLAG(CH9_SW, 0x04) //HEADLESS
+ | GET_FLAG(CH7_SW, 0x20); //SNAPSHOT
+ packet[6] = GET_FLAG(CH6_SW, 0x80); //LED
packet[7] = packet[0];
for(uint8_t idx = 1; idx < MT99XX_PACKET_SIZE-2; idx++)
packet[7] += packet[idx];
diff --git a/Multiprotocol/MultiOrange.h b/Multiprotocol/MultiOrange.h
index 19015bf..8bfc365 100644
--- a/Multiprotocol/MultiOrange.h
+++ b/Multiprotocol/MultiOrange.h
@@ -6,54 +6,6 @@
#include
#include
-/*static void protocol_init(void) ;
-static void update_channels_aux(void) ;
-static uint32_t random_id(uint16_t adress, uint8_t create_new) ;
-static void update_serial_data(void) ;
-static void Mprotocol_serial_init(void) ;
-static void update_led_status(void) ;
-static void set_rx_tx_addr(uint32_t id) ;
-uint16_t limit_channel_100(uint8_t ch) ;
-void initTXSerial( uint8_t speed);
-void Serial_write(uint8_t data);
-
-extern void NRF24L01_Reset(void ) ;
-extern void A7105_Reset(void ) ;
-extern void CC2500_Reset(void ) ;
-extern uint8_t CYRF_Reset(void ) ;
-extern void CYRF_SetTxRxMode(uint8_t mode) ;
-
-extern void frskyUpdate(void) ;
-extern uint16_t initDsm2(void) ;
-extern uint16_t ReadDsm2(void) ;
-extern uint16_t DevoInit(void) ;
-extern uint16_t devo_callback(void) ;
-extern uint16_t initJ6Pro(void) ;
-extern uint16_t ReadJ6Pro(void) ;
-extern uint16_t WK_setup(void) ;
-extern uint16_t WK_cb(void) ;
-
-extern void randomSeed(unsigned int seed) ;
-extern long random(long howbig) ;
-extern long map(long x, long in_min, long in_max, long out_min, long out_max) ;
-
-extern uint32_t millis(void) ;
-extern uint32_t micros(void) ;
-extern void delayMicroseconds(uint16_t x) ;
-extern void delayMilliseconds(unsigned long ms) ;
-extern void init(void) ;
-
-extern void modules_reset() ;
-extern uint8_t Update_All() ;
-extern void tx_pause() ;
-extern void tx_resume() ;
-extern void TelemetryUpdate() ;
-extern uint16_t initDsm() ;
-extern uint16_t ReadDsm() ;
-
-extern void setup() ;
-extern void loop() ;
-*/
#define yield()
#define clockCyclesPerMicrosecond() ( F_CPU / 1000000L )
diff --git a/Multiprotocol/Multiprotocol.h b/Multiprotocol/Multiprotocol.h
index dae7b2a..72daf74 100644
--- a/Multiprotocol/Multiprotocol.h
+++ b/Multiprotocol/Multiprotocol.h
@@ -19,7 +19,7 @@
#define VERSION_MAJOR 1
#define VERSION_MINOR 2
#define VERSION_REVISION 0
-#define VERSION_PATCH_LEVEL 5
+#define VERSION_PATCH_LEVEL 7
//******************
// Protocols
//******************
@@ -364,16 +364,18 @@ enum MultiPacketTypes
//*** AUX flags ***
//*******************
#define GET_FLAG(ch, mask) ( ch ? mask : 0)
-#define Servo_AUX1 (Servo_AUX & _BV(0))
-#define Servo_AUX2 (Servo_AUX & _BV(1))
-#define Servo_AUX3 (Servo_AUX & _BV(2))
-#define Servo_AUX4 (Servo_AUX & _BV(3))
-#define Servo_AUX5 (Servo_AUX & _BV(4))
-#define Servo_AUX6 (Servo_AUX & _BV(5))
-#define Servo_AUX7 (Servo_AUX & _BV(6))
-#define Servo_AUX8 (Servo_AUX & _BV(7))
-#define Servo_AUX9 (Servo_data[AUX9 ]>PPM_SWITCH)
-#define Servo_AUX10 (Servo_data[AUX10]>PPM_SWITCH)
+#define CH5_SW (Channel_AUX & _BV(0))
+#define CH6_SW (Channel_AUX & _BV(1))
+#define CH7_SW (Channel_AUX & _BV(2))
+#define CH8_SW (Channel_AUX & _BV(3))
+#define CH9_SW (Channel_AUX & _BV(4))
+#define CH10_SW (Channel_AUX & _BV(5))
+#define CH11_SW (Channel_AUX & _BV(6))
+#define CH12_SW (Channel_AUX & _BV(7))
+#define CH13_SW (Channel_data[CH13]>CHANNEL_SWITCH)
+#define CH14_SW (Channel_data[CH14]>CHANNEL_SWITCH)
+#define CH15_SW (Channel_data[CH15]>CHANNEL_SWITCH)
+#define CH16_SW (Channel_data[CH16]>CHANNEL_SWITCH)
//************************
//*** Power settings ***
diff --git a/Multiprotocol/Multiprotocol.ino b/Multiprotocol/Multiprotocol.ino
index 256dfd3..9d97a4a 100644
--- a/Multiprotocol/Multiprotocol.ino
+++ b/Multiprotocol/Multiprotocol.ino
@@ -75,11 +75,8 @@ uint8_t packet[40];
#define NUM_CHN 16
// Servo data
-uint16_t Servo_data[NUM_CHN];
uint16_t Channel_data[NUM_CHN];
-uint8_t Servo_AUX;
-uint16_t servo_max_100,servo_min_100,servo_max_125,servo_min_125;
-uint16_t servo_mid;
+uint8_t Channel_AUX;
#ifdef FAILSAFE_ENABLE
uint16_t Failsafe_data[NUM_CHN];
#endif
@@ -128,10 +125,10 @@ uint8_t RX_num;
#endif
//Channel mapping for protocols
-const uint8_t CH_AETR[]={AILERON, ELEVATOR, THROTTLE, RUDDER, AUX1, AUX2, AUX3, AUX4, AUX5, AUX6, AUX7, AUX8, AUX9, AUX10};
-const uint8_t CH_TAER[]={THROTTLE, AILERON, ELEVATOR, RUDDER, AUX1, AUX2, AUX3, AUX4, AUX5, AUX6, AUX7, AUX8};
-const uint8_t CH_RETA[]={RUDDER, ELEVATOR, THROTTLE, AILERON, AUX1, AUX2, AUX3, AUX4, AUX5, AUX6, AUX7, AUX8};
-const uint8_t CH_EATR[]={ELEVATOR, AILERON, THROTTLE, RUDDER, AUX1, AUX2, AUX3, AUX4, AUX5, AUX6, AUX7, AUX8};
+const uint8_t CH_AETR[]={AILERON, ELEVATOR, THROTTLE, RUDDER, CH5, CH6, CH7, CH8, CH9, CH10, CH11, CH12, CH13, CH14, CH15, CH16};
+const uint8_t CH_TAER[]={THROTTLE, AILERON, ELEVATOR, RUDDER, CH5, CH6, CH7, CH8, CH9, CH10, CH11, CH12, CH13, CH14, CH15, CH16};
+const uint8_t CH_RETA[]={RUDDER, ELEVATOR, THROTTLE, AILERON, CH5, CH6, CH7, CH8, CH9, CH10, CH11, CH12, CH13, CH14, CH15, CH16};
+const uint8_t CH_EATR[]={ELEVATOR, AILERON, THROTTLE, RUDDER, CH5, CH6, CH7, CH8, CH9, CH10, CH11, CH12, CH13, CH14, CH15, CH16};
// Mode_select variables
uint8_t mode_select;
@@ -362,21 +359,14 @@ void setup()
((MODE_DIAL3_ipr & _BV(MODE_DIAL3_pin)) ? 0 : 4) +
((MODE_DIAL4_ipr & _BV(MODE_DIAL4_pin)) ? 0 : 8);
#endif
+ //mode_select=1;
debugln("Mode switch reads as %d", mode_select);
// Set default channels' value
- for(uint8_t i=0;iCHANNEL_MAX_125) temp_ppm2=CHANNEL_MAX_125;
- Channel_data[i]=temp_ppm2;
-
- temp_ppm>>=1;
- if(temp_ppmPPM_MAX_125) temp_ppm=PPM_MAX_125;
- Servo_data[i]= temp_ppm ;
+ val=map16b(val,PPM_MIN_100*2,PPM_MAX_100*2,CHANNEL_MIN_100,CHANNEL_MAX_100);
+ if(val&0x8000) val=CHANNEL_MIN_125;
+ else if(val>CHANNEL_MAX_125) val=CHANNEL_MAX_125;
+ Channel_data[i]=val;
}
PPM_FLAG_off; // wait for next frame before update
update_channels_aux();
- INPUT_SIGNAL_on; //valid signal received
+ INPUT_SIGNAL_on; // valid signal received
last_signal=millis();
}
#endif //ENABLE_PPM
@@ -624,13 +602,13 @@ uint8_t Update_All()
TelemetryUpdate();
#endif
#ifdef ENABLE_BIND_CH
- if(IS_AUTOBIND_FLAG_on && IS_BIND_CH_PREV_off && Servo_data[BIND_CH-1]>PPM_MAX_COMMAND && Servo_data[THROTTLE]<(servo_min_100+25))
+ if(IS_AUTOBIND_FLAG_on && IS_BIND_CH_PREV_off && Channel_data[BIND_CH-1]>CHANNEL_MAX_COMMAND && Channel_data[THROTTLE]<(CHANNEL_MIN_100+50))
{ // Autobind is on and BIND_CH went up and Throttle is low
CHANGE_PROTOCOL_FLAG_on; //reload protocol
BIND_IN_PROGRESS; //enable bind
BIND_CH_PREV_on;
}
- if(IS_AUTOBIND_FLAG_on && IS_BIND_CH_PREV_on && Servo_data[BIND_CH-1]PPM_SWITCH)
- Servo_AUX|=1<CHANNEL_SWITCH)
+ Channel_AUX|=1<>4)& 0x07; //subprotocol no (0-7) bits 4-6
RX_num=rx_ok_buff[2]& 0x0F; // rx_num bits 0---3
- debugln("New protocol selected: %d, sub proto %d, rxnum %d, option %d", protocol, sub_protocol, RX_num, option);
}
else
if( ((rx_ok_buff[1]&0x80)!=0) && ((cur_protocol[1]&0x80)==0) ) // Bind flag has been set
@@ -1218,10 +1196,7 @@ void update_serial_data()
Failsafe_data[i]=temp; //value range 0..2047, 0=no pulses, 2047=hold
else
#endif
- {
Channel_data[i]=temp; //value range 0..2047, 0=-125%, 2047=+125%
- Servo_data[i]=(temp*5)/8+860; //value range 860<->2140 -125%<->+125%
- }
}
RX_DONOTUPDATE_off;
#ifdef ORANGE_TX
@@ -1710,5 +1685,3 @@ static uint32_t random_id(uint16_t address, uint8_t create_new)
}
}
#endif
-
-
diff --git a/Multiprotocol/Q303_nrf24l01.ino b/Multiprotocol/Q303_nrf24l01.ino
index 2d22eb1..54ba17e 100644
--- a/Multiprotocol/Q303_nrf24l01.ino
+++ b/Multiprotocol/Q303_nrf24l01.ino
@@ -45,7 +45,7 @@ static uint8_t __attribute__((unused)) cx10wd_getButtons()
packet_count++;
}
// auto land
- else if((Servo_data[AUX1] < PPM_MIN_COMMAND) && !(BTN_state & Q303_BTN_DESCEND))
+ else if((Channel_data[CH5]> 2; // 8 bits
@@ -208,10 +208,10 @@ static void __attribute__((unused)) Q303_send_packet(uint8_t bind)
break;
case CX10D:
case CX10WD:
- aileron = convert_channel_16b(AILERON, 2000, 1000);
- elevator = convert_channel_16b(ELEVATOR, 2000, 1000);
- throttle = convert_channel_16b(THROTTLE, 1000, 2000);
- rudder = convert_channel_16b(RUDDER, 1000, 2000);
+ aileron = convert_channel_16b_limit(AILERON, 2000, 1000);
+ elevator = convert_channel_16b_limit(ELEVATOR, 2000, 1000);
+ throttle = convert_channel_16b_limit(THROTTLE, 1000, 2000);
+ rudder = convert_channel_16b_limit(RUDDER, 1000, 2000);
packet[1] = aileron & 0xff;
packet[2] = aileron >> 8;
packet[3] = elevator & 0xff;
@@ -230,21 +230,21 @@ static void __attribute__((unused)) Q303_send_packet(uint8_t bind)
packet[6] = 0x10; // trim(s) ?
packet[7] = 0x10; // trim(s) ?
packet[8] = 0x03 // high rate (0-3)
- | GET_FLAG(Servo_AUX1, 0x40)
- | GET_FLAG(Servo_AUX6, 0x80);
+ | GET_FLAG(CH5_SW, 0x40)
+ | GET_FLAG(CH10_SW, 0x80);
packet[9] = 0x40 // always set
- | GET_FLAG(Servo_AUX5,0x08)
- | GET_FLAG(Servo_AUX2, 0x80)
- | GET_FLAG(Servo_AUX3,0x10)
- | GET_FLAG(Servo_AUX4, 0x01);
- if(Servo_data[AUX7] < PPM_MIN_COMMAND)
+ | GET_FLAG(CH9_SW,0x08)
+ | GET_FLAG(CH6_SW, 0x80)
+ | GET_FLAG(CH7_SW,0x10)
+ | GET_FLAG(CH8_SW, 0x01);
+ if(Channel_data[CH11] < CHANNEL_MIN_COMMAND)
packet[9] |= 0x04; // gimbal down
- else if(Servo_data[AUX7] > PPM_MAX_COMMAND)
+ else if(CH11_SW)
packet[9] |= 0x20; // gimbal up
break;
case CX35:
- slider = convert_channel_16b(AUX7, 731, 342);
+ slider = convert_channel_16b_limit(CH11, 731, 342);
packet[6] = slider >> 2;
packet[7] = ((slider & 3) << 6)
| 0x3e; // ?? 6 bit left (always 111110 ?)
@@ -253,13 +253,13 @@ static void __attribute__((unused)) Q303_send_packet(uint8_t bind)
break;
case CX10D:
- packet[8] |= GET_FLAG(Servo_AUX2, 0x10);
+ packet[8] |= GET_FLAG(CH6_SW, 0x10);
packet[9] = 0x02; // rate (0-2)
packet[10]= cx10wd_getButtons(); // auto land / take off management
break;
case CX10WD:
- packet[8] |= GET_FLAG(Servo_AUX2, 0x10);
+ packet[8] |= GET_FLAG(CH6_SW, 0x10);
packet[9] = 0x02 // rate (0-2)
| cx10wd_getButtons(); // auto land / take off management
packet[10] = 0x00;
diff --git a/Multiprotocol/SFHSS_cc2500.ino b/Multiprotocol/SFHSS_cc2500.ino
index 3847ca1..7f9dbd9 100644
--- a/Multiprotocol/SFHSS_cc2500.ino
+++ b/Multiprotocol/SFHSS_cc2500.ino
@@ -182,7 +182,7 @@ static void __attribute__((unused)) SFHSS_build_data_packet()
#endif
{ //Normal data
for(uint8_t i=0;i<4;i++)
- ch[i] = convert_channel_16b_nolim(CH_AETR[ch_offset+i],2020,1020);
+ ch[i] = convert_channel_16b_nolimit(CH_AETR[ch_offset+i],2020,1020);
}
diff --git a/Multiprotocol/SHENQI_nrf24l01.ino b/Multiprotocol/SHENQI_nrf24l01.ino
index 4f34f4b..ca3d873 100644
--- a/Multiprotocol/SHENQI_nrf24l01.ino
+++ b/Multiprotocol/SHENQI_nrf24l01.ino
@@ -65,7 +65,7 @@ void SHENQI_send_packet()
{
LT8900_SetAddress(rx_tx_addr,4);
packet[1]=255-convert_channel_8b(RUDDER);
- packet[2]=255-convert_channel_8b_scale(THROTTLE,0x60,0xA0);
+ packet[2]=255-convert_channel_16b_limit(THROTTLE,0x60,0xA0);
uint8_t freq=pgm_read_byte_near(&SHENQI_Freq[hopping_frequency_no])+(rx_tx_addr[2]&0x0F);
LT8900_SetChannel(freq);
hopping_frequency_no++;
diff --git a/Multiprotocol/SLT_nrf24l01.ino b/Multiprotocol/SLT_nrf24l01.ino
index 73d2d79..7e8affb 100644
--- a/Multiprotocol/SLT_nrf24l01.ino
+++ b/Multiprotocol/SLT_nrf24l01.ino
@@ -119,8 +119,8 @@ static void __attribute__((unused)) SLT_build_packet()
// Extra bits for AETR
packet[4] = e;
// 8-bit channels
- packet[5] = convert_channel_8b(AUX1);
- packet[6] = convert_channel_8b(AUX2);
+ packet[5] = convert_channel_8b(CH5);
+ packet[6] = convert_channel_8b(CH6);
}
static void __attribute__((unused)) SLT_send_bind_packet()
diff --git a/Multiprotocol/Symax_nrf24l01.ino b/Multiprotocol/Symax_nrf24l01.ino
index 4df3f56..f33a344 100644
--- a/Multiprotocol/Symax_nrf24l01.ino
+++ b/Multiprotocol/Symax_nrf24l01.ino
@@ -66,19 +66,19 @@ static void __attribute__((unused)) SYMAX_read_controls()
flags=0;
// Channel 5
- if (Servo_AUX1)
+ if (CH5_SW)
flags = SYMAX_FLAG_FLIP;
// Channel 6
- if (Servo_AUX2)
+ if (CH6_SW)
flags |= SYMAX_XTRM_RATES;
// Channel 7
- if (Servo_AUX3)
+ if (CH7_SW)
flags |= SYMAX_FLAG_PICTURE;
// Channel 8
- if (Servo_AUX4)
+ if (CH8_SW)
flags |= SYMAX_FLAG_VIDEO;
// Channel 9
- if (Servo_AUX5)
+ if (CH9_SW)
{
flags |= SYMAX_FLAG_HEADLESS;
flags &= ~SYMAX_XTRM_RATES; // Extended rates & headless incompatible
diff --git a/Multiprotocol/TX_Def.h b/Multiprotocol/TX_Def.h
index b629fca..2a342c6 100644
--- a/Multiprotocol/TX_Def.h
+++ b/Multiprotocol/TX_Def.h
@@ -46,22 +46,15 @@
#define PPM_MIN_125 900 // 125%
#endif
-//Serial MIN MAX values
-#define SERIAL_MAX_100 2012 // 100%
-#define SERIAL_MIN_100 988 // 100%
-#define SERIAL_MAX_125 2140 // 125%
-#define SERIAL_MIN_125 860 // 125%
-
//Channel MIN MAX values
#define CHANNEL_MAX_100 1844 // 100%
#define CHANNEL_MIN_100 204 // 100%
#define CHANNEL_MAX_125 2047 // 125%
#define CHANNEL_MIN_125 0 // 125%
-//PPM values used to compare
-#define PPM_MIN_COMMAND 1250
-#define PPM_SWITCH 1550
-#define PPM_MAX_COMMAND 1750
+#define CHANNEL_MIN_COMMAND 784 // 1350us
+#define CHANNEL_SWITCH 1104 // 1550us
+#define CHANNEL_MAX_COMMAND 1424 // 1750us
//Channel definitions
#ifdef AETR
@@ -212,15 +205,19 @@
#define RUDDER 0
#endif
-#define AUX1 4
-#define AUX2 5
-#define AUX3 6
-#define AUX4 7
-#define AUX5 8
-#define AUX6 9
-#define AUX7 10
-#define AUX8 11
-#define AUX9 12
-#define AUX10 13
-#define AUX11 14
-#define AUX12 15
+#define CH1 0
+#define CH2 1
+#define CH3 2
+#define CH4 3
+#define CH5 4
+#define CH6 5
+#define CH7 6
+#define CH8 7
+#define CH9 8
+#define CH10 9
+#define CH11 10
+#define CH12 11
+#define CH13 12
+#define CH14 13
+#define CH15 14
+#define CH16 15
diff --git a/Multiprotocol/V2X2_nrf24l01.ino b/Multiprotocol/V2X2_nrf24l01.ino
index d9a84a8..9a34185 100644
--- a/Multiprotocol/V2X2_nrf24l01.ino
+++ b/Multiprotocol/V2X2_nrf24l01.ino
@@ -173,31 +173,31 @@ static void __attribute__((unused)) V2X2_send_packet(uint8_t bind)
//Flags
flags=0;
// Channel 5
- if (Servo_AUX1) flags = V2X2_FLAG_FLIP;
+ if (CH5_SW) flags = V2X2_FLAG_FLIP;
// Channel 6
- if (Servo_AUX2) flags |= V2X2_FLAG_LIGHT;
+ if (CH6_SW) flags |= V2X2_FLAG_LIGHT;
// Channel 7
- if (Servo_AUX3) flags |= V2X2_FLAG_CAMERA;
+ if (CH7_SW) flags |= V2X2_FLAG_CAMERA;
// Channel 8
- if (Servo_AUX4) flags |= V2X2_FLAG_VIDEO;
+ if (CH8_SW) flags |= V2X2_FLAG_VIDEO;
//Flags2
// Channel 9
- if (Servo_AUX5)
+ if (CH9_SW)
flags2 = V2X2_FLAG_HEADLESS;
if(sub_protocol==JXD506)
{
// Channel 11
- if (Servo_AUX7)
+ if (CH11_SW)
flags2 |= V2X2_FLAG_EMERGENCY;
}
else
{
// Channel 10
- if (Servo_AUX6)
+ if (CH10_SW)
flags2 |= V2X2_FLAG_MAG_CAL_X;
// Channel 11
- if (Servo_AUX7)
+ if (CH11_SW)
flags2 |= V2X2_FLAG_MAG_CAL_Y;
}
}
@@ -213,12 +213,12 @@ static void __attribute__((unused)) V2X2_send_packet(uint8_t bind)
if(sub_protocol==JXD506)
{
// Channel 10
- if (Servo_AUX6)
+ if (CH10_SW)
packet[11] = V2X2_FLAG_START_STOP;
// Channel 12
- if(Servo_data[AUX8] > PPM_MAX_COMMAND)
+ if(CH12_SW)
packet[11] |= V2X2_FLAG_CAMERA_UP;
- else if(Servo_data[AUX8] < PPM_MIN_COMMAND)
+ else if(Channel_data[CH12] < CHANNEL_MIN_COMMAND)
packet[11] |= V2X2_FLAG_CAMERA_DN;
packet[12] = 0x40;
packet[13] = 0x40;
diff --git a/Multiprotocol/WK2x01_cyrf6936.ino b/Multiprotocol/WK2x01_cyrf6936.ino
index 58aadb8..614a67a 100644
--- a/Multiprotocol/WK2x01_cyrf6936.ino
+++ b/Multiprotocol/WK2x01_cyrf6936.ino
@@ -79,7 +79,7 @@ static void __attribute__((unused)) WK_build_bind_pkt(const uint8_t *init)
static int16_t __attribute__((unused)) WK_get_channel(uint8_t ch, int32_t scale, int16_t center, int16_t range)
{
- int16_t value = map(Servo_data[CH_AETR[ch]],servo_min_100,servo_max_100,-scale,scale)+center;
+ int16_t value = convert_channel_16b_nolimit(CH_AETR[ch],-scale,scale)+center;
if (value < center - range) value = center - range;
if (value > center + range) value = center + range;
return value;
diff --git a/Multiprotocol/YD717_nrf24l01.ino b/Multiprotocol/YD717_nrf24l01.ino
index 3af6e44..2fdeda4 100644
--- a/Multiprotocol/YD717_nrf24l01.ino
+++ b/Multiprotocol/YD717_nrf24l01.ino
@@ -87,15 +87,15 @@ static void __attribute__((unused)) yd717_send_packet(uint8_t bind)
// Flags
flags=0;
// Channel 5
- if (Servo_AUX1) flags = YD717_FLAG_FLIP;
+ if (CH5_SW) flags = YD717_FLAG_FLIP;
// Channel 6
- if (Servo_AUX2) flags |= YD717_FLAG_LIGHT;
+ if (CH6_SW) flags |= YD717_FLAG_LIGHT;
// Channel 7
- if (Servo_AUX3) flags |= YD717_FLAG_PICTURE;
+ if (CH7_SW) flags |= YD717_FLAG_PICTURE;
// Channel 8
- if (Servo_AUX4) flags |= YD717_FLAG_VIDEO;
+ if (CH8_SW) flags |= YD717_FLAG_VIDEO;
// Channel 9
- if (Servo_AUX5) flags |= YD717_FLAG_HEADLESS;
+ if (CH9_SW) flags |= YD717_FLAG_HEADLESS;
packet[7] = flags;
}