Fin d'ajout du WK2X01

This commit is contained in:
tipouic 2016-02-14 09:21:52 +01:00
parent 37bfd96bb8
commit bdb8eec3ea
8 changed files with 134 additions and 130 deletions

View File

@ -31,7 +31,7 @@ static const uint8_t sopcode[8] = {
static const uint8_t fail_map[8] = {2, 1, 0, 3, 4, 5, 6, 7}; static const uint8_t fail_map[8] = {2, 1, 0, 3, 4, 5, 6, 7};
static uint8_t wk_pkt_num; static uint8_t wk_pkt_num;
static u8 *radio_ch_ptr; static uint8_t *radio_ch_ptr;
static uint16_t WK_BIND_COUNTer; static uint16_t WK_BIND_COUNTer;
static uint8_t last_beacon; static uint8_t last_beacon;
/* /*
@ -41,11 +41,11 @@ static const char * const wk2601_opts[] = {
_tr_noop("COL Limit"), "-100", "100", NULL, _tr_noop("COL Limit"), "-100", "100", NULL,
NULL NULL
}; };
*/
#define WK2601_OPT_CHANMODE 0 #define WK2601_OPT_CHANMODE 0
#define WK2601_OPT_PIT_INV 1 #define WK2601_OPT_PIT_INV 1
#define WK2601_OPT_PIT_LIMIT 2 #define WK2601_OPT_PIT_LIMIT 2
#define LAST_PROTO_OPT 3 #define LAST_PROTO_OPT 3
*/
static void add_pkt_crc(uint8_t init) { static void add_pkt_crc(uint8_t init) {
uint8_t add = init; uint8_t add = init;
@ -177,14 +177,14 @@ static void channels_heli_2601(int frame, int *v1, int *v2) {
//pitch is controlled by rx //pitch is controlled by rx
//we can only control fmode, pit-reverse and pit/thr rate //we can only control fmode, pit-reverse and pit/thr rate
int pit_rev = 0; int pit_rev = 0;
if (Model.proto_opts[WK2601_OPT_PIT_INV]) { pit_rev = 1; } if ((option/10)%10) { pit_rev = 1; }
uint16_t pit_rate = get_channel(5, 0x400, 0, 0x400); uint16_t pit_rate = get_channel(5, 0x400, 0, 0x400);
int fmode = 1; int fmode = 1;
if (pit_rate < 0) { pit_rate = -pit_rate; fmode = 0; } if (pit_rate < 0) { pit_rate = -pit_rate; fmode = 0; }
if (frame == 1) { if (frame == 1) {
//Pitch curve and range //Pitch curve and range
*v1 = pit_rate; *v1 = pit_rate;
*v2 = Model.proto_opts[WK2601_OPT_PIT_LIMIT] * 0x400 / 100 + 0x400; *v2 = ((option/100) ? -100 : 100) * 0x400 / 100 + 0x400;
} }
packet[7] = (pit_rev << 2); //reverse bits packet[7] = (pit_rev << 2); //reverse bits
packet[8] = fmode ? 0x02 : 0x00; packet[8] = fmode ? 0x02 : 0x00;
@ -207,8 +207,8 @@ static void build_data_pkt_2601() {
v1 = get_channel(6, 0x200, 0x200, 0x200); v1 = get_channel(6, 0x200, 0x200, 0x200);
v2 = 0; v2 = 0;
} }
if (Model.proto_opts[WK2601_OPT_CHANMODE] == 1) { channels_heli_2601(frame, &v1, &v2); } if (option%10 == 1) { channels_heli_2601(frame, &v1, &v2); }
else if (Model.proto_opts[WK2601_OPT_CHANMODE] == 2) { channels_6plus1_2601(frame, &v1, &v2); } else if (option%10 == 2) { channels_6plus1_2601(frame, &v1, &v2); }
else { channels_5plus1_2601(frame, &v1, &v2); } else { channels_5plus1_2601(frame, &v1, &v2); }
if (v1 > 1023) { v1 = 1023; } if (v1 > 1023) { v1 = 1023; }
if (v2 > 1023) { v2 = 1023; } if (v2 > 1023) { v2 = 1023; }

View File

@ -24,7 +24,7 @@
#include <avr/eeprom.h> #include <avr/eeprom.h>
#include <avr/pgmspace.h> #include <avr/pgmspace.h>
#include <util/delay.h> #include <util/delay.h>
#include "multiprotocol.h" #include "Multiprotocol.h"
//Multiprotocol module configuration file //Multiprotocol module configuration file
#include "_Config.h" #include "_Config.h"

View File

@ -23,21 +23,11 @@
#define FY326_SIZE 15 #define FY326_SIZE 15
#define FY326_BIND_COUNT 16 #define FY326_BIND_COUNT 16
static const char * const fy326_opts[] = {
_tr_noop("Expert"), _tr_noop("On"), _tr_noop("Off"), NULL,
NULL
};
#define EXPERT_ON 0
#define EXPERT_OFF 1
#define CHANNEL_FLIP AUX1 #define CHANNEL_FLIP AUX1
#define CHANNEL_HEADLESS AUX2 #define CHANNEL_HEADLESS AUX2
#define CHANNEL_RTH AUX3 #define CHANNEL_RTH AUX3
#define CHANNEL_CALIBRATE AUX4 #define CHANNEL_CALIBRATE AUX4
#define CHANNEL_EXPERT AUX5
static uint8_t tx_power;
static uint8_t packet[FY326_SIZE];
// frequency channel management // frequency channel management
#define RF_BIND_CHANNEL 0x17 #define RF_BIND_CHANNEL 0x17
@ -51,24 +41,27 @@ enum {
FY326_INIT1 = 0, FY326_INIT1 = 0,
FY326_BIND1, FY326_BIND1,
FY326_BIND2, FY326_BIND2,
FY326_DATA FY326_DATA,
FY319_INIT1,
FY319_BIND1,
FY319_BIND2,
}; };
// Bit vector from bit position // Bit vector from bit position
#define BV(bit) (1 << bit) #define BV(bit) (1 << bit)
#define CHAN_RANGE (CHAN_MAX_VALUE - CHAN_MIN_VALUE) #define CHAN_RANGE (PPM_MAX - PPM_MIN)
static uint8_t scale_channel(uint8_t ch, uint8_t destMin, uint8_t destMax) static uint8_t scale_channel(uint8_t ch, uint8_t destMin, uint8_t destMax)
{ {
uint32_t chanval = Channels[ch]; uint32_t chanval = Servo_data[ch];
uint32_t range = destMax - destMin; uint32_t range = destMax - destMin;
if (chanval < CHAN_MIN_VALUE) chanval = CHAN_MIN_VALUE; if (chanval < PPM_MIN) chanval = PPM_MIN;
else if (chanval > CHAN_MAX_VALUE) chanval = CHAN_MAX_VALUE; else if (chanval > PPM_MAX) chanval = PPM_MAX;
return (range * (chanval - CHAN_MIN_VALUE)) / CHAN_RANGE + destMin; return (range * (chanval - PPM_MIN)) / CHAN_RANGE + destMin;
} }
#define GET_FLAG(ch, mask) (Channels[ch] > 0 ? mask : 0) #define GET_FLAG(ch, mask) (Servo_data[ch] > PPM_MIN_COMMAND ? mask : 0)
#define CHAN_TO_TRIM(chanval) ((uint8_t)(((uint16_t)chanval/10)-10)) // scale to [-10,10]. [-20,20] caused problems. #define CHAN_TO_TRIM(chanval) ((uint8_t)(((uint16_t)chanval/10)-10)) // scale to [-10,10]. [-20,20] caused problems.
static void send_packet(uint8_t bind) static void send_packet(uint8_t bind)
{ {
@ -80,15 +73,22 @@ static void send_packet(uint8_t bind)
| GET_FLAG(CHANNEL_RTH, 0x40) | GET_FLAG(CHANNEL_RTH, 0x40)
| GET_FLAG(CHANNEL_FLIP, 0x02) | GET_FLAG(CHANNEL_FLIP, 0x02)
| GET_FLAG(CHANNEL_CALIBRATE, 0x01) | GET_FLAG(CHANNEL_CALIBRATE, 0x01)
| (Model.proto_opts[PROTOOPTS_EXPERT] == EXPERT_ON ? 4 : 0); | GET_FLAG(CHANNEL_EXPERT, 4);
} }
packet[2] = 200 - scale_channel(AILERON, 0, 200); // aileron packet[2] = 200 - scale_channel(AILERON, 0, 200); // aileron
packet[3] = scale_channel(ELEVATOR, 0, 200); // elevator packet[3] = scale_channel(ELEVATOR, 0, 200); // elevator
packet[4] = 200 - scale_channel(RUDDER, 0, 200); // rudder packet[4] = 200 - scale_channel(RUDDER, 0, 200); // rudder
packet[5] = scale_channel(THROTTLE, 0, 200); // throttle packet[5] = scale_channel(THROTTLE, 0, 200); // throttle
packet[6] = txid[0]; if(sub_protocol == FY319) {
packet[7] = txid[1]; packet[6] = 255 - scale_channel(CHANNEL1, 0, 255);
packet[8] = txid[2]; packet[7] = scale_channel(CHANNEL2, 0, 255);
packet[8] = 255 - scale_channel(CHANNEL4, 0, 255);
}
else {
packet[6] = txid[0];
packet[7] = txid[1];
packet[8] = txid[2];
}
packet[9] = CHAN_TO_TRIM(packet[2]); // aileron_trim; packet[9] = CHAN_TO_TRIM(packet[2]); // aileron_trim;
packet[10] = CHAN_TO_TRIM(packet[3]); // elevator_trim; packet[10] = CHAN_TO_TRIM(packet[3]); // elevator_trim;
packet[11] = CHAN_TO_TRIM(packet[4]); // rudder_trim; packet[11] = CHAN_TO_TRIM(packet[4]); // rudder_trim;
@ -108,25 +108,18 @@ static void send_packet(uint8_t bind)
NRF24L01_FlushTx(); NRF24L01_FlushTx();
NRF24L01_WritePayload(packet, FY326_SIZE); NRF24L01_WritePayload(packet, FY326_SIZE);
// Check and adjust transmission power. We do this after
// transmission to not bother with timeout after power
// settings change - we have plenty of time until next
// packet.
if (tx_power != Model.tx_power) {
//Keep transmit power updated
tx_power = Model.tx_power;
NRF24L01_SetPower(tx_power);
}
} }
static void fy326_init() static void fy326_init()
{ {
const uint8_t rx_tx_addr[] = {0x15, 0x59, 0x23, 0xc6, 0x29}; uint8_t rx_tx_addr[] = {0x15, 0x59, 0x23, 0xc6, 0x29};
NRF24L01_Initialize(); NRF24L01_Initialize();
NRF24L01_SetTxRxMode(TX_EN); NRF24L01_SetTxRxMode(TX_EN);
NRF24L01_WriteReg(NRF24L01_03_SETUP_AW, 0x01); // Three-byte rx/tx address if(sub_protocol == FY319)
NRF24L01_WriteReg(NRF24L01_03_SETUP_AW, 0x03); // Five-byte rx/tx address
else
NRF24L01_WriteReg(NRF24L01_03_SETUP_AW, 0x01); // Three-byte rx/tx address
NRF24L01_WriteRegisterMulti(NRF24L01_10_TX_ADDR, rx_tx_addr, sizeof(rx_tx_addr)); NRF24L01_WriteRegisterMulti(NRF24L01_10_TX_ADDR, rx_tx_addr, sizeof(rx_tx_addr));
NRF24L01_WriteRegisterMulti(NRF24L01_0A_RX_ADDR_P0, rx_tx_addr, sizeof(rx_tx_addr)); NRF24L01_WriteRegisterMulti(NRF24L01_0A_RX_ADDR_P0, rx_tx_addr, sizeof(rx_tx_addr));
NRF24L01_FlushTx(); NRF24L01_FlushTx();
@ -137,7 +130,7 @@ static void fy326_init()
NRF24L01_WriteReg(NRF24L01_11_RX_PW_P0, FY326_SIZE); NRF24L01_WriteReg(NRF24L01_11_RX_PW_P0, FY326_SIZE);
NRF24L01_WriteReg(NRF24L01_05_RF_CH, RF_BIND_CHANNEL); NRF24L01_WriteReg(NRF24L01_05_RF_CH, RF_BIND_CHANNEL);
NRF24L01_SetBitrate(NRF24L01_BR_250K); NRF24L01_SetBitrate(NRF24L01_BR_250K);
NRF24L01_SetPower(Model.tx_power); NRF24L01_SetPower();
NRF24L01_Activate(0x73); NRF24L01_Activate(0x73);
NRF24L01_WriteReg(NRF24L01_1C_DYNPD, 0x3f); NRF24L01_WriteReg(NRF24L01_1C_DYNPD, 0x3f);
@ -146,9 +139,51 @@ static void fy326_init()
static uint16_t fy326_callback() static uint16_t fy326_callback()
{ {
uint8_t i;
switch (phase) { switch (phase) {
case FY319_INIT1:
NRF24L01_SetTxRxMode(TXRX_OFF);
NRF24L01_FlushRx();
NRF24L01_SetTxRxMode(RX_EN);
NRF24L01_WriteReg(NRF24L01_05_RF_CH, RF_BIND_CHANNEL);
phase = FY319_BIND1;
BIND_IN_PROGRESS;
return PACKET_CHKTIME;
break;
case FY319_BIND1:
if(NRF24L01_ReadReg(NRF24L01_07_STATUS) & BV(NRF24L01_07_RX_DR)) {
NRF24L01_ReadPayload(packet, FY326_SIZE);
rxid = packet[13];
packet[0] = txid[3];
packet[1] = 0x80;
packet[14]= txid[4];
bind_counter = BIND_COUNT;
NRF24L01_SetTxRxMode(TXRX_OFF);
NRF24L01_SetTxRxMode(TX_EN);
NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x70);
NRF24L01_FlushTx();
bind_counter = 255;
for(i=2; i<6; i++)
packet[i] = rf_chans[0];
phase = FY319_BIND2;
}
return PACKET_CHKTIME;
break;
case FY319_BIND2:
NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x70);
NRF24L01_FlushTx();
NRF24L01_WritePayload(packet, FY326_SIZE);
if(bind_counter == 250)
packet[1] = 0x40;
if(--bind_counter == 0) {
BIND_DONE;
phase = FY326_DATA;
}
break;
case FY326_INIT1: case FY326_INIT1:
MUSIC_Play(MUSIC_TELEMALARM1);
bind_counter = FY326_BIND_COUNT; bind_counter = FY326_BIND_COUNT;
phase = FY326_BIND2; phase = FY326_BIND2;
send_packet(1); send_packet(1);
@ -156,19 +191,13 @@ static uint16_t fy326_callback()
break; break;
case FY326_BIND1: case FY326_BIND1:
#ifdef EMULATOR
if (1) {
packet[13] = 0x7e;
#else
if( NRF24L01_ReadReg(NRF24L01_07_STATUS) & BV(NRF24L01_07_RX_DR)) { // RX fifo data ready if( NRF24L01_ReadReg(NRF24L01_07_STATUS) & BV(NRF24L01_07_RX_DR)) { // RX fifo data ready
NRF24L01_ReadPayload(packet, FY326_SIZE); NRF24L01_ReadPayload(packet, FY326_SIZE);
#endif
rxid = packet[13]; rxid = packet[13];
txid[0] = 0xaa; txid[0] = 0xaa;
NRF24L01_SetTxRxMode(TXRX_OFF); NRF24L01_SetTxRxMode(TXRX_OFF);
NRF24L01_SetTxRxMode(TX_EN); NRF24L01_SetTxRxMode(TX_EN);
PROTOCOL_SetBindState(0); BIND_DONE;
MUSIC_Play(MUSIC_DONE_BINDING);
phase = FY326_DATA; phase = FY326_DATA;
} else if (bind_counter-- == 0) { } else if (bind_counter-- == 0) {
bind_counter = FY326_BIND_COUNT; bind_counter = FY326_BIND_COUNT;
@ -181,11 +210,7 @@ static uint16_t fy326_callback()
break; break;
case FY326_BIND2: case FY326_BIND2:
#ifdef EMULATOR
if (1) {
#else
if( NRF24L01_ReadReg(NRF24L01_07_STATUS) & BV(NRF24L01_07_TX_DS)) { // TX data sent if( NRF24L01_ReadReg(NRF24L01_07_STATUS) & BV(NRF24L01_07_TX_DS)) { // TX data sent
#endif
// switch to RX mode // switch to RX mode
NRF24L01_SetTxRxMode(TXRX_OFF); NRF24L01_SetTxRxMode(TXRX_OFF);
NRF24L01_FlushRx(); NRF24L01_FlushRx();
@ -210,7 +235,7 @@ static void fy_txid()
txid[1] = ((MProtocol_id_master >> 16) & 0xFF); txid[1] = ((MProtocol_id_master >> 16) & 0xFF);
txid[2] = (MProtocol_id_master >> 8) & 0xFF; txid[2] = (MProtocol_id_master >> 8) & 0xFF;
txid[3] = MProtocol_id_master & 0xFF; txid[3] = MProtocol_id_master & 0xFF;
for (uint8_t i = 0; i < sizeof(MProtocol_id_master); ++i) rand32_r(&MProtocol_id_master, 0); // for (uint8_t i = 0; i < sizeof(MProtocol_id_master); ++i) rand32_r(&MProtocol_id_master, 0);
txid[4] = MProtocol_id_master & 0xFF; txid[4] = MProtocol_id_master & 0xFF;
rf_chans[0] = txid[0] & 0x0F; rf_chans[0] = txid[0] & 0x0F;
@ -218,14 +243,21 @@ static void fy_txid()
rf_chans[2] = 0x20 + (txid[1] & 0x0F); rf_chans[2] = 0x20 + (txid[1] & 0x0F);
rf_chans[3] = 0x30 + (txid[1] >> 4); rf_chans[3] = 0x30 + (txid[1] >> 4);
rf_chans[4] = 0x40 + (txid[2] >> 4); rf_chans[4] = 0x40 + (txid[2] >> 4);
if(sub_protocol == FY319) {
for(uint8_t i=0; i<5; i++)
rf_chans[i] = txid[0] & ~0x80;
}
} }
static uint16_t FY326_setup() static uint16_t FY326_setup()
{ {
BIND_IN_PROGRESS; BIND_IN_PROGRESS;
tx_power = Model.tx_power;
rxid = 0xaa; rxid = 0xaa;
phase = FY326_INIT1; if(sub_protocol == FY319)
phase = FY319_INIT1;
else
phase = FY326_INIT1;
bind_counter = FY326_BIND_COUNT; bind_counter = FY326_BIND_COUNT;
fy_txid(); fy_txid();
fy326_init(); fy326_init();

View File

@ -48,7 +48,7 @@
#endif #endif
#ifdef CYRF6936_INSTALLED #ifdef CYRF6936_INSTALLED
#define J6PRO_CYRF6936_INO #define J6PRO_CYRF6936_INO
// #define WK2x01_CYRF6936_INO #define WK2x01_CYRF6936_INO
#define DEVO_CYRF6936_INO #define DEVO_CYRF6936_INO
#define DSM2_CYRF6936_INO #define DSM2_CYRF6936_INO
@ -61,6 +61,7 @@
#define HM830_NRF24L01_INO #define HM830_NRF24L01_INO
#define CFlie_NRF24L01_INO #define CFlie_NRF24L01_INO
#define H377_NRF24L01_INO #define H377_NRF24L01_INO
#define FY326_NRF24L01_INO
#define BAYANG_NRF24L01_INO #define BAYANG_NRF24L01_INO
#define CG023_NRF24L01_INO #define CG023_NRF24L01_INO

View File

@ -1,65 +0,0 @@
MODE_SERIAL = 0, // Serial / Manche commands
MODE_FLYSKY = 1, // =>A7105 { Flysky=0, V9X9=1, V6X6=2, V912=3 };
MODE_HUBSAN = 2, // =>A7105
MODE_CG023 = 3, // =>NRF24L01 { CG023 = 0, YD829 = 1, H8_3D = 2 };
MODE_CX10 = 4, // =>NRF24L01 { CX10_GREEN = 0, DM007=2, CX10_BLUE=1, // also compatible with CX10-A, CX12 };
MODE_HISKY = 6, // =>NRF24L01 { Hisky=0, HK310=1 };
MODE_DSM2 = 6, // =>CYRF6936 { DSM2=0, DSMX=1};
MODE_DEVO =7, // =>CYRF6936
MODE_YD717 = 8, // =>NRF24L01 { YD717=0, SKYWLKR=1, SYMAX2=2, XINXUN=3, NIHUI=4 };
MODE_KN = 9, // =>NRF24L01
MODE_SYMAX = 10, // =>NRF24L01 { SYMAX=0, SYMAX5C=1, };
MODE_SLT = 11, // =>NRF24L01
MODE_V2X2 = 12, // =>NRF24L01
MODE_BAYANG = 13, // =>NRF24L01
MODE_FRSKY = 14, // =>CC2500
= 15, // =>
BAYANG
AUX1 FLIP
AUX2 HEADLESS
AUX3 RTH
AUX4 SNAPSHOT
AUX5 VIDEO
CG023
AUX1 FLIP
AUX2 LED
AUX3 STILL
AUX4 VIDEO
AUX5 EASY
CX10
AUX1 FLIP
AUX2 mode 1-2-3 (headless on CX-10A)
AUX3 SNAPSHOT
AUX4 VIDEO
AUX5 HEADLESS
HUBSAN
AUX1 FLIP
AUX2 LED
AUX3 VIDEO
KN
AUX1 Dual rate
AUX2 Throttle Hold
AUX3 Idle up
AUX4 Gyro
V2X2
AUX1 FLIP
AUX2 LED
AUX3 CAMERA
AUX4 VIDEO
AUX5 HEADLESS
AUX6 MAG_CAL_X
AUX7 MAG_CAL_Y
YD717
AUX1 FLIP
AUX2 LED
AUX3 PICTURE
AUX4 VIDEO
AUX5 HEADLESS

View File

@ -14,9 +14,6 @@
*/ */
// Check selected board type // Check selected board type
#ifndef ARDUINO_AVR_PRO
// #error You must select the board type "Arduino Pro or Pro Mini"
#endif
#if F_CPU != 16000000L || not defined(__AVR_ATmega328P__) #if F_CPU != 16000000L || not defined(__AVR_ATmega328P__)
#error You must select the processor type "ATmega328(5V, 16MHz)" #error You must select the processor type "ATmega328(5V, 16MHz)"
#endif #endif
@ -118,12 +115,18 @@ enum MJXQ
X800 = 2, X800 = 2,
H26D = 3 H26D = 3
}; };
enum WK2X01 enum WK2X01
{ {
WK2801 = 0, WK2801 = 0,
WK2601 = 1, WK2601 = 1,
WK2401 = 2 WK2401 = 2
}; };
enum FY326
{
FY326 = 0,
FY319 = 1
};
#define NONE 0 #define NONE 0
#define P_HIGH 1 #define P_HIGH 1

View File

@ -38,7 +38,36 @@ CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12
###WK2x01 ###WK2x01
Autobind Autobind
En cours ... ####Sub_protocol WK2401
CH1|CH2|CH3|CH4
---|---|---|---
CH1|CH2|CH3|CH4
####Sub_protocol WK2601
Option:
0 = 5+1
2 = 6+1
..1 = Hélicoptère (. = autres options pour ce mode)
.01 = Hélicoptère normal
.11 = Hélicoptère avec pit inversé
0.1 = Pitch curve -100
1.1 = Pitch curve 100
CH1|CH2|CH3|CH4|CH5|CH6|CH7
---|---|---|---|---|---|---
CH1|CH2|CH3|CH4|???|CONF|Gyro & Rudder mix
CONF: Option 1 = Rate Throtle
Option 2 = Pitch
####Sub_protocol WK2801
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8
---|---|---|---|---|---|---|---
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8
##A7105 RF Module ##A7105 RF Module
###Joysway ###Joysway
@ -59,9 +88,12 @@ A|E|T|R
###Fy326 ###Fy326
Autobind Autobind
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9
---|---|---|---|---|---|---|--- ---|---|---|---|---|---|---|---|---
A|E|T|R|FLIP|HEADLESS|RTH|Calibrate A|E|T|R|FLIP|HEADLESS|RTH|Calibrate|Expert
####Sub_protocol FY319
Same channels assignement as above.
###H377 ###H377
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8
@ -77,3 +109,4 @@ CH1|CH2|CH3|CH4|CH5
---|---|---|--- ---|---|---|---
A|Turbo|T|Trim|Bouton ??? A|Turbo|T|Trim|Bouton ???
###D'autres à venir

Binary file not shown.