mirror of
https://github.com/pascallanger/DIY-Multiprotocol-TX-Module.git
synced 2025-11-26 05:59:41 +00:00
Compare commits
39 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4bc08d22b8 | ||
|
|
96fb3b20b7 | ||
|
|
47f713c6c8 | ||
|
|
443c7a6b99 | ||
|
|
e79ca9b7d7 | ||
|
|
b94f774f80 | ||
|
|
5614e8bef6 | ||
|
|
4ce3a5d298 | ||
|
|
f6de3de78c | ||
|
|
8099018132 | ||
|
|
360dde2e1b | ||
|
|
cc7b7638d3 | ||
|
|
321e4aee34 | ||
|
|
f18847df57 | ||
|
|
a2559a65d3 | ||
|
|
5ac41fdd15 | ||
|
|
6d38dd2d7a | ||
|
|
667058269c | ||
|
|
ad6f934892 | ||
|
|
714220c349 | ||
|
|
4887fca873 | ||
|
|
cfe80edcb6 | ||
|
|
484588ff6b | ||
|
|
1bb059c2a2 | ||
|
|
ef5d9cb6b3 | ||
|
|
37a06c050d | ||
|
|
5f0ed395ba | ||
|
|
ae27c8b671 | ||
|
|
088bfb9c2f | ||
|
|
b01462e36b | ||
|
|
abd36dc6a4 | ||
|
|
ebb8a33c1a | ||
|
|
2b0f663482 | ||
|
|
956e632392 | ||
|
|
90b6bb8f7d | ||
|
|
6153e84abf | ||
|
|
16357f29e9 | ||
|
|
0b8a5a7539 | ||
|
|
6874e3a6a7 |
160
.github/workflows/main.yml
vendored
Normal file
160
.github/workflows/main.yml
vendored
Normal file
@@ -0,0 +1,160 @@
|
||||
# Workflow for testing MULTI-Module firmware builds
|
||||
|
||||
name: CI
|
||||
|
||||
on:
|
||||
# Trigger the workflow on pushes, except those that are tagged (avoids double-testing releases)
|
||||
push:
|
||||
branches:
|
||||
- '**'
|
||||
tags-ignore:
|
||||
- '**'
|
||||
|
||||
# Trigger the workflow on pull requests to the master branch
|
||||
pull_request:
|
||||
branches:
|
||||
- master
|
||||
|
||||
# Triggers the workflow on release creation
|
||||
release:
|
||||
types:
|
||||
- created
|
||||
|
||||
# Allows the workflow to be triggered manually from the Actions tab
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
# Configure the board matrix
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
board: [
|
||||
"multi4in1:avr:multiatmega328p:bootloader=none",
|
||||
"multi4in1:avr:multiatmega328p:bootloader=optiboot",
|
||||
"multi4in1:avr:multixmega32d4",
|
||||
"multi4in1:STM32F1:multi5in1t18int",
|
||||
"multi4in1:STM32F1:multistm32f103cb:debug_option=none",
|
||||
"multi4in1:STM32F1:multistm32f103cb:debug_option=native",
|
||||
"multi4in1:STM32F1:multistm32f103cb:debug_option=ftdi",
|
||||
"multi4in1:STM32F1:multistm32f103c8:debug_option=none"
|
||||
]
|
||||
|
||||
# Set the environment variables
|
||||
env:
|
||||
BOARD: ${{ matrix.board }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
- name: Install Arduino CLI
|
||||
uses: arduino/setup-arduino-cli@v1.1.1
|
||||
|
||||
- name: Prepare build environment
|
||||
run: |
|
||||
echo "Github Ref: $GITHUB_REF"
|
||||
echo "Event name: ${{ github.event_name }}"
|
||||
echo "Event action: ${{ github.event.action }}"
|
||||
echo "Tag name: ${{ github.event.release.tag_name }}"
|
||||
|
||||
arduino-cli config init --additional-urls https://raw.githubusercontent.com/pascallanger/DIY-Multiprotocol-TX-Module-Boards/master/package_multi_4in1_board_index.json
|
||||
arduino-cli core update-index
|
||||
|
||||
if [[ "$BOARD" =~ "multi4in1:avr:" ]]; then
|
||||
arduino-cli core install arduino:avr;
|
||||
arduino-cli core install multi4in1:avr
|
||||
fi
|
||||
|
||||
if [[ "$BOARD" =~ "multi4in1:STM32F1:" ]]; then
|
||||
arduino-cli core install multi4in1:STM32F1
|
||||
fi
|
||||
|
||||
chmod +x ${GITHUB_WORKSPACE}/buildroot/bin/*
|
||||
echo "${GITHUB_WORKSPACE}/buildroot/bin" >> $GITHUB_PATH
|
||||
|
||||
mkdir ./build
|
||||
mkdir ./binaries
|
||||
|
||||
- name: Configure MULTI-Module firmware options
|
||||
run: |
|
||||
# Load the build functions
|
||||
source ./buildroot/bin/buildFunctions;
|
||||
|
||||
# Get all the protocols for this board
|
||||
getAllProtocols
|
||||
|
||||
# Disable CHECK_FOR_BOOTLOADER when not needed
|
||||
if [[ "$BOARD" == "multi4in1:avr:multiatmega328p:bootloader=none" ]]; then
|
||||
opt_disable CHECK_FOR_BOOTLOADER;
|
||||
fi
|
||||
|
||||
# Trim the build down for the Atmega328p board
|
||||
if [[ "$BOARD" =~ "multi4in1:avr:multiatmega328p:" ]]; then
|
||||
opt_disable $ALL_PROTOCOLS
|
||||
opt_enable FRSKYX_CC2500_INO AFHDS2A_A7105_INO MJXQ_NRF24L01_INO DSM_CYRF6936_INO;
|
||||
fi
|
||||
|
||||
# Trim the enabled protocols down for the STM32F103CB board with debugging or the STM32F103C8 board in general
|
||||
if [[ "$BOARD" == "multi4in1:STM32F1:multistm32f103cb:debug_option=ftdi" ]] || [[ "$BOARD" == "multi4in1:STM32F1:multistm32f103cb:debug_option=native" ]] || [[ "$BOARD" =~ "multi4in1:STM32F1:multistm32f103c8" ]]; then
|
||||
opt_disable $ALL_PROTOCOLS;
|
||||
opt_enable FRSKYX_CC2500_INO AFHDS2A_A7105_INO MJXQ_NRF24L01_INO DSM_CYRF6936_INO;
|
||||
fi
|
||||
|
||||
- name: Save default firmware configuration
|
||||
run: |
|
||||
cat Multiprotocol/_Config.h
|
||||
cp Multiprotocol/_Config.h ./_Config.h.bak
|
||||
|
||||
- name: Build default configuration
|
||||
run: |
|
||||
source ./buildroot/bin/buildFunctions;
|
||||
buildMulti
|
||||
|
||||
- name: Build serial only
|
||||
run: |
|
||||
source ./buildroot/bin/buildFunctions;
|
||||
cp ./_Config.h.bak Multiprotocol/_Config.h
|
||||
opt_disable ENABLE_PPM;
|
||||
buildMulti;
|
||||
|
||||
- name: Build PPM only
|
||||
run: |
|
||||
source ./buildroot/bin/buildFunctions;
|
||||
cp ./_Config.h.bak Multiprotocol/_Config.h
|
||||
opt_disable ENABLE_SERIAL;
|
||||
buildMulti;
|
||||
|
||||
- name: Build each RF module individually
|
||||
run: |
|
||||
source ./buildroot/bin/buildFunctions;
|
||||
cp ./_Config.h.bak Multiprotocol/_Config.h;
|
||||
buildEachRFModule;
|
||||
|
||||
- name: Build each protocol individually
|
||||
run: |
|
||||
source ./buildroot/bin/buildFunctions;
|
||||
cp ./_Config.h.bak Multiprotocol/_Config.h;
|
||||
buildEachProtocol;
|
||||
|
||||
- name: Build release files
|
||||
run: |
|
||||
source ./buildroot/bin/buildFunctions;
|
||||
cp ./_Config.h.bak Multiprotocol/_Config.h;
|
||||
buildReleaseFiles;
|
||||
ls -al ./binaries;
|
||||
|
||||
NUM_FILES=$(ls -l ./binaries | grep ^- | wc -l);
|
||||
if [ $NUM_FILES -gt 0 ]; then
|
||||
echo "HAVE_FILES=true" >> $GITHUB_ENV
|
||||
else
|
||||
echo "HAVE_FILES=false" >> $GITHUB_ENV
|
||||
fi
|
||||
|
||||
- name: Deploy files to release
|
||||
if: github.event_name == 'release' && github.event.action == 'created' && env.HAVE_FILES == 'true'
|
||||
uses: AButler/upload-release-assets@v2.0
|
||||
with:
|
||||
files: './binaries/*'
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -170,6 +170,24 @@
|
||||
],
|
||||
"toolsDependencies": []
|
||||
},
|
||||
{
|
||||
"name": "MULTI-Module AVR Boards",
|
||||
"architecture": "avr",
|
||||
"version": "1.1.1",
|
||||
"category": "Contributed",
|
||||
"help": {
|
||||
"online": "https://github.com/pascallanger/DIY-Multiprotocol-TX-Module"
|
||||
},
|
||||
"url": "https://github.com/pascallanger/DIY-Multiprotocol-TX-Module-Boards/raw/master/archives/package_multi_4in1_avr_board_v1.1.1.tar.gz",
|
||||
"archiveFileName": "package_multi_4in1_avr_board_v1.1.1.tar.gz",
|
||||
"checksum": "SHA-256:02158258b4dbaca61bedbb6933336200d13b02ad0db981e2dda253682c482e99",
|
||||
"size": "324512",
|
||||
"boards": [
|
||||
{"name": "Multi 4-in-1 (Atmega328p, 3.3V, 16MHz)"},
|
||||
{"name": "Multi 4-in-1 (OrangeRX)"}
|
||||
],
|
||||
"toolsDependencies": []
|
||||
},
|
||||
{
|
||||
"name": "Multi 4-in-1 STM32 Board",
|
||||
"architecture": "STM32F1",
|
||||
@@ -549,6 +567,73 @@
|
||||
"version": "4.8.3-2014q1"
|
||||
}]
|
||||
},
|
||||
{
|
||||
"name": "Multi X-in-1 STM32 Boards",
|
||||
"architecture": "STM32F1",
|
||||
"version": "1.2.0",
|
||||
"category": "Contributed",
|
||||
"help": {
|
||||
"online": "https://github.com/pascallanger/DIY-Multiprotocol-TX-Module"
|
||||
},
|
||||
"url": "https://github.com/pascallanger/DIY-Multiprotocol-TX-Module-Boards/raw/master/archives/package_multi_4in1_stm32_board_v1.2.0.tar.gz",
|
||||
"archiveFileName": "package_multi_4in1_stm32_board_v1.2.0.tar.gz",
|
||||
"checksum": "SHA-256:754f08ca2a553701cc9112b645c079b6041107f1bf863648305e560c136a6ac5",
|
||||
"size": "7496214",
|
||||
"boards": [
|
||||
{"name": "Multi 4-in-1 (STM32F103C)"},
|
||||
{"name": "Multi 5-in-1 (Jumper T18 Internal)"}
|
||||
],
|
||||
"toolsDependencies": [{
|
||||
"packager": "arduino",
|
||||
"name": "arm-none-eabi-gcc",
|
||||
"version": "4.8.3-2014q1"
|
||||
}]
|
||||
},
|
||||
{
|
||||
"name": "Multi X-in-1 STM32 Boards",
|
||||
"architecture": "STM32F1",
|
||||
"version": "1.2.1",
|
||||
"category": "Contributed",
|
||||
"help": {
|
||||
"online": "https://github.com/pascallanger/DIY-Multiprotocol-TX-Module"
|
||||
},
|
||||
"url": "https://github.com/pascallanger/DIY-Multiprotocol-TX-Module-Boards/raw/master/archives/package_multi_4in1_stm32_board_v1.2.1.tar.gz",
|
||||
"archiveFileName": "package_multi_4in1_stm32_board_v1.2.1.tar.gz",
|
||||
"checksum": "SHA-256:c66d34afadc5b21e9e28c4d477fa03a6d55db0b74b59ff2dcb07b4d6ef06da1a",
|
||||
"size": "7496448",
|
||||
"boards": [
|
||||
{"name": "Multi 4-in-1 (STM32F103C)"},
|
||||
{"name": "Multi 5-in-1 (Jumper T18 Internal)"}
|
||||
],
|
||||
"toolsDependencies": [{
|
||||
"packager": "arduino",
|
||||
"name": "arm-none-eabi-gcc",
|
||||
"version": "4.8.3-2014q1"
|
||||
}]
|
||||
},
|
||||
{
|
||||
"name": "MULTI-Module STM32 Boards",
|
||||
"architecture": "STM32F1",
|
||||
"version": "1.2.2",
|
||||
"category": "Contributed",
|
||||
"help": {
|
||||
"online": "https://github.com/pascallanger/DIY-Multiprotocol-TX-Module"
|
||||
},
|
||||
"url": "https://github.com/pascallanger/DIY-Multiprotocol-TX-Module-Boards/raw/master/archives/package_multi_4in1_stm32_board_v1.2.2.tar.gz",
|
||||
"archiveFileName": "package_multi_4in1_stm32_board_v1.2.2.tar.gz",
|
||||
"checksum": "SHA-256:0fe4a8899438bbc31dc37714acca13968e43d75a47e59143343d83b634d2e47d",
|
||||
"size": "7485662",
|
||||
"boards": [
|
||||
{"name": "Multi X-in-1 STM32F103CB (128KB)"},
|
||||
{"name": "Multi X-in-1 STM32F103C8 (64KB)"},
|
||||
{"name": "Multi 5-in-1 (Jumper T18 Internal)"}
|
||||
],
|
||||
"toolsDependencies": [{
|
||||
"packager": "arduino",
|
||||
"name": "arm-none-eabi-gcc",
|
||||
"version": "4.8.3-2014q1"
|
||||
}]
|
||||
},
|
||||
{
|
||||
"name": "Multi 4-in-1 OrangeRX Board - DEPRECATED, USE MULTI 4-IN-1 AVR BOARDS PACKAGE INSTEAD",
|
||||
"architecture": "orangerx",
|
||||
|
||||
@@ -99,8 +99,8 @@
|
||||
26,1,Hontai,JJRCX1,1,Flip,Arm,Pict,Video,HLess,RTH,Calib
|
||||
26,2,Hontai,X5C1,1,Flip,Arm,Pict,Video,HLess,RTH,Calib
|
||||
26,3,Hontai,FQ777_951,1,Flip,Arm,Pict,Video,HLess,RTH,Calib
|
||||
57,0,HoTT,Sync,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12
|
||||
57,1,HoTT,No_Sync,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12
|
||||
57,0,HoTT,Sync,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16
|
||||
57,1,HoTT,No_Sync,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16
|
||||
2,0,Hubsan,H107,1,Flip,Light,Pict,Video,HLess
|
||||
2,1,Hubsan,H301,0,RTH,Light,Stab,Video
|
||||
2,2,Hubsan,H501,0,RTH,Light,Pict,Video,HLess,GPS_H,ALT_H,Flip,FModes
|
||||
@@ -139,6 +139,7 @@
|
||||
72,0,Q90C,Std,0,FMode,VTX+
|
||||
74,0,RadioLink,Surface,0,CH5,CH6,CH7,CH8,FS_CH1,FS_CH2,FS_CH3,FS_CH4,FS_CH5,FS_CH6,FS_CH7,FS_CH8
|
||||
74,1,RadioLink,Air,0,CH5,CH6,CH7,CH8,FS_CH1,FS_CH2,FS_CH3,FS_CH4,FS_CH5,FS_CH6,FS_CH7,FS_CH8
|
||||
74,2,RadioLink,DumboRC,0,CH5,CH6,CH7,CH8,FS_CH1,FS_CH2,FS_CH3,FS_CH4,FS_CH5,FS_CH6,FS_CH7,FS_CH8
|
||||
76,0,Realacc,R11,1,Flip,Light,Calib,HLess,RTH,UNK
|
||||
50,0,Redpine,Fast,0,sCH5,sCH6,sCH7,sCH8,sCH9,sCH10,sCH11,sCH12,sCH13,sCH14,sCH15,sCH16
|
||||
50,1,Redpine,Slow,0,sCH5,sCH6,sCH7,sCH8,sCH9,sCH10,sCH11,sCH12,sCH13,sCH14,sCH15,sCH16
|
||||
@@ -176,3 +177,5 @@
|
||||
8,4,YD717,NiHui,1,Flip,Light,Pict,Video,HLess
|
||||
52,0,ZSX,280,1,Light
|
||||
78,0,M-Link,Std,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16
|
||||
79,0,WFLY2,RF20x,0,CH5,CH6,CH7,CH8,CH9,CH10
|
||||
80,0,E016Hv2,E016Hv2,1,TakLan,EmStop,Flip,Calib,HLess,RTH
|
||||
|
||||
@@ -31,6 +31,12 @@ Need OpenTX 2.3.10 nightly or above. Located on the radio SD card under \SCRIPTS
|
||||
|
||||
[](https://www.youtube.com/watch?v=sjIaDw5j9nE)
|
||||
|
||||
## DSM PID Flight log gain parameters for Blade micros
|
||||
|
||||
Lua telemetry script from [feathering on RCGroups](https://www.rcgroups.com/forums/showpost.php?p=46033341&postcount=20728) to facilitate setting the Gain Parameters on the Blade 150S FBL. It doesn't use Forward Programming but instead it just reads telemetry data from the Multi-module and displays it on a telemetry display.
|
||||
|
||||
It is very similar to the Telemetry Based Text Generator functionality on Spektrum transmitters where one doesn't need to rely on the angle of the swashplate to determine selection/value.
|
||||
|
||||
## Graupner HoTT.ua
|
||||
|
||||
Enable text configuration of the HoTT RX and sensors: Vario, GPS, ESC, GAM and EAM.
|
||||
|
||||
127
Lua_scripts/pidDsm.lua
Normal file
127
Lua_scripts/pidDsm.lua
Normal file
@@ -0,0 +1,127 @@
|
||||
--
|
||||
-- This telemetry script displays the Flight Log Gain
|
||||
-- Parameters streamed from the Blade 150S Spektrum AR6335A
|
||||
-- Flybarless Controller.
|
||||
|
||||
-- The script facilitates the setting of the FBL's
|
||||
-- Gain Parameters including PID for both
|
||||
-- cyclic and tail. It is similar to the Telemetry Based
|
||||
-- Text Generator available on Spektrum transmitters.
|
||||
|
||||
-- Supporting similar Blade micros such as the Fusion 180
|
||||
-- would possibly require minor modifications to this script.
|
||||
|
||||
-- This script reads telemetry data from the Spektrum
|
||||
-- receiver and thus functionality relies on data being
|
||||
-- captured by the OpenTX transmitter. A DSM
|
||||
-- telemetry-ready module is required. Please see the
|
||||
-- MULTI-Module project at https://www.multi-module.org/.
|
||||
|
||||
-- The only supported display is the Taranis'. It may work
|
||||
-- with higher res screens.
|
||||
--
|
||||
|
||||
|
||||
-- Sensor names
|
||||
local PSensor = "FdeA"
|
||||
local ISensor = "FdeB"
|
||||
local DSensor = "FdeL"
|
||||
local RSensor = "FdeR"
|
||||
local ActiveParamSensor = "Hold"
|
||||
|
||||
local tags = {"P", "I", "D"}
|
||||
|
||||
|
||||
local function getPage(iParam)
|
||||
-- get page from 0-based index
|
||||
-- {0,1,2,3}: cyclic (1), {4,5,6,7}: tail (2)
|
||||
local res = (math.floor(iParam/4)==0) and 1 or 2
|
||||
return res
|
||||
end
|
||||
|
||||
function round(v)
|
||||
-- round float
|
||||
local factor = 100
|
||||
return math.floor(v * factor + 0.5) / factor
|
||||
end
|
||||
|
||||
|
||||
local function readValue(sensor)
|
||||
-- read from sensor, round and return
|
||||
local v = getValue(sensor)
|
||||
v = round(v)
|
||||
return v
|
||||
end
|
||||
|
||||
local function readActiveParamValue(sensor)
|
||||
-- read and return a validated active parameter value
|
||||
local v = getValue(sensor)
|
||||
if (v<1 or v>8) then
|
||||
return nil
|
||||
end
|
||||
return v
|
||||
end
|
||||
|
||||
local function readParameters()
|
||||
-- read and return parameters
|
||||
local p = readValue(PSensor)
|
||||
local i = readValue(ISensor)
|
||||
local d = readValue(DSensor)
|
||||
local r = readValue(RSensor)
|
||||
local a = readActiveParamValue(ActiveParamSensor)
|
||||
return {p,i,d,r,a}
|
||||
end
|
||||
|
||||
local function drawParameters()
|
||||
-- draw labels and params on screen
|
||||
local params = readParameters()
|
||||
local activeParam = params[5]
|
||||
|
||||
-- if active gain does not validate then assume
|
||||
-- Gain Adjustment Mode is disabled
|
||||
if not activeParam then
|
||||
lcd.clear()
|
||||
lcd.drawText(20,30,"Please enter Gain Adjustment Mode")
|
||||
return
|
||||
end
|
||||
|
||||
local activePage = getPage(activeParam-1)
|
||||
for iParam=0,7 do
|
||||
-- highlight selected parameter
|
||||
local attr = (activeParam==iParam+1) and 2 or 0
|
||||
-- circular index (per page)
|
||||
local perPageIndx = iParam % 4 + 1
|
||||
-- check if displaying cyclic params.
|
||||
local isCyclicPage = (getPage(iParam)==1)
|
||||
-- set y draw coord
|
||||
local y = perPageIndx*10+2
|
||||
|
||||
-- labels
|
||||
local x = isCyclicPage and 6 or 120
|
||||
-- labels are P,I,D for both pages except for last param
|
||||
local val = iParam==3 and "Response" or
|
||||
(iParam==7 and "Filtering" or tags[perPageIndx])
|
||||
lcd.drawText (x, y, val, attr)
|
||||
|
||||
-- gains
|
||||
-- set all params for non-active page to '--' rather than 'last value'
|
||||
val = (getPage(iParam)==activePage) and params[perPageIndx] or '--'
|
||||
x = isCyclicPage and 70 or 180
|
||||
lcd.drawText (x, y, val, attr)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
local function run_func(event)
|
||||
-- TODO: calling clear() on every function call redrawing all labels is not ideal
|
||||
lcd.clear()
|
||||
lcd.drawText (8, 2, "Cyclic (0...200)")
|
||||
lcd.drawText (114, 2, "Tail (0...200)")
|
||||
drawParameters()
|
||||
end
|
||||
|
||||
local function init_func() end
|
||||
local function bg_func() end
|
||||
|
||||
|
||||
return { run=run_func, background=bg_func, init=init_func }
|
||||
@@ -27,13 +27,16 @@ void A7105_WriteData(uint8_t len, uint8_t channel)
|
||||
for (i = 0; i < len; i++)
|
||||
SPI_Write(packet[i]);
|
||||
A7105_CSN_on;
|
||||
if(!(protocol==PROTO_FLYSKY || protocol==PROTO_KYOSHO))
|
||||
if(protocol!=PROTO_WFLY2)
|
||||
{
|
||||
A7105_Strobe(A7105_STANDBY); //Force standby mode, ie cancel any TX or RX...
|
||||
A7105_SetTxRxMode(TX_EN); //Switch to PA
|
||||
if(!(protocol==PROTO_FLYSKY || protocol==PROTO_KYOSHO))
|
||||
{
|
||||
A7105_Strobe(A7105_STANDBY); //Force standby mode, ie cancel any TX or RX...
|
||||
A7105_SetTxRxMode(TX_EN); //Switch to PA
|
||||
}
|
||||
A7105_WriteReg(A7105_0F_PLL_I, channel);
|
||||
A7105_Strobe(A7105_TX);
|
||||
}
|
||||
A7105_WriteReg(A7105_0F_PLL_I, channel);
|
||||
A7105_Strobe(A7105_TX);
|
||||
}
|
||||
|
||||
void A7105_ReadData(uint8_t len)
|
||||
@@ -107,7 +110,7 @@ void A7105_WriteID(uint32_t ida)
|
||||
{
|
||||
A7105_CSN_off;
|
||||
SPI_Write(A7105_06_ID_DATA); //ex id=0x5475c52a ;txid3txid2txid1txid0
|
||||
SPI_Write((ida>>24)&0xff); //53
|
||||
SPI_Write((ida>>24)&0xff); //54
|
||||
SPI_Write((ida>>16)&0xff); //75
|
||||
SPI_Write((ida>>8)&0xff); //c5
|
||||
SPI_Write((ida>>0)&0xff); //2a
|
||||
@@ -207,6 +210,11 @@ void A7105_AdjustLOBaseFreq(uint8_t cmd)
|
||||
offset=(int16_t)FORCE_KYOSHO_TUNING;
|
||||
#endif
|
||||
break;
|
||||
case PROTO_WFLY2:
|
||||
#ifdef FORCE_WFLY2_TUNING
|
||||
offset=(int16_t)FORCE_WFLY2_TUNING;
|
||||
#endif
|
||||
break;
|
||||
case PROTO_AFHDS2A:
|
||||
case PROTO_AFHDS2A_RX:
|
||||
#ifdef FORCE_AFHDS2A_TUNING
|
||||
@@ -216,7 +224,7 @@ void A7105_AdjustLOBaseFreq(uint8_t cmd)
|
||||
}
|
||||
}
|
||||
if(offset==1024) // Use channel 15 as an input
|
||||
offset=convert_channel_16b_nolimit(CH15,-300,300);
|
||||
offset=convert_channel_16b_nolimit(CH15,-300,300,false);
|
||||
|
||||
if(old_offset==offset) // offset is the same as before...
|
||||
return;
|
||||
@@ -325,6 +333,14 @@ const uint8_t PROGMEM KYOSHO_HYPE_A7105_regs[] = {
|
||||
0x01, 0x0f // 30 - 31
|
||||
};
|
||||
#endif
|
||||
#ifdef WFLY2_A7105_INO //A7106 values
|
||||
const uint8_t PROGMEM WFLY2_A7105_regs[] = {
|
||||
0xff, 0x62, 0xff, 0x1F, 0x40, 0xff, 0xff ,0x00, 0x00, 0x00, 0x00, 0x33, 0x33, 0x05, 0x00, 0x64, // 00 - 0f Changes: 0B:19->33, 0C:01,33
|
||||
0x9e, 0x4b, 0x00, 0x02, 0x16, 0x2b, 0x12, 0x40, 0x62, 0x80, 0x80, 0x00, 0x0a, 0x32, 0x03, 0x0f, // 10 - 1f 1C:4A->0A
|
||||
0x12, 0x00, 0x00, 0xff, 0x00, 0x00, 0x23, 0x70, 0x15, 0x47, 0x80, 0x03, 0x01, 0x45, 0x18, 0x00, // 20 - 2f 2B:77->03, 2E:19->18
|
||||
0x01, 0x0f // 30 - 31
|
||||
};
|
||||
#endif
|
||||
|
||||
#define ID_NORMAL 0x55201041
|
||||
#define ID_PLUS 0xAA201041
|
||||
@@ -333,6 +349,13 @@ void A7105_Init(void)
|
||||
uint8_t *A7105_Regs=0;
|
||||
uint8_t vco_calibration0, vco_calibration1;
|
||||
|
||||
#ifdef WFLY2_A7105_INO
|
||||
if(protocol==PROTO_WFLY2)
|
||||
{
|
||||
A7105_Regs=(uint8_t*)WFLY2_A7105_regs;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
#ifdef HEIGHT_A7105_INO
|
||||
if(protocol==PROTO_HEIGHT)
|
||||
{
|
||||
@@ -398,7 +421,7 @@ void A7105_Init(void)
|
||||
if(protocol==PROTO_HEIGHT && sub_protocol==HEIGHT_8CH)
|
||||
if(i==0x03) val=0x0A;
|
||||
#endif
|
||||
if( val != 0xFF)
|
||||
if( val != 0xff)
|
||||
A7105_WriteReg(i, val);
|
||||
}
|
||||
A7105_Strobe(A7105_STANDBY);
|
||||
@@ -442,7 +465,7 @@ void A7105_Init(void)
|
||||
while(A7105_ReadReg(A7105_02_CALC)); // Wait for calibration to end
|
||||
vco_calibration1 = A7105_ReadReg(A7105_25_VCO_SBCAL_I);
|
||||
|
||||
if(protocol==PROTO_BUGS)
|
||||
if(protocol==PROTO_BUGS || protocol==PROTO_WFLY2)
|
||||
A7105_SetVCOBand(vco_calibration0 & 0x07, vco_calibration1 & 0x07); // Set calibration band value to best match
|
||||
else
|
||||
if(protocol!=PROTO_HUBSAN)
|
||||
|
||||
@@ -153,7 +153,7 @@ uint16_t AFHDS2A_Rx_callback()
|
||||
case AFHDS2A_RX_BIND2 | AFHDS2A_RX_WAIT_WRITE:
|
||||
//Wait for TX completion
|
||||
pps_timer = micros();
|
||||
while (micros() - pps_timer < 700) // Wait max 700µs, using serial+telemetry exit in about 120µs
|
||||
while ((uint32_t)(micros() - pps_timer) < 700) // Wait max 700µs, using serial+telemetry exit in about 120µs
|
||||
if (!(A7105_ReadReg(A7105_00_MODE) & 0x01))
|
||||
break;
|
||||
A7105_SetTxRxMode(RX_EN);
|
||||
|
||||
@@ -326,7 +326,7 @@ uint16_t ReadAFHDS2A()
|
||||
case AFHDS2A_BIND3|AFHDS2A_WAIT_WRITE:
|
||||
//Wait for TX completion
|
||||
start=micros();
|
||||
while ((uint16_t)micros()-start < 700) // Wait max 700µs, using serial+telemetry exit in about 120µs
|
||||
while ((uint16_t)((uint16_t)micros()-start) < 700) // Wait max 700µs, using serial+telemetry exit in about 120µs
|
||||
if(!(A7105_ReadReg(A7105_00_MODE) & 0x01))
|
||||
break;
|
||||
A7105_SetPower();
|
||||
@@ -408,7 +408,7 @@ uint16_t ReadAFHDS2A()
|
||||
case AFHDS2A_DATA|AFHDS2A_WAIT_WRITE:
|
||||
//Wait for TX completion
|
||||
start=micros();
|
||||
while ((uint16_t)micros()-start < 700) // Wait max 700µs, using serial+telemetry exit in about 120µs
|
||||
while ((uint16_t)((uint16_t)micros()-start) < 700) // Wait max 700µs, using serial+telemetry exit in about 120µs
|
||||
if(!(A7105_ReadReg(A7105_00_MODE) & 0x01))
|
||||
break;
|
||||
A7105_SetPower();
|
||||
|
||||
@@ -115,7 +115,7 @@ void delayMilliseconds(unsigned long ms)
|
||||
uint16_t lms = ms ;
|
||||
|
||||
while (lms > 0) {
|
||||
if (((uint16_t)micros() - start) >= 1000) {
|
||||
if ((uint16_t)((uint16_t)micros() - start) >= 1000) {
|
||||
lms--;
|
||||
start += 1000;
|
||||
}
|
||||
|
||||
@@ -340,7 +340,7 @@ uint16_t ReadBUGS(void)
|
||||
case BUGS_BIND_2:
|
||||
//Wait for TX completion
|
||||
start=micros();
|
||||
while ((uint16_t)micros()-start < 500) // Wait max 500µs, using serial+telemetry exit in about 60µs
|
||||
while ((uint16_t)((uint16_t)micros()-start) < 500) // Wait max 500µs, using serial+telemetry exit in about 60µs
|
||||
if(!(A7105_ReadReg(A7105_00_MODE) & 0x01))
|
||||
break;
|
||||
A7105_SetTxRxMode(RX_EN);
|
||||
@@ -399,7 +399,7 @@ uint16_t ReadBUGS(void)
|
||||
case BUGS_DATA_2:
|
||||
//Wait for TX completion
|
||||
start=micros();
|
||||
while ((uint16_t)micros()-start < 500) // Wait max 500µs, using serial+telemetry exit in about 60µs
|
||||
while ((uint16_t)((uint16_t)micros()-start) < 500) // Wait max 500µs, using serial+telemetry exit in about 60µs
|
||||
if(!(A7105_ReadReg(A7105_00_MODE) & 0x01))
|
||||
break;
|
||||
A7105_SetTxRxMode(RX_EN);
|
||||
|
||||
@@ -91,9 +91,15 @@ int16_t convert_channel_16b_limit(uint8_t num,int16_t min,int16_t max)
|
||||
}
|
||||
|
||||
// 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)
|
||||
int16_t convert_channel_16b_nolimit(uint8_t num, int16_t min, int16_t max, bool failsafe)
|
||||
{
|
||||
int32_t val=Channel_data[num]; // 0<->2047
|
||||
int32_t val;
|
||||
#ifdef FAILSAFE_ENABLE
|
||||
if(failsafe)
|
||||
val=Failsafe_data[num]; // 0<->2047
|
||||
else
|
||||
#endif
|
||||
val=Channel_data[num]; // 0<->2047
|
||||
val=(val-CHANNEL_MIN_100)*(max-min)/(CHANNEL_MAX_100-CHANNEL_MIN_100)+min;
|
||||
return (uint16_t)val;
|
||||
}
|
||||
@@ -151,14 +157,14 @@ static uint16_t __attribute__((unused)) FrSkyX_scaleForPXX( uint8_t i, uint8_t
|
||||
}
|
||||
|
||||
#ifdef FAILSAFE_ENABLE
|
||||
static uint16_t __attribute__((unused)) FrSkyX_scaleForPXX_FS( uint8_t i )
|
||||
static uint16_t __attribute__((unused)) FrSkyX_scaleForPXX_FS( uint8_t i, uint8_t num_chan=8)
|
||||
{ //mapped 1,2046(125%) range to 64,1984(PXX values);
|
||||
uint16_t chan_val=((Failsafe_data[i]*15)>>4)+64;
|
||||
if(Failsafe_data[i]==FAILSAFE_CHANNEL_NOPULSES)
|
||||
chan_val=FAILSAFE_CHANNEL_NOPULSES;
|
||||
else if(Failsafe_data[i]==FAILSAFE_CHANNEL_HOLD)
|
||||
chan_val=FAILSAFE_CHANNEL_HOLD;
|
||||
if(i>7) chan_val|=2048; // upper channels offset
|
||||
if(i>=num_chan) chan_val|=2048; // upper channels offset
|
||||
return chan_val;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -184,7 +184,7 @@ static void __attribute__((unused)) DSM_build_data_packet(uint8_t upper)
|
||||
if(option & 0x80)
|
||||
value=Channel_data[CH_TAER[idx]]; // -100%..+100% => 1024..1976us and -125%..+125% => 904..2096us based on Redcon 6 channel DSM2 RX
|
||||
else
|
||||
value=convert_channel_16b_nolimit(CH_TAER[idx],0x156,0x6AA); // -100%..+100% => 1100..1900us and -125%..+125% => 1000..2000us based on a DX8 G2 dump
|
||||
value=convert_channel_16b_nolimit(CH_TAER[idx],0x156,0x6AA,false); // -100%..+100% => 1100..1900us and -125%..+125% => 1000..2000us based on a DX8 G2 dump
|
||||
#endif
|
||||
if(bits==10) value>>=1;
|
||||
value |= (upper && i==0 ? 0x8000 : 0) | (idx << bits);
|
||||
|
||||
@@ -146,7 +146,7 @@ static void __attribute__((unused)) DEVO_build_data_pkt()
|
||||
uint8_t sign = 0x0b;
|
||||
for (uint8_t i = 0; i < 4; i++)
|
||||
{
|
||||
int16_t value=convert_channel_16b_nolimit(CH_EATR[ch_idx * 4 + i],-1600,1600);//range -1600..+1600
|
||||
int16_t value=convert_channel_16b_nolimit(CH_EATR[ch_idx * 4 + i],-1600,1600,false);//range -1600..+1600
|
||||
if(value < 0)
|
||||
{
|
||||
value = -value;
|
||||
|
||||
169
Multiprotocol/E016HV2_cc2500.ino
Normal file
169
Multiprotocol/E016HV2_cc2500.ino
Normal file
@@ -0,0 +1,169 @@
|
||||
/*
|
||||
This project is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
Multiprotocol is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with Multiprotocol. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#if defined(E016HV2_CC2500_INO)
|
||||
|
||||
#include "iface_nrf250k.h"
|
||||
|
||||
//#define FORCE_E016HV2_ORIGINAL_ID
|
||||
|
||||
#define E016HV2_INITIAL_WAIT 500
|
||||
#define E016HV2_PACKET_PERIOD 10000
|
||||
#define E016HV2_RF_BIND_CHANNEL 5
|
||||
#define E016HV2_PAYLOAD_SIZE 11
|
||||
#define E016HV2_BIND_COUNT 300 //3sec
|
||||
|
||||
static void __attribute__((unused)) E016HV2_send_packet()
|
||||
{
|
||||
//payload length (after this byte)??
|
||||
packet[0 ] = 0x0A;
|
||||
|
||||
//bind indicator??
|
||||
if(IS_BIND_IN_PROGRESS)
|
||||
{
|
||||
packet[1 ] = 0x02;
|
||||
if(bind_counter)
|
||||
bind_counter--;
|
||||
else
|
||||
{
|
||||
BIND_DONE;
|
||||
XN297L_RFChannel(rf_ch_num); // Set main channel
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
packet[1 ] = 0x20;
|
||||
if(prev_option!=option)
|
||||
{
|
||||
XN297L_RFChannel(option); // Set main channel
|
||||
prev_option=option;
|
||||
}
|
||||
}
|
||||
|
||||
//ID
|
||||
packet[2 ] = rx_tx_addr[2];
|
||||
packet[3 ] = rx_tx_addr[3];
|
||||
|
||||
//channels TREA
|
||||
uint8_t channel;
|
||||
if(IS_BIND_IN_PROGRESS)
|
||||
channel=0x64; // Throttle must be centered during bind
|
||||
else
|
||||
channel=convert_channel_8b_limit_deadband(THROTTLE,0x00,0x64,0xC8, 20);
|
||||
packet[4 ] = channel;
|
||||
channel=convert_channel_16b_limit(RUDDER,0x00,0xC8);
|
||||
packet[5 ] = channel;
|
||||
channel=convert_channel_16b_limit(ELEVATOR,0x00,0xC8);
|
||||
packet[6 ] = channel;
|
||||
channel=convert_channel_16b_limit(AILERON,0x00,0xC8);
|
||||
packet[7 ] = channel;
|
||||
|
||||
//flags
|
||||
if(CH8_SW && !phase) //toggle calib flag
|
||||
flags ^= 0x40;
|
||||
phase=CH8_SW;
|
||||
|
||||
packet[8 ] = GET_FLAG(CH7_SW, 0x01) // 0x01=Flip
|
||||
| GET_FLAG(CH9_SW, 0x02) // 0x02=Headless
|
||||
| GET_FLAG(CH10_SW, 0x04) // 0x04=One Key Return
|
||||
| flags; // 0x40=Calib
|
||||
|
||||
packet[9 ] = 0x02; // Speed control 0x00:low, 0x01:medium, 0x02:high
|
||||
|
||||
packet[10] = GET_FLAG(CH5_SW, 0x01) // 0x01=TakeOff/Land (momentary switch)
|
||||
| GET_FLAG(CH6_SW, 0x04); // 0x04=Emergeny Stop (momentary switch)
|
||||
|
||||
if(option==0)
|
||||
option=1; // Select the CC2500
|
||||
XN297L_SetPower(); // Set tx_power
|
||||
XN297L_SetFreqOffset(); // Set frequency offset
|
||||
|
||||
//Build real packet and send it
|
||||
static uint8_t pid=0;
|
||||
crc=0;
|
||||
|
||||
// stop TX/RX
|
||||
CC2500_Strobe(CC2500_SIDLE);
|
||||
// flush tx FIFO
|
||||
CC2500_Strobe(CC2500_SFTX);
|
||||
// packet length
|
||||
CC2500_WriteReg(CC2500_3F_TXFIFO, 6 + 4 + 1 + 11 + 2); // preamble + address + packet_control + payload + crc
|
||||
|
||||
// preamble+address
|
||||
CC2500_WriteRegisterMulti(CC2500_3F_TXFIFO, (uint8_t*)"\xAA\xAA\xAA\xAA\xAA\xAA\xE7\xE7\xE7\xE7", 10);
|
||||
|
||||
// packet control
|
||||
CC2500_WriteReg(CC2500_3F_TXFIFO, 0x50+(pid<<2));
|
||||
pid++;
|
||||
|
||||
// payload
|
||||
debug("P:")
|
||||
for (uint8_t i = 0; i < E016HV2_PAYLOAD_SIZE; ++i)
|
||||
{
|
||||
uint8_t byte = (bit_reverse(packet[i])<<1) | (packet[i+1]&0x01);
|
||||
debug(" %02X",byte)
|
||||
CC2500_WriteReg(CC2500_3F_TXFIFO,byte);
|
||||
crc=crc16_update(crc, byte, 8);
|
||||
}
|
||||
|
||||
// crc
|
||||
CC2500_WriteReg(CC2500_3F_TXFIFO,crc >> 8);
|
||||
CC2500_WriteReg(CC2500_3F_TXFIFO,crc);
|
||||
debugln(" %04X",crc)
|
||||
|
||||
// transmit
|
||||
CC2500_Strobe(CC2500_STX);
|
||||
}
|
||||
|
||||
uint16_t E016HV2_callback()
|
||||
{
|
||||
E016HV2_send_packet();
|
||||
return E016HV2_PACKET_PERIOD;
|
||||
}
|
||||
|
||||
uint16_t initE016HV2()
|
||||
{
|
||||
//Config CC2500
|
||||
if(option==0)
|
||||
option=1; // Select the CC2500
|
||||
XN297L_Init();
|
||||
XN297L_RFChannel(E016HV2_RF_BIND_CHANNEL); // Set bind channel
|
||||
|
||||
#ifdef FORCE_E016HV2_ORIGINAL_ID
|
||||
rx_tx_addr[2]=0x27;
|
||||
rx_tx_addr[3]=0x1B;
|
||||
//rf_ch_num = 44;
|
||||
#endif
|
||||
//General ID
|
||||
//3F1B -> 68,2C1B -> 49,2B1B -> 48,2A1B -> 47,291B -> 46,281B -> 45,271B -> 44,261B -> 43,251B -> 42
|
||||
//241B -> no bind,231B -> no bind,221B -> 71,211B -> 70,201B -> 69,1F1B -> 68,1E1B -> 67,1D1B -> 66,1C1B -> 65,1B1B -> 64,1A1B -> 63,191B -> 62,181B -> 61,171B -> 60,161B -> 59
|
||||
//0C1B -> 49,051B -> 42,041B -> no bind,031B -> no bind,021B -> 71,011B -> 70,001B -> no bind
|
||||
if(rx_tx_addr[2]<3) rx_tx_addr[2]+=3; // rx_tx_addr[2]=0 is invalid
|
||||
if(rx_tx_addr[3]==0) rx_tx_addr[3]+=64; // rx_tx_addr[3]=0 is invalid
|
||||
rf_ch_num = (rx_tx_addr[2] + rx_tx_addr[3]) % 32 + 42;
|
||||
if(rf_ch_num>71) // channels 72 and 73 are invalid
|
||||
{
|
||||
rx_tx_addr[2]-=2;
|
||||
rf_ch_num-=2;
|
||||
}
|
||||
|
||||
phase=CH8_SW;
|
||||
flags=0;
|
||||
bind_counter = E016HV2_BIND_COUNT;
|
||||
BIND_IN_PROGRESS; // Autobind protocol
|
||||
return E016HV2_INITIAL_WAIT;
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -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_nolimit(CH_AETR[ch_offset+i],2020,1020);
|
||||
ch[i] = convert_channel_16b_nolimit(CH_AETR[ch_offset+i],2020,1020,false);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -172,10 +172,11 @@ static void __attribute__((unused)) HOTT_init()
|
||||
|
||||
static void __attribute__((unused)) HOTT_prep_data_packet()
|
||||
{
|
||||
static uint8_t upper=0;
|
||||
|
||||
packet[2] = hopping_frequency_no;
|
||||
|
||||
packet[3] = 0x00; // used for failsafe but may also be used for additional channels
|
||||
packet[3] = upper; // used for failsafe and upper channels (only supporting 16 channels)
|
||||
#ifdef FAILSAFE_ENABLE
|
||||
static uint8_t failsafe_count=0;
|
||||
if(IS_FAILSAFE_VALUES_on && IS_BIND_DONE)
|
||||
@@ -195,13 +196,16 @@ static void __attribute__((unused)) HOTT_prep_data_packet()
|
||||
uint16_t val;
|
||||
for(uint8_t i=4;i<28;i+=2)
|
||||
{
|
||||
val=Channel_data[(i-4)>>1];
|
||||
uint8_t ch=(i-4)>>1;
|
||||
if(upper && ch >= 8)
|
||||
ch+=4; // when upper swap CH9..CH12 by CH13..16
|
||||
val=Channel_data[ch];
|
||||
val=(((val<<2)+val)>>2)+860*2; // value range 860<->2140 *2 <-> -125%<->+125%
|
||||
#ifdef FAILSAFE_ENABLE
|
||||
if(failsafe_count==1)
|
||||
{ // first failsafe packet
|
||||
packet[3]=0x40;
|
||||
uint16_t fs=Failsafe_data[(i-4)>>1];
|
||||
packet[3] |= 0x40;
|
||||
uint16_t fs=Failsafe_data[ch];
|
||||
if( fs == FAILSAFE_CHANNEL_HOLD || fs == FAILSAFE_CHANNEL_NOPULSES)
|
||||
val|=0x8000; // channel hold flag
|
||||
else
|
||||
@@ -212,7 +216,7 @@ static void __attribute__((unused)) HOTT_prep_data_packet()
|
||||
}
|
||||
else if(failsafe_count==2)
|
||||
{ // second failsafe packet=timing?
|
||||
packet[3]=0x50;
|
||||
packet[3] |= 0x50;
|
||||
if(i==4)
|
||||
val=2;
|
||||
else
|
||||
@@ -222,6 +226,8 @@ static void __attribute__((unused)) HOTT_prep_data_packet()
|
||||
packet[i] = val;
|
||||
packet[i+1] = val>>8;
|
||||
}
|
||||
upper ^= 0x01; // toggle between CH9..CH12 and CH13..16
|
||||
|
||||
#ifdef HOTT_FW_TELEMETRY
|
||||
if(IS_BIND_DONE)
|
||||
{
|
||||
|
||||
@@ -165,7 +165,7 @@ static void __attribute__((unused)) HITEC_build_packet()
|
||||
packet[0] = 0x1A; // 26 bytes to follow
|
||||
for(uint8_t i=0;i<9;i++)
|
||||
{
|
||||
uint16_t ch = convert_channel_16b_nolimit(i,0x1B87,0x3905);
|
||||
uint16_t ch = convert_channel_16b_nolimit(i,0x1B87,0x3905,false);
|
||||
packet[4+2*i] = ch >> 8;
|
||||
packet[5+2*i] = ch & 0xFF;
|
||||
}
|
||||
|
||||
375
Multiprotocol/MLINK_cyrf6936.ino
Normal file
375
Multiprotocol/MLINK_cyrf6936.ino
Normal file
@@ -0,0 +1,375 @@
|
||||
/*
|
||||
This project is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
Multiprotocol is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with Multiprotocol. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#if defined(MLINK_CYRF6936_INO)
|
||||
|
||||
#include "iface_cyrf6936.h"
|
||||
|
||||
#define MLINK_FORCE_ID
|
||||
#define MLINK_BIND_COUNT 696 // around 20s
|
||||
#define MLINK_NUM_FREQ 78
|
||||
#define MLINK_BIND_CHANNEL 0x01
|
||||
#define MLINK_PACKET_SIZE 8
|
||||
|
||||
enum {
|
||||
MLINK_BIND_TX=0,
|
||||
MLINK_BIND_PREP_RX,
|
||||
MLINK_BIND_RX,
|
||||
MLINK_PREP_DATA,
|
||||
MLINK_RF,
|
||||
MLINK_SEND,
|
||||
};
|
||||
|
||||
uint8_t MLINK_Data_Code[16], MLINK_Offset;
|
||||
|
||||
const uint8_t PROGMEM MLINK_init_vals[][2] = {
|
||||
//Init from dump
|
||||
{ CYRF_01_TX_LENGTH, 0x08 }, // Length of packet
|
||||
{ CYRF_02_TX_CTRL, 0x40 }, // Clear TX Buffer
|
||||
{ CYRF_03_TX_CFG, 0x3C }, //0x3E in normal mode, 0x3C in bind mode: SDR 64 chip codes (=8 bytes data code used)
|
||||
{ CYRF_05_RX_CTRL, 0x00 },
|
||||
{ CYRF_06_RX_CFG, 0x93 }, // AGC enabled, overwrite enable, valid flag enable
|
||||
{ CYRF_0B_PWR_CTRL, 0x00 },
|
||||
//{ CYRF_0C_XTAL_CTRL, 0x00 }, // Set to GPIO on reset
|
||||
//{ CYRF_0D_IO_CFG, 0x00 }, // Set to GPIO on reset
|
||||
//{ CYRF_0E_GPIO_CTRL, 0x00 }, // Set by the CYRF_SetTxRxMode function
|
||||
//{ CYRF_0F_XACT_CFG, 0x04 }, // end state idle -> Set by the CYRF_SetTxRxMode function
|
||||
{ CYRF_10_FRAMING_CFG, 0x00 }, // SOP disabled
|
||||
{ CYRF_11_DATA32_THOLD, 0x05 }, // not used???
|
||||
{ CYRF_12_DATA64_THOLD, 0x0F }, // 64 Chip Data PN Code Correlator Threshold
|
||||
{ CYRF_14_EOP_CTRL, 0x05 }, // 5 consecutive noncorrelations symbol for EOP
|
||||
{ CYRF_15_CRC_SEED_LSB, 0x00 }, // not used???
|
||||
{ CYRF_16_CRC_SEED_MSB, 0x00 }, // not used???
|
||||
{ CYRF_1B_TX_OFFSET_LSB,0x00 },
|
||||
{ CYRF_1C_TX_OFFSET_MSB,0x00 },
|
||||
{ CYRF_1D_MODE_OVERRIDE,0x00 },
|
||||
{ CYRF_1E_RX_OVERRIDE, 0x14 }, // RX CRC16 is disabled and Force Receive Data Rate
|
||||
{ CYRF_1F_TX_OVERRIDE, 0x04 }, // TX CRC16 is disabled
|
||||
{ CYRF_26_XTAL_CFG, 0x08 },
|
||||
{ CYRF_29_RX_ABORT, 0x00 },
|
||||
{ CYRF_32_AUTO_CAL_TIME,0x3C },
|
||||
{ CYRF_35_AUTOCAL_OFFSET,0x14 },
|
||||
{ CYRF_39_ANALOG_CTRL, 0x03 }, // Receive invert and all slow
|
||||
};
|
||||
|
||||
static void __attribute__((unused)) MLINK_cyrf_config()
|
||||
{
|
||||
for(uint8_t i = 0; i < sizeof(MLINK_init_vals) / 2; i++)
|
||||
CYRF_WriteRegister(pgm_read_byte_near(&MLINK_init_vals[i][0]), pgm_read_byte_near(&MLINK_init_vals[i][1]));
|
||||
CYRF_WritePreamble(0x333304);
|
||||
CYRF_SetTxRxMode(TX_EN);
|
||||
}
|
||||
|
||||
static uint8_t __attribute__((unused)) MLINK_BR(uint8_t byte)
|
||||
{
|
||||
uint8_t result = 0;
|
||||
for(uint8_t i=0;i<8;i++)
|
||||
{
|
||||
result = (result<<1) | (byte & 0x01);
|
||||
byte >>= 1;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
static void __attribute__((unused)) MLINK_CRC(uint8_t byte)
|
||||
{
|
||||
crc8 = crc8 ^ MLINK_BR(byte); // Reflected in
|
||||
for ( uint8_t j = 0; j < 8; j++ )
|
||||
if ( crc8 & 0x80 )
|
||||
crc8 = (crc8<<1) ^ 0x31;
|
||||
else
|
||||
crc8 <<= 1;
|
||||
}
|
||||
|
||||
static void __attribute__((unused)) MLINK_send_bind_data_packet()
|
||||
{
|
||||
uint8_t p_c=packet_count>>1;
|
||||
|
||||
memset(packet, p_c<0x16?0x00:0xFF, MLINK_PACKET_SIZE);
|
||||
packet[0]=0x0F; // bind
|
||||
packet[1]=p_c;
|
||||
switch(p_c)
|
||||
{
|
||||
case 0x00:
|
||||
packet[2]=0x40; //unknown
|
||||
packet[4]=0x01; //unknown
|
||||
packet[5]=0x03; //unknown
|
||||
packet[6]=0xE3; //unknown
|
||||
break;
|
||||
case 0x05:
|
||||
packet[6]=0x07; //unknown
|
||||
break;
|
||||
case 0x06:
|
||||
packet[2]=0x3A; //unknown
|
||||
//Start of hopping frequencies
|
||||
for(uint8_t i=0;i<4;i++)
|
||||
packet[i+3]=hopping_frequency[i];
|
||||
break;
|
||||
case 0x15:
|
||||
packet[6]=0x51; //unknown
|
||||
break;
|
||||
case 0x16:
|
||||
packet[2]=0x51; //unknown
|
||||
packet[3]=0xEC; //unknown
|
||||
packet[4]=0x05; //unknown
|
||||
break;
|
||||
case 0x1A:
|
||||
packet[1]=0xFF;
|
||||
memset(&packet[2],0x00,5);
|
||||
break;
|
||||
}
|
||||
if(p_c>=0x01 && p_c<=0x04)
|
||||
{//DATA_CODE
|
||||
uint8_t p_c_5=(p_c-1)*5;
|
||||
for(uint8_t i=0;i<5;i++)
|
||||
if(i+p_c_5<16)
|
||||
packet[i+2]=MLINK_Data_Code[i+p_c_5];
|
||||
}
|
||||
else
|
||||
if(p_c>=0x07 && p_c<=0x15)
|
||||
{//Hopping frequencies
|
||||
uint8_t p_c_5=5*(p_c-6)-1;
|
||||
for(uint8_t i=0;i<5;i++)
|
||||
if(i+p_c_5<MLINK_NUM_FREQ)
|
||||
packet[i+2]=hopping_frequency[i+p_c_5];
|
||||
}
|
||||
|
||||
//Calculate CRC
|
||||
crc8=0xFF; // Init = 0xFF
|
||||
for(uint8_t i=0;i<MLINK_PACKET_SIZE-1;i++)
|
||||
MLINK_CRC(packet[i]);
|
||||
packet[7] = MLINK_BR(crc8); // CRC reflected out
|
||||
|
||||
//Debug
|
||||
debug("P(%02d):",p_c);
|
||||
for(uint8_t i=0;i<8;i++)
|
||||
debug(" %02X",packet[i]);
|
||||
debugln("");
|
||||
|
||||
//Send packet
|
||||
CYRF_WriteDataPacketLen(packet, MLINK_PACKET_SIZE);
|
||||
}
|
||||
|
||||
static void __attribute__((unused)) MLINK_build_data_packet()
|
||||
{
|
||||
//Channels to be sent
|
||||
uint8_t ch[3];
|
||||
switch(packet_count%6)
|
||||
{
|
||||
case 0:
|
||||
packet[0] = 0x88;
|
||||
ch[0]=4; ch[1]=2; ch[2]=0;
|
||||
break;
|
||||
case 1:
|
||||
packet[0] = 0x80;
|
||||
ch[0]=5; ch[1]=3; ch[2]=1;
|
||||
break;
|
||||
case 2:
|
||||
packet[0] = 0x0A;
|
||||
ch[0]=16; ch[1]=14; ch[2]=12;
|
||||
break;
|
||||
case 3:
|
||||
packet[0] = 0x09;
|
||||
ch[0]=10; ch[1]=8; ch[2]=6;
|
||||
break;
|
||||
case 4:
|
||||
packet[0] = 0x02;
|
||||
ch[0]=16; ch[1]=15; ch[2]=13;
|
||||
break;
|
||||
case 5:
|
||||
packet[0] = 0x01;
|
||||
ch[0]=11; ch[1]=9; ch[2]=7;
|
||||
break;
|
||||
}
|
||||
//Channels 426..1937..3448
|
||||
for(uint8_t i=0;i<3;i++)
|
||||
{
|
||||
uint16_t tmp=ch[i]<16 ? convert_channel_16b_nolimit(ch[i],426,3448,false) : 0x0000;
|
||||
packet[i*2+1]=tmp>>8;
|
||||
packet[i*2+2]=tmp;
|
||||
}
|
||||
|
||||
//Calculate CRC
|
||||
crc8=MLINK_BR(hopping_frequency_no + MLINK_Offset); // Init = relected freq index + offset
|
||||
for(uint8_t i=0;i<MLINK_PACKET_SIZE-1;i++)
|
||||
MLINK_CRC(packet[i]);
|
||||
packet[7] = MLINK_BR(crc8); // CRC reflected out
|
||||
|
||||
/* //Debug
|
||||
debug("P(%02d,%02d):",packet_count,hopping_frequency_no);
|
||||
for(uint8_t i=0;i<8;i++)
|
||||
debug(" %02X",packet[i]);
|
||||
debugln("");*/
|
||||
}
|
||||
|
||||
uint16_t ReadMLINK()
|
||||
{
|
||||
uint8_t status;//,len,sum=0,check=0;
|
||||
uint8_t start;
|
||||
uint16_t sum=0;
|
||||
//static uint8_t retry;
|
||||
|
||||
switch(phase)
|
||||
{
|
||||
case MLINK_BIND_RX:
|
||||
//debugln("RX");
|
||||
status=CYRF_ReadRegister(CYRF_05_RX_CTRL);
|
||||
if( (status&0x80) == 0 )
|
||||
{//Packet received
|
||||
len=CYRF_ReadRegister(CYRF_09_RX_COUNT);
|
||||
debugln("L=%02X",len)
|
||||
if( len==8 )
|
||||
{
|
||||
CYRF_ReadDataPacketLen(packet, len*2);
|
||||
debug("RX=");
|
||||
for(uint8_t i=0;i<8*2;i++)
|
||||
debug(" %02X",packet[i]);
|
||||
debugln("");
|
||||
//Check CRC
|
||||
crc8=0xFF; // Init = 0xFF
|
||||
for(uint8_t i=0;i<MLINK_PACKET_SIZE-1;i++)
|
||||
MLINK_CRC(packet[i*2]);
|
||||
if(packet[14] == MLINK_BR(crc8)) // CRC is ok
|
||||
{
|
||||
debugln("CRC ok");
|
||||
packet_count=3;
|
||||
}
|
||||
}
|
||||
}
|
||||
CYRF_WriteRegister(CYRF_29_RX_ABORT, 0x20); // Enable RX abort
|
||||
CYRF_WriteRegister(CYRF_0F_XACT_CFG, 0x24); // Force end state
|
||||
CYRF_WriteRegister(CYRF_29_RX_ABORT, 0x00); // Disable RX abort
|
||||
phase=MLINK_BIND_TX; // Retry sending bind packet
|
||||
CYRF_SetTxRxMode(TX_EN); // Transmit mode
|
||||
if(packet_count)
|
||||
return 18136;
|
||||
case MLINK_BIND_TX:
|
||||
if(--bind_counter==0 || packet_count>=0x1A*2)
|
||||
{ // Switch to normal mode
|
||||
BIND_DONE;
|
||||
phase=MLINK_PREP_DATA;
|
||||
}
|
||||
MLINK_send_bind_data_packet();
|
||||
if(packet_count == 0)
|
||||
{
|
||||
phase++; // MLINK_BIND_PREP_RX
|
||||
return 4700; // Original is 4900
|
||||
}
|
||||
packet_count++;
|
||||
if(packet_count&1)
|
||||
return 6000;
|
||||
return 22720;
|
||||
case MLINK_BIND_PREP_RX:
|
||||
start=micros();
|
||||
while ((uint8_t)((uint8_t)micros()-(uint8_t)start) < 200) // Wait max 200µs for TX to finish
|
||||
if((CYRF_ReadRegister(CYRF_02_TX_CTRL) & 0x80) == 0x00)
|
||||
break; // Packet transmission complete
|
||||
CYRF_SetTxRxMode(RX_EN); // Receive mode
|
||||
CYRF_WriteRegister(CYRF_05_RX_CTRL, 0x82); // Prepare to receive
|
||||
phase++; //MLINK_BIND_RX
|
||||
return 28712-4700;
|
||||
case MLINK_PREP_DATA:
|
||||
CYRF_ConfigDataCode(MLINK_Data_Code,16);
|
||||
hopping_frequency_no = 0x00;
|
||||
packet_count = 0;
|
||||
MLINK_build_data_packet();
|
||||
phase++;
|
||||
case MLINK_RF:
|
||||
/*sum=0;
|
||||
start=micros();
|
||||
while ((uint8_t)((uint8_t)micros()-(uint8_t)start) < 200) // Wait max 200µs for TX to finish
|
||||
{
|
||||
if(CYRF_ReadRegister(CYRF_04_TX_IRQ_STATUS) & 0x02)
|
||||
break; // Packet transmission complete
|
||||
sum++;
|
||||
}
|
||||
debugln("S:%d",sum);*/
|
||||
//Set RF channel
|
||||
CYRF_ConfigRFChannel(hopping_frequency[hopping_frequency_no]);
|
||||
//Set power
|
||||
CYRF_SetPower(0x38);
|
||||
phase++; // MLINK_SEND
|
||||
return 3100;
|
||||
case MLINK_SEND:
|
||||
/*sum=0;
|
||||
start=micros();
|
||||
while ((uint8_t)((uint8_t)micros()-(uint8_t)start) < 200) // Wait max 200µs for TX to finish
|
||||
{
|
||||
if(CYRF_ReadRegister(CYRF_04_TX_IRQ_STATUS) & 0x02)
|
||||
break; // Packet transmission complete
|
||||
sum++;
|
||||
}
|
||||
debugln("SS:%d",sum);*/
|
||||
//Send packet
|
||||
CYRF_WriteRegister(CYRF_02_TX_CTRL, 0x40);
|
||||
CYRF_WriteRegisterMulti(CYRF_20_TX_BUFFER, packet, MLINK_PACKET_SIZE);
|
||||
CYRF_WriteRegister(CYRF_02_TX_CTRL, 0x82);
|
||||
//Build next packet
|
||||
packet_count++;
|
||||
if(packet_count >= 78)
|
||||
packet_count=0;
|
||||
if(packet_count%3 == 0)
|
||||
{//Change RF channel every 3 packets
|
||||
phase=MLINK_RF;
|
||||
hopping_frequency_no++;
|
||||
if(hopping_frequency_no>=MLINK_NUM_FREQ)
|
||||
hopping_frequency_no=0;
|
||||
}
|
||||
#ifdef MULTI_SYNC
|
||||
telemetry_set_input_sync(6000);
|
||||
#endif
|
||||
MLINK_build_data_packet();
|
||||
return 6000;
|
||||
}
|
||||
return 1000;
|
||||
}
|
||||
|
||||
uint16_t initMLINK()
|
||||
{
|
||||
MLINK_cyrf_config();
|
||||
|
||||
#ifdef MLINK_FORCE_ID
|
||||
//Cockpit SX
|
||||
memcpy(MLINK_Data_Code,"\x4C\x97\x9D\xBF\xB8\x3D\xB5\xBE",8);
|
||||
for(uint8_t i=0;i<8;i++)
|
||||
MLINK_Data_Code[i+8]=MLINK_Data_Code[7-i];
|
||||
memcpy(hopping_frequency,"\x0D\x41\x09\x43\x17\x2D\x05\x31\x13\x3B\x1B\x3D\x0B\x41\x11\x45\x09\x2B\x17\x4D\x19\x3F\x03\x3F\x0F\x37\x1F\x47\x1B\x49\x07\x35\x27\x2F\x15\x33\x23\x39\x1F\x33\x19\x45\x0D\x2D\x11\x35\x0B\x47\x25\x3D\x21\x37\x1D\x3B\x05\x2F\x21\x39\x23\x4B\x03\x31\x25\x29\x07\x4F\x1D\x4B\x15\x4D\x13\x4F\x0F\x49\x29\x2B\x27\x43",78);
|
||||
MLINK_Offset = 0xF4;
|
||||
#endif
|
||||
|
||||
debug("ID:")
|
||||
for(uint8_t i=0;i<16;i++)
|
||||
debug(" %02X", MLINK_Data_Code[i]);
|
||||
debugln("");
|
||||
|
||||
debug("RF:")
|
||||
for(uint8_t i=0;i<MLINK_NUM_FREQ;i++)
|
||||
debug(" %02X", hopping_frequency[i]);
|
||||
debugln("");
|
||||
|
||||
if(IS_BIND_IN_PROGRESS)
|
||||
{
|
||||
packet_count = 0;
|
||||
bind_counter = MLINK_BIND_COUNT;
|
||||
CYRF_ConfigDataCode((uint8_t*)"\x6F\xBE\x32\x01\xDB\xF1\x2B\x01\xE3\x5C\xFA\x02\x97\x93\xF9\x02",16); //Bind data code
|
||||
CYRF_ConfigRFChannel(MLINK_BIND_CHANNEL);
|
||||
phase = MLINK_BIND_TX;
|
||||
}
|
||||
else
|
||||
phase = MLINK_PREP_DATA;
|
||||
return 10000;
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -37,7 +37,7 @@
|
||||
37,CORONA,COR_V1,COR_V2,FD_V3
|
||||
38,CFlie
|
||||
39,Hitec,OPT_FW,OPT_HUB,MINIMA
|
||||
40,WFLY
|
||||
40,WFLY,WFR0x
|
||||
41,BUGS
|
||||
42,BUGSMINI,BUGSMINI,BUGS3H
|
||||
43,Traxxas,RX6519
|
||||
@@ -71,8 +71,10 @@
|
||||
71,JJRC345,JJRC345,SkyTmblr
|
||||
72,Q90C
|
||||
73,Kyosho,FHSS,Hype
|
||||
74,RadioLink,Surface,Air
|
||||
74,RadioLink,Surface,Air,DumboRC
|
||||
75,---
|
||||
76,Realacc,R11
|
||||
77,OMP
|
||||
78,M-Link
|
||||
79,WFLY,RF20x
|
||||
80,E016H,E016Hv2
|
||||
|
||||
@@ -59,7 +59,8 @@ const char STR_H8_3D[] ="H8 3D";
|
||||
const char STR_CORONA[] ="Corona";
|
||||
const char STR_CFLIE[] ="CFlie";
|
||||
const char STR_HITEC[] ="Hitec";
|
||||
const char STR_WFLY[] ="WFly";
|
||||
const char STR_WFLY[] ="WFLY";
|
||||
const char STR_WFLY2[] ="WFLY2";
|
||||
const char STR_BUGS[] ="Bugs";
|
||||
const char STR_BUGSMINI[] ="BugMini";
|
||||
const char STR_TRAXXAS[] ="Traxxas";
|
||||
@@ -93,6 +94,7 @@ const char STR_OMP[] ="OMP";
|
||||
const char STR_MLINK[] ="M-Link";
|
||||
const char STR_TEST[] ="Test";
|
||||
const char STR_NANORF[] ="NanoRF";
|
||||
const char STR_E016HV2[] ="E016Hv2";
|
||||
|
||||
const char STR_SUBTYPE_FLYSKY[] = "\x04""Std\0""V9x9""V6x6""V912""CX20";
|
||||
const char STR_SUBTYPE_HUBSAN[] = "\x04""H107""H301""H501";
|
||||
@@ -140,14 +142,15 @@ const char STR_SUBTYPE_ESKY[] = "\x03""Std""ET4";
|
||||
const char STR_SUBTYPE_PROPEL[] = "\x04""74-Z";
|
||||
const char STR_SUBTYPE_FRSKY_RX[] = "\x07""RX\0 ""CloneTX";
|
||||
const char STR_SUBTYPE_FRSKYL[] = "\x08""LR12\0 ""LR12 6ch";
|
||||
const char STR_SUBTYPE_WFLY[] = "\x06""WFR0xS";
|
||||
const char STR_SUBTYPE_WFLY[] = "\x05""WFR0x";
|
||||
const char STR_SUBTYPE_WFLY2[] = "\x05""RF20x";
|
||||
const char STR_SUBTYPE_HOTT[] = "\x07""Sync\0 ""No_Sync";
|
||||
const char STR_SUBTYPE_PELIKAN[] = "\x04""Pro\0""Lite";
|
||||
const char STR_SUBTYPE_V761[] = "\x03""3ch""4ch";
|
||||
const char STR_SUBTYPE_RLINK[] = "\x07""Surface""Air\0 ";
|
||||
const char STR_SUBTYPE_RLINK[] = "\x07""Surface""Air\0 ""DumboRC";
|
||||
const char STR_SUBTYPE_REALACC[] = "\x03""R11";
|
||||
const char STR_SUBTYPE_KYOSHO[] = "\x04""FHSS""Hype";
|
||||
const char STR_SUBTYPE_FUTABA[] = "\x05""SFHSS";
|
||||
const char STR_SUBTYPE_FUTABA[] = "\x05""SFHSS";
|
||||
const char STR_SUBTYPE_JJRC345[] = "\x08""JJRC345\0""SkyTmblr";
|
||||
|
||||
enum
|
||||
@@ -210,6 +213,9 @@ const mm_protocol_definition multi_protocols[] = {
|
||||
#if defined(DSM_RX_CYRF6936_INO)
|
||||
{PROTO_DSM_RX, STR_DSM_RX, 0, NO_SUBTYPE, OPTION_NONE },
|
||||
#endif
|
||||
#if defined(E016HV2_CC2500_INO)
|
||||
{PROTO_E016HV2, STR_E016HV2, 0, NO_SUBTYPE, OPTION_RFTUNE },
|
||||
#endif
|
||||
#if defined(E01X_NRF24L01_INO)
|
||||
{PROTO_E01X, STR_E01X, 3, STR_SUBTYPE_E01X, OPTION_OPTION },
|
||||
#endif
|
||||
@@ -256,7 +262,7 @@ const mm_protocol_definition multi_protocols[] = {
|
||||
{PROTO_FRSKY_R9, STR_FRSKYR9, 8, STR_SUBTYPE_FRSKYR9, OPTION_NONE },
|
||||
#endif
|
||||
#if defined(FUTABA_CC2500_INO)
|
||||
{PROTO_FUTABA, STR_FUTABA, 1, STR_SUBTYPE_FUTABA, OPTION_RFTUNE },
|
||||
{PROTO_FUTABA, STR_FUTABA, 1, STR_SUBTYPE_FUTABA, OPTION_RFTUNE },
|
||||
#endif
|
||||
#if defined(FX816_NRF24L01_INO)
|
||||
{PROTO_FX816, STR_FX816, 1, STR_SUBTYPE_FX816, OPTION_NONE },
|
||||
@@ -340,7 +346,7 @@ const mm_protocol_definition multi_protocols[] = {
|
||||
{PROTO_Q90C, STR_Q90C, 0, NO_SUBTYPE, OPTION_RFTUNE },
|
||||
#endif
|
||||
#if defined(RLINK_CC2500_INO)
|
||||
{PROTO_RLINK, STR_RLINK, 2, STR_SUBTYPE_RLINK, OPTION_RFTUNE },
|
||||
{PROTO_RLINK, STR_RLINK, 3, STR_SUBTYPE_RLINK, OPTION_RFTUNE },
|
||||
#endif
|
||||
#if defined(REALACC_NRF24L01_INO)
|
||||
{PROTO_REALACC, STR_REALACC, 1, STR_SUBTYPE_REALACC, OPTION_NONE },
|
||||
@@ -384,6 +390,9 @@ const mm_protocol_definition multi_protocols[] = {
|
||||
#if defined(WFLY_CYRF6936_INO)
|
||||
{PROTO_WFLY, STR_WFLY, 1, STR_SUBTYPE_WFLY, OPTION_NONE },
|
||||
#endif
|
||||
#if defined(WFLY2_A7105_INO)
|
||||
{PROTO_WFLY2, STR_WFLY2, 1, STR_SUBTYPE_WFLY2, OPTION_OPTION },
|
||||
#endif
|
||||
#if defined(XK_NRF24L01_INO)
|
||||
{PROTO_XK, STR_XK , 2, STR_SUBTYPE_XK, OPTION_RFTUNE },
|
||||
#endif
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
#define VERSION_MAJOR 1
|
||||
#define VERSION_MINOR 3
|
||||
#define VERSION_REVISION 1
|
||||
#define VERSION_PATCH_LEVEL 78
|
||||
#define VERSION_PATCH_LEVEL 92
|
||||
|
||||
//******************
|
||||
// Protocols
|
||||
@@ -104,6 +104,8 @@ enum PROTOCOLS
|
||||
PROTO_REALACC = 76, // =>NRF24L01
|
||||
PROTO_OMP = 77, // =>CC2500 & NRF24L01
|
||||
PROTO_MLINK = 78, // =>CYRF6936
|
||||
PROTO_WFLY2 = 79, // =>A7105
|
||||
PROTO_E016HV2 = 80, // =>CC2500 & NRF24L01
|
||||
|
||||
PROTO_NANORF = 126, // =>NRF24L01
|
||||
PROTO_TEST = 127, // =>CC2500
|
||||
@@ -411,6 +413,13 @@ enum JJRC345
|
||||
SKYTMBLR = 1,
|
||||
};
|
||||
|
||||
enum RLINK
|
||||
{
|
||||
RLINK_SURFACE = 0,
|
||||
RLINK_AIR = 1,
|
||||
RLINK_DUMBORC = 2,
|
||||
};
|
||||
|
||||
#define NONE 0
|
||||
#define P_HIGH 1
|
||||
#define P_LOW 0
|
||||
@@ -453,7 +462,7 @@ enum MultiPacketTypes
|
||||
//***************
|
||||
//*** Tests ***
|
||||
//***************
|
||||
#define IS_FAILSAFE_PROTOCOL ( (protocol==PROTO_HISKY && sub_protocol==HK310) || protocol==PROTO_AFHDS2A || protocol==PROTO_DEVO || protocol==PROTO_FUTABA || protocol==PROTO_WK2x01 || protocol== PROTO_HOTT || protocol==PROTO_FRSKYX || protocol==PROTO_FRSKYX2 || protocol==PROTO_FRSKY_R9)
|
||||
#define IS_FAILSAFE_PROTOCOL ( (protocol==PROTO_HISKY && sub_protocol==HK310) || protocol==PROTO_AFHDS2A || protocol==PROTO_DEVO || protocol==PROTO_FUTABA || protocol==PROTO_WK2x01 || protocol== PROTO_HOTT || protocol==PROTO_FRSKYX || protocol==PROTO_FRSKYX2 || protocol==PROTO_FRSKY_R9 || protocol==PROTO_WFLY2)
|
||||
#define IS_CHMAP_PROTOCOL ( (protocol==PROTO_HISKY && sub_protocol==HK310) || protocol==PROTO_AFHDS2A || protocol==PROTO_DEVO || protocol==PROTO_FUTABA || protocol==PROTO_WK2x01 || protocol== PROTO_DSM || protocol==PROTO_SLT || protocol==PROTO_FLYSKY || (protocol==PROTO_KYOSHO && sub_protocol==KYOSHO_HYPE) || protocol==PROTO_ESKY || protocol==PROTO_J6PRO || protocol==PROTO_PELIKAN || protocol==PROTO_SKYARTEC || protocol==PROTO_ESKY150V2 || protocol==PROTO_DSM_RX)
|
||||
|
||||
//***************
|
||||
@@ -836,6 +845,8 @@ Serial: 100000 Baud 8e2 _ xxxx xxxx p --
|
||||
REALACC 76
|
||||
OMP 77
|
||||
MLINK 78
|
||||
WFLY2 79
|
||||
E016HV2 80
|
||||
BindBit=> 0x80 1=Bind/0=No
|
||||
AutoBindBit=> 0x40 1=Yes /0=No
|
||||
RangeCheck=> 0x20 1=Yes /0=No
|
||||
@@ -1032,6 +1043,10 @@ Serial: 100000 Baud 8e2 _ xxxx xxxx p --
|
||||
sub_protocol==JJRC345
|
||||
JJRC345 0
|
||||
SKYTMBLR 1
|
||||
sub_protocol==RLINK
|
||||
RLINK_SURFACE 0
|
||||
RLINK_AIR 1
|
||||
RLINK_DUMBORC 2
|
||||
|
||||
Power value => 0x80 0=High/1=Low
|
||||
Stream[3] = option_protocol;
|
||||
|
||||
@@ -821,7 +821,7 @@ bool Update_All()
|
||||
update_led_status();
|
||||
#if defined(TELEMETRY)
|
||||
#if ( !( defined(MULTI_TELEMETRY) || defined(MULTI_STATUS) ) )
|
||||
if((protocol == PROTO_BAYANG_RX) || (protocol == PROTO_AFHDS2A_RX) || (protocol == PROTO_FRSKY_RX) || (protocol == PROTO_SCANNER) || (protocol==PROTO_FRSKYD) || (protocol==PROTO_BAYANG) || (protocol==PROTO_NCC1701) || (protocol==PROTO_BUGS) || (protocol==PROTO_BUGSMINI) || (protocol==PROTO_HUBSAN) || (protocol==PROTO_AFHDS2A) || (protocol==PROTO_FRSKYX) || (protocol==PROTO_FRSKYX2) || (protocol==PROTO_DSM) || (protocol==PROTO_CABELL) || (protocol==PROTO_HITEC) || (protocol==PROTO_HOTT) || (protocol==PROTO_PROPEL) || (protocol==PROTO_OMP) || (protocol==PROTO_DEVO) || (protocol==PROTO_DSM_RX) || (protocol==PROTO_FRSKY_R9) || (protocol==PROTO_RLINK))
|
||||
if((protocol == PROTO_BAYANG_RX) || (protocol == PROTO_AFHDS2A_RX) || (protocol == PROTO_FRSKY_RX) || (protocol == PROTO_SCANNER) || (protocol==PROTO_FRSKYD) || (protocol==PROTO_BAYANG) || (protocol==PROTO_NCC1701) || (protocol==PROTO_BUGS) || (protocol==PROTO_BUGSMINI) || (protocol==PROTO_HUBSAN) || (protocol==PROTO_AFHDS2A) || (protocol==PROTO_FRSKYX) || (protocol==PROTO_FRSKYX2) || (protocol==PROTO_DSM) || (protocol==PROTO_CABELL) || (protocol==PROTO_HITEC) || (protocol==PROTO_HOTT) || (protocol==PROTO_PROPEL) || (protocol==PROTO_OMP) || (protocol==PROTO_DEVO) || (protocol==PROTO_DSM_RX) || (protocol==PROTO_FRSKY_R9) || (protocol==PROTO_RLINK) || (protocol==PROTO_WFLY2))
|
||||
#endif
|
||||
if(IS_DISABLE_TELEM_off)
|
||||
TelemetryUpdate();
|
||||
@@ -1196,6 +1196,13 @@ static void protocol_init()
|
||||
remote_callback = ReadKyosho;
|
||||
break;
|
||||
#endif
|
||||
#if defined(WFLY2_A7105_INO)
|
||||
case PROTO_WFLY2:
|
||||
PE1_off; //antenna RF1
|
||||
next_callback = initWFLY2();
|
||||
remote_callback = ReadWFLY2;
|
||||
break;
|
||||
#endif
|
||||
#endif
|
||||
#ifdef CC2500_INSTALLED
|
||||
#if defined(FRSKYD_CC2500_INO)
|
||||
@@ -1315,6 +1322,14 @@ static void protocol_init()
|
||||
remote_callback = RLINK_callback;
|
||||
break;
|
||||
#endif
|
||||
#if defined(E016HV2_CC2500_INO)
|
||||
case PROTO_E016HV2:
|
||||
PE1_off;
|
||||
PE2_on; //antenna RF2
|
||||
next_callback = initE016HV2();
|
||||
remote_callback = E016HV2_callback;
|
||||
break;
|
||||
#endif
|
||||
#endif
|
||||
#ifdef CYRF6936_INSTALLED
|
||||
#if defined(DSM_CYRF6936_INO)
|
||||
@@ -2283,7 +2298,7 @@ void pollBoot()
|
||||
#if defined(TELEMETRY)
|
||||
void PPM_Telemetry_serial_init()
|
||||
{
|
||||
if( (protocol==PROTO_FRSKYD) || (protocol==PROTO_HUBSAN) || (protocol==PROTO_AFHDS2A) || (protocol==PROTO_BAYANG)|| (protocol==PROTO_NCC1701) || (protocol==PROTO_CABELL) || (protocol==PROTO_HITEC) || (protocol==PROTO_BUGS) || (protocol==PROTO_BUGSMINI) || (protocol==PROTO_PROPEL) || (protocol==PROTO_OMP) || (protocol==PROTO_RLINK)
|
||||
if( (protocol==PROTO_FRSKYD) || (protocol==PROTO_HUBSAN) || (protocol==PROTO_AFHDS2A) || (protocol==PROTO_BAYANG)|| (protocol==PROTO_NCC1701) || (protocol==PROTO_CABELL) || (protocol==PROTO_HITEC) || (protocol==PROTO_BUGS) || (protocol==PROTO_BUGSMINI) || (protocol==PROTO_PROPEL) || (protocol==PROTO_OMP) || (protocol==PROTO_RLINK) || (protocol==PROTO_WFLY2)
|
||||
#ifdef TELEMETRY_FRSKYX_TO_FRSKYD
|
||||
|| (protocol==PROTO_FRSKYX) || (protocol==PROTO_FRSKYX2)
|
||||
#endif
|
||||
|
||||
@@ -56,16 +56,16 @@ static void __attribute__((unused)) pelikan_build_packet()
|
||||
packet[13] = rx_tx_addr[3];
|
||||
//Channels
|
||||
uint8_t offset=upper?4:0;
|
||||
uint16_t channel=convert_channel_16b_nolimit(CH_AETR[offset++], 153, 871);
|
||||
uint16_t channel=convert_channel_16b_nolimit(CH_AETR[offset++], 153, 871,false);
|
||||
uint8_t top=(channel>>2) & 0xC0;
|
||||
packet[2] = channel;
|
||||
channel=convert_channel_16b_nolimit(CH_AETR[offset++], 153, 871);
|
||||
channel=convert_channel_16b_nolimit(CH_AETR[offset++], 153, 871,false);
|
||||
top|=(channel>>4) & 0x30;
|
||||
packet[3] = channel;
|
||||
channel=convert_channel_16b_nolimit(CH_AETR[offset++], 153, 871);
|
||||
channel=convert_channel_16b_nolimit(CH_AETR[offset++], 153, 871,false);
|
||||
top|=(channel>>6) & 0x0C;
|
||||
packet[4] = channel;
|
||||
channel=convert_channel_16b_nolimit(CH_AETR[offset], 153, 871);
|
||||
channel=convert_channel_16b_nolimit(CH_AETR[offset], 153, 871,false);
|
||||
top|=(channel>>8) & 0x03;
|
||||
packet[5] = channel;
|
||||
packet[6] = top;
|
||||
|
||||
@@ -133,6 +133,12 @@ static void __attribute__((unused)) RLINK_rf_init()
|
||||
for (uint8_t i = 0; i < 39; ++i)
|
||||
CC2500_WriteReg(i, pgm_read_byte_near(&RLINK_init_values[i]));
|
||||
|
||||
if(sub_protocol==RLINK_DUMBORC)
|
||||
{
|
||||
CC2500_WriteReg(4, 0xBA);
|
||||
CC2500_WriteReg(5, 0xDC);
|
||||
}
|
||||
|
||||
prev_option = option;
|
||||
CC2500_WriteReg(CC2500_0C_FSCTRL0, option);
|
||||
|
||||
@@ -160,16 +166,22 @@ static void __attribute__((unused)) RLINK_send_packet()
|
||||
// packet length
|
||||
packet[0] = RLINK_TX_PACKET_LEN;
|
||||
// header
|
||||
if(sub_protocol)
|
||||
packet[1] = 0x21; //air 0x21 on dump but it looks to support telemetry at least RSSI
|
||||
else
|
||||
{//surface
|
||||
packet[1] = 0x01;
|
||||
//radiolink additionnal ID which is working only on a small set of RXs
|
||||
//if(RX_num) packet[1] |= ((RX_num+2)<<4)+4; // RX number limited to 10 values, 0 is a wildcard
|
||||
}
|
||||
if(packet_count>3)
|
||||
packet[1] |= 0x02; // 0x02 telemetry request flag
|
||||
packet[1] = 0x02; // 0x02 telemetry request flag
|
||||
switch(sub_protocol)
|
||||
{
|
||||
case RLINK_SURFACE:
|
||||
packet[1] |= 0x01;
|
||||
//radiolink additionnal ID which is working only on a small set of RXs
|
||||
//if(RX_num) packet[1] |= ((RX_num+2)<<4)+4; // RX number limited to 10 values, 0 is a wildcard
|
||||
break;
|
||||
case RLINK_AIR:
|
||||
packet[1] |= 0x21; //air 0x21 on dump but it looks to support telemetry at least RSSI
|
||||
break;
|
||||
case RLINK_DUMBORC:
|
||||
packet[1] = 0x00; //always 0x00 on dump
|
||||
break;
|
||||
}
|
||||
|
||||
// ID
|
||||
memcpy(&packet[2],rx_tx_addr,RLINK_TX_ID_LEN);
|
||||
@@ -177,7 +189,7 @@ static void __attribute__((unused)) RLINK_send_packet()
|
||||
// pack 16 channels on 11 bits values between 170 and 1876, 1023 middle. The last 8 channels are failsafe values associated to the first 8 values.
|
||||
for (uint8_t i = 0; i < 16; i++)
|
||||
{
|
||||
uint32_t val = convert_channel_16b_nolimit(i,170,1876); // allow extended limits
|
||||
uint32_t val = convert_channel_16b_nolimit(i,170,1876,false); // allow extended limits
|
||||
if (val & 0x8000)
|
||||
val = 0;
|
||||
else if (val > 2047)
|
||||
|
||||
@@ -77,19 +77,19 @@ static void __attribute__((unused)) TRAXXAS_send_data_packet()
|
||||
packet[0] = 0x01;
|
||||
memset(&packet[1],0x00,TRAXXAS_PACKET_SIZE-1);
|
||||
//Steering
|
||||
uint16_t ch = convert_channel_16b_nolimit(RUDDER,500,1000);
|
||||
uint16_t ch = convert_channel_16b_nolimit(RUDDER,500,1000,false);
|
||||
packet[2]=ch>>8;
|
||||
packet[3]=ch;
|
||||
//Throttle
|
||||
ch = convert_channel_16b_nolimit(THROTTLE,500,1000);
|
||||
ch = convert_channel_16b_nolimit(THROTTLE,500,1000,false);
|
||||
packet[4]=ch>>8;
|
||||
packet[5]=ch;
|
||||
//AUX3
|
||||
ch = convert_channel_16b_nolimit(AILERON,500,1000);
|
||||
ch = convert_channel_16b_nolimit(AILERON,500,1000,false);
|
||||
packet[6]=ch>>8;
|
||||
packet[7]=ch;
|
||||
//AUX4???
|
||||
ch = convert_channel_16b_nolimit(ELEVATOR,500,1000);
|
||||
ch = convert_channel_16b_nolimit(ELEVATOR,500,1000,false);
|
||||
packet[12]=ch>>8;
|
||||
packet[13]=ch;
|
||||
|
||||
|
||||
@@ -531,7 +531,7 @@ void frsky_link_frame()
|
||||
telemetry_link |= 2 ; // Send hub if available
|
||||
}
|
||||
else
|
||||
{//PROTO_HUBSAN, PROTO_AFHDS2A, PROTO_BAYANG, PROTO_NCC1701, PROTO_CABELL, PROTO_HITEC, PROTO_BUGS, PROTO_BUGSMINI, PROTO_FRSKYX, PROTO_FRSKYX2, PROTO_PROPEL, PROTO_DEVO, PROTO_RLINK, PROTO_OMP
|
||||
{//PROTO_HUBSAN, PROTO_AFHDS2A, PROTO_BAYANG, PROTO_NCC1701, PROTO_CABELL, PROTO_HITEC, PROTO_BUGS, PROTO_BUGSMINI, PROTO_FRSKYX, PROTO_FRSKYX2, PROTO_PROPEL, PROTO_DEVO, PROTO_RLINK, PROTO_OMP, PROTO_WFLY2
|
||||
frame[1] = v_lipo1;
|
||||
frame[2] = v_lipo2;
|
||||
frame[3] = RX_RSSI;
|
||||
|
||||
@@ -160,6 +160,11 @@
|
||||
#error "The Kyosho forced frequency tuning value is outside of the range -300..300."
|
||||
#endif
|
||||
#endif
|
||||
#ifdef FORCE_WFLY2_TUNING
|
||||
#if ( FORCE_WFLY2_TUNING < -300 ) || ( FORCE_WFLY2_TUNING > 300 )
|
||||
#error "The WFLY2 forced frequency tuning value is outside of the range -300..300."
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef USE_A7105_CH15_TUNING
|
||||
#ifndef FORCE_BUGS_TUNING
|
||||
@@ -177,6 +182,9 @@
|
||||
#ifndef FORCE_KYOSHO_TUNING
|
||||
#define FORCE_KYOSHO_TUNING 0
|
||||
#endif
|
||||
#ifndef FORCE_WFLY2_TUNING
|
||||
#define FORCE_WFLY2_TUNING 0
|
||||
#endif
|
||||
#ifndef FORCE_HUBSAN_TUNING
|
||||
#define FORCE_HUBSAN_TUNING 0
|
||||
#endif
|
||||
@@ -227,6 +235,7 @@
|
||||
#undef HUBSAN_A7105_INO
|
||||
#undef KYOSHO_A7105_INO
|
||||
#undef PELIKAN_A7105_INO
|
||||
#undef WFLY2_A7105_INO
|
||||
#endif
|
||||
#ifndef CYRF6936_INSTALLED
|
||||
#undef DEVO_CYRF6936_INO
|
||||
@@ -254,6 +263,7 @@
|
||||
#undef SCANNER_CC2500_INO
|
||||
#undef FUTABA_CC2500_INO
|
||||
#undef SKYARTEC_CC2500_INO
|
||||
#undef E016HV2_CC2500_INO
|
||||
#endif
|
||||
#ifndef NRF24L01_INSTALLED
|
||||
#undef ASSAN_NRF24L01_INO
|
||||
@@ -265,6 +275,7 @@
|
||||
#undef CG023_NRF24L01_INO
|
||||
#undef CX10_NRF24L01_INO
|
||||
#undef DM002_NRF24L01_INO
|
||||
#undef E016HV2_CC2500_INO // Use both CC2500 and NRF code
|
||||
#undef E01X_NRF24L01_INO
|
||||
#undef ESKY_NRF24L01_INO
|
||||
#undef ESKY150_NRF24L01_INO
|
||||
@@ -283,7 +294,7 @@
|
||||
#undef MJXQ_NRF24L01_INO
|
||||
#undef MT99XX_NRF24L01_INO
|
||||
#undef NCC1701_NRF24L01_INO
|
||||
#undef OMP_CC2500_INO
|
||||
#undef OMP_CC2500_INO // Use both CC2500 and NRF code
|
||||
#undef POTENSIC_NRF24L01_INO
|
||||
#undef PROPEL_NRF24L01_INO
|
||||
#undef Q303_NRF24L01_INO
|
||||
@@ -346,6 +357,7 @@
|
||||
#undef RLINK_HUB_TELEMETRY
|
||||
#undef DSM_RX_CYRF6936_INO
|
||||
#undef DSM_FWD_PGM
|
||||
#undef WFLY2_HUB_TELEMETRY
|
||||
#else
|
||||
#if defined(MULTI_TELEMETRY) && defined(MULTI_STATUS)
|
||||
#error You should choose either MULTI_TELEMETRY or MULTI_STATUS but not both.
|
||||
@@ -417,7 +429,10 @@
|
||||
#if not defined(HOTT_CC2500_INO)
|
||||
#undef HOTT_FW_TELEMETRY
|
||||
#endif
|
||||
#if not defined(HOTT_FW_TELEMETRY) && not defined(DSM_TELEMETRY) && not defined(SPORT_TELEMETRY) && not defined(HUB_TELEMETRY) && not defined(HUBSAN_HUB_TELEMETRY) && not defined(BUGS_HUB_TELEMETRY) && not defined(NCC1701_HUB_TELEMETRY) && not defined(BAYANG_HUB_TELEMETRY) && not defined(CABELL_HUB_TELEMETRY) && not defined(RLINK_HUB_TELEMETRY) && not defined(AFHDS2A_HUB_TELEMETRY) && not defined(AFHDS2A_FW_TELEMETRY) && not defined(MULTI_TELEMETRY) && not defined(MULTI_STATUS) && not defined(HITEC_HUB_TELEMETRY) && not defined(HITEC_FW_TELEMETRY) && not defined(SCANNER_TELEMETRY) && not defined(FRSKY_RX_TELEMETRY) && not defined(AFHDS2A_RX_TELEMETRY) && not defined(BAYANG_RX_TELEMETRY) && not defined(DEVO_HUB_TELEMETRY) && not defined(PROPEL_HUB_TELEMETRY) && not defined(OMP_HUB_TELEMETRY)
|
||||
#if not defined(WFLY2_A7105_INO)
|
||||
#undef WFLY2_HUB_TELEMETRY
|
||||
#endif
|
||||
#if not defined(HOTT_FW_TELEMETRY) && not defined(DSM_TELEMETRY) && not defined(SPORT_TELEMETRY) && not defined(HUB_TELEMETRY) && not defined(HUBSAN_HUB_TELEMETRY) && not defined(BUGS_HUB_TELEMETRY) && not defined(NCC1701_HUB_TELEMETRY) && not defined(BAYANG_HUB_TELEMETRY) && not defined(CABELL_HUB_TELEMETRY) && not defined(RLINK_HUB_TELEMETRY) && not defined(AFHDS2A_HUB_TELEMETRY) && not defined(AFHDS2A_FW_TELEMETRY) && not defined(MULTI_TELEMETRY) && not defined(MULTI_STATUS) && not defined(HITEC_HUB_TELEMETRY) && not defined(HITEC_FW_TELEMETRY) && not defined(SCANNER_TELEMETRY) && not defined(FRSKY_RX_TELEMETRY) && not defined(AFHDS2A_RX_TELEMETRY) && not defined(BAYANG_RX_TELEMETRY) && not defined(DEVO_HUB_TELEMETRY) && not defined(PROPEL_HUB_TELEMETRY) && not defined(OMP_HUB_TELEMETRY) && not defined(WFLY2_HUB_TELEMETRY)
|
||||
#undef TELEMETRY
|
||||
#undef INVERT_TELEMETRY
|
||||
#undef MULTI_TELEMETRY
|
||||
|
||||
314
Multiprotocol/WFLY2_a7105.ino
Normal file
314
Multiprotocol/WFLY2_a7105.ino
Normal file
@@ -0,0 +1,314 @@
|
||||
/*
|
||||
This project is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
Multiprotocol is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with Multiprotocol. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#if defined(WFLY2_A7105_INO)
|
||||
|
||||
#include "iface_a7105.h"
|
||||
|
||||
//#define WFLY2_FORCE_ID
|
||||
|
||||
//WFLY2 constants & variables
|
||||
#define WFLY2_BIND_COUNT 2777 // abort bind after 10sec
|
||||
#define WFLY2_PACKET_SIZE 32
|
||||
|
||||
enum{
|
||||
WFLY2_DATA,
|
||||
WFLY2_PLL_TX,
|
||||
WFLY2_RX,
|
||||
};
|
||||
|
||||
static void __attribute__((unused)) WFLY2_build_packet()
|
||||
{
|
||||
static uint16_t pseudo=0;
|
||||
|
||||
//End bind
|
||||
if(IS_BIND_IN_PROGRESS && bind_counter)
|
||||
{
|
||||
bind_counter--;
|
||||
if (bind_counter==0)
|
||||
{
|
||||
BIND_DONE;
|
||||
A7105_WriteID(MProtocol_id);
|
||||
rf_ch_num = 0;
|
||||
}
|
||||
}
|
||||
|
||||
memset(packet,0x00,WFLY2_PACKET_SIZE);
|
||||
|
||||
if(IS_BIND_IN_PROGRESS)
|
||||
{
|
||||
//Header
|
||||
packet[0] = 0x0F; // Bind packet
|
||||
|
||||
//ID
|
||||
packet[1] = rx_tx_addr[3];
|
||||
packet[2] = rx_tx_addr[2];
|
||||
packet[3] = rx_tx_addr[1];
|
||||
//packet[4] = 0x00; // Should be rx_tx_addr[0]&0x0F but bind is already using 0x00 so ....
|
||||
|
||||
//Unknown
|
||||
packet[5] = 0x01;
|
||||
|
||||
//Freq
|
||||
rf_ch_num = (hopping_frequency_no<<1)+0x08;
|
||||
packet[6] = rf_ch_num;
|
||||
hopping_frequency_no++;
|
||||
if(hopping_frequency_no > 0x17) hopping_frequency_no=0x00;
|
||||
|
||||
//Unknown bytes 7..31
|
||||
}
|
||||
else
|
||||
{
|
||||
//Pseudo
|
||||
uint16_t high_bit=(pseudo & 0x8000) ^ 0x8000; // toggle 0x8000 every other line
|
||||
pseudo <<= 1; // *2
|
||||
if( (pseudo & 0x8000) || pseudo == 0 ) pseudo ^= 0x8A87; // Randomisation, pseudo==0 is a guess but would give the start value seen on the dump when P[2]P[1]=0 at init and will prevent a lock up
|
||||
pseudo |= high_bit; // include toggle
|
||||
packet[1] = pseudo;
|
||||
packet[2] = pseudo>>8;
|
||||
|
||||
//RF channel
|
||||
int8_t prev = rf_ch_num & 0x1F;
|
||||
rf_ch_num = (pseudo ^ (pseudo >> 7));
|
||||
rf_ch_num = ((rf_ch_num>>1)&0x08) | (rf_ch_num & 0x47);
|
||||
rf_ch_num = ((rf_ch_num>>2)&0x10) | (rf_ch_num & 0x1F);
|
||||
rf_ch_num ^= rx_tx_addr[3] & 0x1F;
|
||||
if(abs((int8_t)rf_ch_num-prev) <= 9)
|
||||
{
|
||||
if(high_bit)
|
||||
rf_ch_num |= 0x20;
|
||||
}
|
||||
else
|
||||
if(!high_bit)
|
||||
rf_ch_num |= 0x20;
|
||||
|
||||
//Partial ID
|
||||
packet[3] = rx_tx_addr[3];
|
||||
packet[4] = rx_tx_addr[2] & 0x03;
|
||||
|
||||
//Header
|
||||
if(prev_option!=option)
|
||||
{//Set the RX PPM/WBUS on change
|
||||
packet[0] = 0x05; //PPM/WBUS packet
|
||||
packet[5] = 0x01;
|
||||
if(option)
|
||||
packet[6] = 0x01; // PPM
|
||||
else
|
||||
packet[6] = 0x00; // WBUS
|
||||
prev_option = option;
|
||||
}
|
||||
else
|
||||
{//Normal or Failsafe packets
|
||||
uint8_t offset=0;
|
||||
|
||||
//packet[0] = 0x00; // Normal packet
|
||||
|
||||
#ifdef FAILSAFE_ENABLE
|
||||
if(IS_FAILSAFE_VALUES_on)
|
||||
{//Failsafe packet
|
||||
packet[0] = 0x01; //Failsafe packet
|
||||
packet[5] = 0x58; // unknown, values are counting 58,59,5A,5B and rollover
|
||||
packet[6] = 0x55; // unknown and constant
|
||||
offset=2;
|
||||
}
|
||||
#endif
|
||||
|
||||
//10 channels -100%=0x2C1...0%=0x800...+100%=0xD3F
|
||||
for(uint8_t i = 0; i < 5; i++)
|
||||
{
|
||||
uint16_t temp=convert_channel_16b_nolimit(i*2 , 0x2C1, 0xD3F, IS_FAILSAFE_VALUES_on);
|
||||
packet[5 + offset + i*3] = temp&0xFF; // low byte
|
||||
packet[7 + offset + i*3] = (temp>>8)&0x0F; // high byte
|
||||
temp=convert_channel_16b_nolimit(i*2+1, 0x2C1, 0xD3F, IS_FAILSAFE_VALUES_on);
|
||||
packet[6 + offset + i*3] = temp&0xFF; // low byte
|
||||
packet[7 + offset + i*3] |= (temp>>4)&0xF0; // high byte
|
||||
}
|
||||
|
||||
//Unknown bytes 20+offset..31
|
||||
|
||||
#ifdef FAILSAFE_ENABLE
|
||||
FAILSAFE_VALUES_off;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
//Debug
|
||||
#if 0
|
||||
debug("ch=%02X,%02X P=",rf_ch_num,(rf_ch_num<<1)+0x10);
|
||||
for(uint8_t i=0; i<WFLY2_PACKET_SIZE; i++)
|
||||
debug("%02X ", packet[i]);
|
||||
debugln("");
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef WFLY2_HUB_TELEMETRY
|
||||
static void __attribute__((unused)) WFLY2_Send_Telemetry()
|
||||
{
|
||||
//Incoming packet values
|
||||
v_lipo1=packet[3]<<1; // RX_batt *10 in V
|
||||
v_lipo2=packet[5]<<1; // Ext_batt*10 in V
|
||||
RX_RSSI=(255-packet[7])>>1; // Looks to be the RX RSSI value direct from A7105
|
||||
|
||||
// Read TX RSSI
|
||||
TX_RSSI=255-A7105_ReadReg(A7105_1D_RSSI_THOLD);
|
||||
|
||||
telemetry_counter++; // LQI counter
|
||||
telemetry_link=1;
|
||||
if(telemetry_lost)
|
||||
{
|
||||
telemetry_lost = 0;
|
||||
packet_count = 100;
|
||||
telemetry_counter = 100;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#define WFLY2_PACKET_PERIOD 3600 //3600
|
||||
#define WFLY2_BUFFER_TIME 1500 //1500
|
||||
#define WFLY2_WRITE_TIME 800 //942
|
||||
|
||||
uint16_t ReadWFLY2()
|
||||
{
|
||||
uint16_t start;
|
||||
uint8_t status;
|
||||
|
||||
#ifndef FORCE_WFLY2_TUNING
|
||||
A7105_AdjustLOBaseFreq(1);
|
||||
#endif
|
||||
switch(phase)
|
||||
{
|
||||
case WFLY2_DATA:
|
||||
#ifdef MULTI_SYNC
|
||||
telemetry_set_input_sync(WFLY2_PACKET_PERIOD);
|
||||
#endif
|
||||
//Build data packet
|
||||
WFLY2_build_packet();
|
||||
|
||||
//Fill the TX buffer without sending
|
||||
A7105_WriteData(WFLY2_PACKET_SIZE,0);
|
||||
|
||||
#ifdef WFLY2_HUB_TELEMETRY
|
||||
//LQI calculation
|
||||
packet_count++;
|
||||
if(packet_count>=100)
|
||||
{
|
||||
packet_count=0;
|
||||
TX_LQI=telemetry_counter;
|
||||
if(telemetry_counter==0)
|
||||
telemetry_lost = 1;
|
||||
telemetry_counter = 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
phase++; // WFLY2_PLL_TX
|
||||
return WFLY2_BUFFER_TIME;
|
||||
|
||||
case WFLY2_PLL_TX:
|
||||
//Check RX status
|
||||
status=A7105_ReadReg(A7105_00_MODE);
|
||||
//debugln("S:%02X", status);
|
||||
|
||||
//PLL
|
||||
A7105_Strobe(A7105_PLL);
|
||||
|
||||
//Read incoming packet even if bad/not present to not change too much the TX timing, might want to reorg the code...
|
||||
A7105_ReadData(WFLY2_PACKET_SIZE);
|
||||
|
||||
//Read telemetry
|
||||
if((status & 0x21)==0)
|
||||
{ // Packet received and CRC OK
|
||||
//Debug
|
||||
#if 1
|
||||
debug("T:");
|
||||
for(uint8_t i=0; i<WFLY2_PACKET_SIZE-20; i++) // Can't send the full telemetry at full speed
|
||||
debug(" %02X", packet[i]);
|
||||
debugln("");
|
||||
#endif
|
||||
|
||||
if(IS_BIND_IN_PROGRESS)
|
||||
{
|
||||
if(packet[0]==0x0F && packet[1]==rx_tx_addr[3] && packet[2]==rx_tx_addr[2] && packet[3]==rx_tx_addr[1] && packet[4]==0x00)
|
||||
{
|
||||
bind_counter=1; // End bind
|
||||
debugln("Bind done");
|
||||
//packet[5..7] contains the RXID
|
||||
}
|
||||
}
|
||||
#ifdef WFLY2_HUB_TELEMETRY
|
||||
else
|
||||
if(packet[0]==0 && packet[1]==rx_tx_addr[3] && packet[2]==(rx_tx_addr[2] & 0x03))
|
||||
{//Packet match the ID
|
||||
WFLY2_Send_Telemetry(); // Packet looks good do send telem to the radio
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
//Change RF channel
|
||||
A7105_WriteReg(A7105_0F_PLL_I, (rf_ch_num<<1)+0x10);
|
||||
|
||||
//Switch to TX
|
||||
A7105_SetPower();
|
||||
A7105_SetTxRxMode(TX_EN);
|
||||
A7105_Strobe(A7105_TX);
|
||||
|
||||
phase++; // WFLY2_RX
|
||||
return WFLY2_WRITE_TIME;
|
||||
|
||||
case WFLY2_RX:
|
||||
//Wait for TX completion
|
||||
start=micros();
|
||||
while ((uint16_t)((uint16_t)micros()-start) < 700) // Wait max 700µs
|
||||
if(!(A7105_ReadReg(A7105_00_MODE) & 0x01))
|
||||
break;
|
||||
|
||||
//Switch to RX
|
||||
A7105_SetTxRxMode(RX_EN);
|
||||
A7105_Strobe(A7105_RX);
|
||||
|
||||
phase = WFLY2_DATA;
|
||||
return WFLY2_PACKET_PERIOD-WFLY2_WRITE_TIME-WFLY2_BUFFER_TIME;
|
||||
}
|
||||
return WFLY2_PACKET_PERIOD; // never reached, please the compiler
|
||||
}
|
||||
|
||||
uint16_t initWFLY2()
|
||||
{
|
||||
A7105_Init();
|
||||
|
||||
#ifdef WFLY2_FORCE_ID
|
||||
MProtocol_id = 0x50002313; //Richard
|
||||
//MProtocol_id = 0x50000223; //Pascal
|
||||
#endif
|
||||
MProtocol_id &= 0x00FFFFFF; // Since the bind ID starts with 50, let's keep only the last 3 bytes of the ID
|
||||
MProtocol_id |= 0x50000000; // As recommended on the A7105 datasheet
|
||||
set_rx_tx_addr(MProtocol_id); // Update the ID
|
||||
|
||||
if(IS_BIND_IN_PROGRESS)
|
||||
A7105_WriteID(0x50FFFFFE); // Bind ID
|
||||
else
|
||||
A7105_WriteID(MProtocol_id);
|
||||
|
||||
hopping_frequency_no=0;
|
||||
rf_ch_num = 0;
|
||||
bind_counter = WFLY2_BIND_COUNT;
|
||||
phase = WFLY2_DATA;
|
||||
prev_option = option;
|
||||
#ifdef WFLY2_HUB_TELEMETRY
|
||||
packet_count = 0;
|
||||
telemetry_lost = 1;
|
||||
#endif
|
||||
return 2000;
|
||||
}
|
||||
#endif
|
||||
@@ -105,23 +105,23 @@ static uint16_t __attribute__((unused)) WFLY_send_data_packet()
|
||||
len=4;
|
||||
for(uint8_t i=0;i<3;i++)
|
||||
{ // Channels
|
||||
uint16_t ch = convert_channel_16b_nolimit(i*4+0,151,847);
|
||||
uint16_t ch = convert_channel_16b_nolimit(i*4+0,151,847,false);
|
||||
uint8_t offset=i*5;
|
||||
packet[3+offset]|=ch<<6;
|
||||
packet[4+offset]=ch>>2;
|
||||
len++;
|
||||
if(--nbr_ch==0) break;
|
||||
ch = convert_channel_16b_nolimit(i*4+1,151,847);
|
||||
ch = convert_channel_16b_nolimit(i*4+1,151,847,false);
|
||||
packet[5+offset]=ch;
|
||||
packet[6+offset]=ch>>8;
|
||||
len+=2;
|
||||
if(--nbr_ch==0) break;
|
||||
ch = convert_channel_16b_nolimit(i*4+2,151,847);
|
||||
ch = convert_channel_16b_nolimit(i*4+2,151,847,false);
|
||||
packet[6+offset]|=ch<<2;
|
||||
packet[7+offset]=ch>>6;
|
||||
len++;
|
||||
if(--nbr_ch==0) break;
|
||||
ch = convert_channel_16b_nolimit(i*4+3,151,847);
|
||||
ch = convert_channel_16b_nolimit(i*4+3,151,847,false);
|
||||
packet[7+offset]|=ch<<4;
|
||||
packet[8+offset]=ch>>4;
|
||||
len++;
|
||||
|
||||
@@ -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 = convert_channel_16b_nolimit(CH_AETR[ch],-scale,scale)+center;
|
||||
int16_t value = convert_channel_16b_nolimit(CH_AETR[ch],-scale,scale,false)+center;
|
||||
if (value < center - range) value = center - range;
|
||||
if (value > center + range) value = center + range;
|
||||
return value;
|
||||
@@ -451,7 +451,7 @@ uint16_t WK_cb()
|
||||
}
|
||||
packet_sent = 0;
|
||||
uint8_t start=micros();
|
||||
while ((uint8_t)micros()-start < 100) // Wait max 100µs
|
||||
while ((uint8_t)((uint8_t)micros()-start) < 100) // Wait max 100µs
|
||||
if(CYRF_ReadRegister(CYRF_04_TX_IRQ_STATUS) & 0x02)
|
||||
break;
|
||||
if((packet_count & 0x03) == 0)
|
||||
|
||||
@@ -628,11 +628,11 @@ static uint16_t XN297Dump_callback()
|
||||
{
|
||||
if(phase==0)
|
||||
{
|
||||
address_length=5;
|
||||
memcpy(rx_tx_addr, (uint8_t *)"\xC9\x59\xD2\x65\x34", 5);
|
||||
address_length=4;
|
||||
memcpy(rx_tx_addr, (uint8_t *)"\xE7\xE7\xE7\xE7", 4);
|
||||
bitrate=XN297DUMP_250K;
|
||||
packet_length=16;
|
||||
hopping_frequency_no=0x03;
|
||||
packet_length=14;
|
||||
hopping_frequency_no=5; //bind 5, normal 44
|
||||
|
||||
NRF24L01_Initialize();
|
||||
NRF24L01_SetTxRxMode(TXRX_OFF);
|
||||
@@ -669,7 +669,7 @@ static uint16_t XN297Dump_callback()
|
||||
NRF24L01_WriteReg(NRF24L01_1D_FEATURE, 0x01);
|
||||
NRF24L01_Activate(0x73);
|
||||
NRF24L01_SetPower();
|
||||
NRF24L01_WriteReg(NRF24L01_00_CONFIG, _BV(NRF24L01_00_EN_CRC) | _BV(NRF24L01_00_CRCO) | _BV(NRF24L01_00_PWR_UP) | _BV(NRF24L01_00_PRIM_RX));
|
||||
NRF24L01_WriteReg(NRF24L01_00_CONFIG, _BV(NRF24L01_00_PWR_UP) | _BV(NRF24L01_00_PRIM_RX)); //_BV(NRF24L01_00_EN_CRC) | _BV(NRF24L01_00_CRCO) |
|
||||
phase++;
|
||||
}
|
||||
else
|
||||
@@ -679,21 +679,30 @@ static uint16_t XN297Dump_callback()
|
||||
if(NRF24L01_ReadReg(NRF24L01_09_CD))
|
||||
{
|
||||
NRF24L01_ReadPayload(packet, packet_length);
|
||||
if(memcmp(packet_in,packet,packet_length))
|
||||
{
|
||||
debug("P:");
|
||||
for(uint8_t i=0;i<packet_length;i++)
|
||||
debug(" %02X",packet[i]);
|
||||
debugln("");
|
||||
memcpy(packet_in,packet,packet_length);
|
||||
}
|
||||
crc=0;
|
||||
for (uint8_t i = 1; i < 12; ++i)
|
||||
crc = crc16_update(crc, packet[i], 8);
|
||||
if(packet[12]==((crc>>8)&0xFF) && packet[13]==(crc&0xFF))
|
||||
if(memcmp(&packet_in[1],&packet[1],packet_length-1))
|
||||
{
|
||||
/*debug("P:");
|
||||
for(uint8_t i=0;i<packet_length;i++)
|
||||
debug(" %02X",packet[i]);
|
||||
debug(" CRC: %04X",crc);
|
||||
debugln("");*/
|
||||
debug("P(%02X):",packet[0]);
|
||||
for(uint8_t i=1;i<packet_length-2;i++)
|
||||
debug(" %02X",((bit_reverse(packet[i])<<1)|(bit_reverse(packet[i-1])>>7))&0xFF);
|
||||
debugln("");
|
||||
memcpy(packet_in,packet,packet_length);
|
||||
}
|
||||
}
|
||||
// restart RX mode
|
||||
NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x70); // Clear data ready, data sent, and retransmit
|
||||
NRF24L01_SetTxRxMode(TXRX_OFF);
|
||||
NRF24L01_SetTxRxMode(RX_EN);
|
||||
NRF24L01_FlushRx();
|
||||
NRF24L01_WriteReg(NRF24L01_00_CONFIG, _BV(NRF24L01_00_EN_CRC) | _BV(NRF24L01_00_CRCO) | _BV(NRF24L01_00_PWR_UP) | _BV(NRF24L01_00_PRIM_RX));
|
||||
NRF24L01_WriteReg(NRF24L01_00_CONFIG, _BV(NRF24L01_00_PWR_UP) | _BV(NRF24L01_00_PRIM_RX)); // _BV(NRF24L01_00_EN_CRC) | _BV(NRF24L01_00_CRCO) |
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -122,6 +122,7 @@
|
||||
//#define FORCE_HUBSAN_TUNING 0
|
||||
//#define FORCE_KYOSHO_TUNING 0
|
||||
//#define FORCE_PELIKAN_TUNING 0
|
||||
//#define FORCE_WFLY2_TUNING 0
|
||||
|
||||
/** CYRF6936 Fine Frequency Tuning **/
|
||||
//This is required in rare cases where some CYRF6936 modules and/or RXs have an inaccurate crystal oscillator.
|
||||
@@ -172,8 +173,9 @@
|
||||
#define FLYSKY_A7105_INO
|
||||
#define HEIGHT_A7105_INO
|
||||
#define HUBSAN_A7105_INO
|
||||
#define KYOSHO_A7105_INO
|
||||
#define KYOSHO_A7105_INO
|
||||
#define PELIKAN_A7105_INO
|
||||
#define WFLY2_A7105_INO
|
||||
|
||||
//The protocols below need a CYRF6936 to be installed
|
||||
#define DEVO_CYRF6936_INO
|
||||
@@ -186,6 +188,7 @@
|
||||
|
||||
//The protocols below need a CC2500 to be installed
|
||||
#define CORONA_CC2500_INO
|
||||
#define E016HV2_CC2500_INO
|
||||
#define ESKY150V2_CC2500_INO //Need both CC2500 and NRF
|
||||
#define FRSKYL_CC2500_INO
|
||||
#define FRSKYD_CC2500_INO
|
||||
@@ -322,6 +325,7 @@
|
||||
#define PROPEL_HUB_TELEMETRY // Use FrSkyD Hub format to send telemetry to TX
|
||||
#define CABELL_HUB_TELEMETRY // Use FrSkyD Hub format to send telemetry to TX
|
||||
#define RLINK_HUB_TELEMETRY // Use FrSkyD Hub format to send telemetry to TX
|
||||
#define WFLY2_HUB_TELEMETRY // Use FrSkyD Hub format to send telemetry to TX
|
||||
#define HITEC_HUB_TELEMETRY // Use FrSkyD Hub format to send basic telemetry to the radios which can decode it like er9x, erskyTX and OpenTX
|
||||
#define HITEC_FW_TELEMETRY // Forward received telemetry packets to be decoded by erskyTX and OpenTX
|
||||
#define SCANNER_TELEMETRY // Forward spectrum scanner data to TX
|
||||
@@ -568,6 +572,8 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]= {
|
||||
DSMX_11
|
||||
PROTO_DSM_RX
|
||||
NONE
|
||||
PROTO_E016HV2
|
||||
NONE
|
||||
PROTO_E01X
|
||||
E012
|
||||
E015
|
||||
@@ -682,6 +688,8 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]= {
|
||||
E010
|
||||
H26WH
|
||||
PHOENIX
|
||||
PROTO_MLINK
|
||||
NONE
|
||||
PROTO_MT99XX
|
||||
MT99
|
||||
H7
|
||||
@@ -716,7 +724,9 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]= {
|
||||
RED_FAST
|
||||
RED_SLOW
|
||||
PROTO_RLINK
|
||||
NONE
|
||||
RLINK_SURFACE
|
||||
RLINK_AIR
|
||||
RLINK_DUMBORC
|
||||
PROTO_SCANNER
|
||||
NONE
|
||||
PROTO_FUTABA
|
||||
@@ -750,6 +760,8 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]= {
|
||||
V911S_E119
|
||||
PROTO_WFLY
|
||||
NONE
|
||||
PROTO_WFLY2
|
||||
NONE
|
||||
PROTO_WK2x01
|
||||
WK2801
|
||||
WK2401
|
||||
|
||||
@@ -76,6 +76,7 @@ CFlie|38|CFlie||||||||NRF24L01|
|
||||
[DM002](Protocols_Details.md#DM002---33)|33|DM002||||||||NRF24L01|XN297
|
||||
[DSM](Protocols_Details.md#DSM---6)|6|DSM2_1F|DSM2_2F|DSMX_1F|DSMX_2F|AUTO||||CYRF6936|
|
||||
[DSM_RX](Protocols_Details.md#DSM_RX---70)|70|RX||||||||CYRF6936|
|
||||
[E016HV2](Protocols_Details.md#E016HV2---80)|80|E016Hv2||||||||CC2500/NRF24L01|unknown
|
||||
[E01X](Protocols_Details.md#E01X---45)|45|E012|E015|E016H||||||NRF24L01|XN297/HS6200
|
||||
[ESky](Protocols_Details.md#ESKY---16)|16|ESky|ET4|||||||NRF24L01|
|
||||
[ESky150](Protocols_Details.md#ESKY150---35)|35|ESKY150||||||||NRF24L01|
|
||||
@@ -119,7 +120,7 @@ CFlie|38|CFlie||||||||NRF24L01|
|
||||
[Q2X2](Protocols_Details.md#Q2X2---29)|29|Q222|Q242|Q282||||||NRF24L01|
|
||||
[Q303](Protocols_Details.md#Q303---31)|31|Q303|CX35|CX10D|CX10WD|||||NRF24L01|XN297
|
||||
[Q90C](Protocols_Details.md#Q90C---72)|72|Q90C*||||||||NRF24L01|XN297
|
||||
[RadioLink](Protocols_Details.md#RadioLink---74)|74|Surface|Air|||||||CC2500|
|
||||
[RadioLink](Protocols_Details.md#RadioLink---74)|74|Surface|Air|DumboRC||||||CC2500|
|
||||
[Realacc](Protocols_Details.md#Realacc---76)|76|R11||||||||NRF24L01|
|
||||
[Redpine](Protocols_Details.md#Redpine---50)|50|FAST|SLOW|||||||NRF24L01|XN297
|
||||
[Scanner](Protocols_Details.md#Scanner---54)|54|||||||||CC2500|
|
||||
@@ -132,7 +133,8 @@ CFlie|38|CFlie||||||||NRF24L01|
|
||||
[V2x2](Protocols_Details.md#V2X2---5)|5|V2x2|JXD506|MR101||||||NRF24L01|
|
||||
[V761](Protocols_Details.md#V761---48)|48|V761||||||||NRF24L01|XN297
|
||||
[V911S](Protocols_Details.md#V911S---46)|46|V911S*|E119*|||||||NRF24L01|XN297
|
||||
[WFly](Protocols_Details.md#WFLY---40)|40|WFLY||||||||CYRF6936|
|
||||
[WFLY](Protocols_Details.md#WFLY---40)|40|WFR0x||||||||CYRF6936|
|
||||
[WFLY2](Protocols_Details.md#WFLY2---79)|79|RF20x||||||||A7105|
|
||||
[WK2x01](Protocols_Details.md#WK2X01---30)|30|WK2801|WK2401|W6_5_1|W6_6_1|W6_HEL|W6_HEL_I|||CYRF6936|
|
||||
[XK](Protocols_Details.md#XK---62)|62|X450|X420|||||||NRF24L01|XN297
|
||||
[YD717](Protocols_Details.md#YD717---8)|8|YD717|SKYWLKR|SYMAX4|XINXUN|NIHUI||||NRF24L01|
|
||||
@@ -293,7 +295,7 @@ H123D: FMODES -> -100%=Sport mode 1,0%=Sport mode 2,+100%=Acro
|
||||
## Kyosho - *73*
|
||||
|
||||
### Sub_protocol FHSS - *0*
|
||||
Surface protocol called FHSS introduced in 2017. Transmitters: KT-531P, KT-431PT, Flysky Noble NB4 (fw>2.0.67)...
|
||||
Surface protocol called FHSS introduced in 2017. Transmitters: KT-531P, KT-431PT...
|
||||
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14
|
||||
---|---|---|---|---|---|---|---|---|----|----|----|----|----
|
||||
@@ -325,6 +327,21 @@ Models: TX: CADET 4 LITE
|
||||
|
||||
**Only 1 frequency hopping table**
|
||||
|
||||
## WFLY2 - *79*
|
||||
Receivers: RF201S,RF206S,RF207S,RF209S
|
||||
|
||||
Extended limits supported
|
||||
|
||||
Failsafe is only supported by value per channel, it's not yet possible to set Hold or No pulse.
|
||||
|
||||
Telemetry enabled for A1=RX_Batt (Ratio 12.7), A2=Ext_Batt (Ratio 12.7), RX RSSI, TX RSSI, TX LQI (100=all telem packets received...0=no telem packets).
|
||||
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10
|
||||
---|---|---|---|---|---|---|---|---|----
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10
|
||||
|
||||
Option is used to select between WBUS=0 and PPM=1
|
||||
|
||||
***
|
||||
# CC2500 RF Module
|
||||
|
||||
@@ -359,6 +376,22 @@ To bind V2 RXs you must follow the below procedure (original):
|
||||
### Sub_protocol FD_V3 - *2*
|
||||
FlyDream RXs like IS-4R and IS-4R0
|
||||
|
||||
## E016HV2 - *80*
|
||||
Models: E016H v2
|
||||
|
||||
Option for this protocol corresponds to fine frequency tuning. This value is different for each Module and **must** be accurate otherwise the link will not be stable or bind won't even work.
|
||||
Check the [Frequency Tuning page](/docs/Frequency_Tuning.md) to determine it.
|
||||
|
||||
**Again make sure to set the RF frequency right to be able to bind**. FYI, on my module I needed +80.
|
||||
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10
|
||||
---|---|---|---|---|---|---|---|---|----
|
||||
A|E|T|R|TAKE_OFF/LANDING|EMERGENCY|FLIP|CALIB|HEADLESS|RTH
|
||||
|
||||
TAKE_OFF/LANDING: this is a momentary switch to arm the motors or land the quad. This switch is not really needed as you can start the quad with throttle low then increase throttle until the motor arms and continue to increase to lift off; To land just bring throttle all the way down, the quad will just stops when touching the ground.
|
||||
|
||||
EMERGENCY: Can be used along with the throttle cut switch: Throttle cut=set throttle at -100% and set EMERGENCY to 100%
|
||||
|
||||
## FRSKYV - *25*
|
||||
Models: FrSky receivers V8R4, V8R7 and V8FR.
|
||||
- FrSkyV = FrSky 1 way
|
||||
@@ -537,7 +570,7 @@ Basic telemetry using FrSky Hub on er9x, erskyTX, OpenTX and any radio with FrSk
|
||||
MINIMA, MICRO and RED receivers. Also used by ARES planes.
|
||||
|
||||
## HoTT - *57*
|
||||
Models: Graupner HoTT receivers (tested on GR-12, GR-12L, GR-16 and Vector).
|
||||
Models: Graupner HoTT receivers (tested on GR-12, GR-12L, GR-16, GR-32 and Vector).
|
||||
|
||||
Extended limits, failsafe and LBT supported.
|
||||
|
||||
@@ -552,9 +585,9 @@ The RX and sensors/FC features configuration are done through the OpenTX script
|
||||
Option for this protocol corresponds to fine frequency tuning. This value is different for each Module and **must** be accurate otherwise the link will not be stable.
|
||||
Check the [Frequency Tuning page](/docs/Frequency_Tuning.md) to determine it.
|
||||
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12
|
||||
---|---|---|---|---|---|---|---|---|----|----|----
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14|CH15|CH16
|
||||
---|---|---|---|---|---|---|---|---|----|----|----|----|----|----|----
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14|CH15|CH16
|
||||
|
||||
### Sub_protocol Sync - *0*
|
||||
Recommended for best telemetry performance.
|
||||
@@ -603,17 +636,20 @@ CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|FS_CH1|FS_CH2|FS_CH3|FS_CH4|FS_CH5|FS_CH6|FS_CH7
|
||||
FS=FailSafe
|
||||
|
||||
### Sub_protocol Surface - *0*
|
||||
Surface protocol. TXs: RC4GS,RC6GS. Compatible RXs:R7FG(Std),R6FG,R6F,R8EF,R8FM,R8F,R4FGM,R4F and more
|
||||
Surface protocol. TXs: RC4GS,RC6GS. Compatible RXs: R7FG(Std),R6FG,R6F,R8EF,R8FM,R8F,R4FGM,R4F
|
||||
|
||||
CH1=Steering, CH2=Throttle, CH8=Gyro gain
|
||||
|
||||
Telemetry: RX_RSSI (for the original value add -256), TX_RSSI, TX_QLY (0..100%), A1=RX_Batt (set the ratio to 12.7 and adjust with offset), A2=Batt (set the ratio to 25.5 and adjust with offset)
|
||||
|
||||
### Sub_protocol Air - *1*
|
||||
Air protocol. TXs: T8FB,T8S. Compatible RXs:R8EF,R8FM,R8SM,R4FG,R4F and more
|
||||
Air protocol. TXs: T8FB,T8S. Compatible RXs: R8EF,R8FM,R8SM,R4FG,R4F
|
||||
|
||||
Telemetry: RX_RSSI (for the original value add -256), TX_RSSI, TX_QLY (0..100%)
|
||||
|
||||
### Sub_protocol DumboRC - *2*
|
||||
Compatible RXs: X6/X6F/X6FG
|
||||
|
||||
## Futaba - *21*
|
||||
Also called SFHSS depending on radio version.
|
||||
|
||||
|
||||
@@ -72,7 +72,7 @@ before_install:
|
||||
install:
|
||||
# Install Arduino CLI
|
||||
- mkdir ~/arduino-cli
|
||||
- curl -fsSL https://raw.githubusercontent.com/arduino/arduino-cli/master/install.sh | BINDIR=~/arduino-cli sh;
|
||||
- curl -fsSL https://raw.githubusercontent.com/arduino/arduino-cli/master/install.sh | BINDIR=~/arduino-cli sh -s 0.13.0;
|
||||
- export PATH=$PATH:$HOME/arduino-cli
|
||||
|
||||
# Update the board url and package index
|
||||
105
buildroot/bin/buildFunctions
Normal file
105
buildroot/bin/buildFunctions
Normal file
@@ -0,0 +1,105 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
getMultiVersion() {
|
||||
MAJOR_VERSION=$(grep "VERSION_MAJOR" "Multiprotocol/Multiprotocol.h" | awk -v N=3 '{gsub(/\r/,""); print $N}')
|
||||
MINOR_VERSION=$(grep "VERSION_MINOR" "Multiprotocol/Multiprotocol.h" | awk -v N=3 '{gsub(/\r/,""); print $N}')
|
||||
REVISION_VERSION=$(grep "VERSION_REVISION" "Multiprotocol//Multiprotocol.h" | awk -v N=3 '{gsub(/\r/,""); print $N}')
|
||||
PATCH_VERSION=$(grep "VERSION_PATCH" "Multiprotocol//Multiprotocol.h" | awk -v N=3 '{gsub(/\r/,""); print $N}')
|
||||
MULTI_VERSION=$MAJOR_VERSION.$MINOR_VERSION.$REVISION_VERSION.$PATCH_VERSION
|
||||
}
|
||||
|
||||
getAllRFModules() {
|
||||
if [[ "$BOARD" =~ "multi4in1:avr:multixmega32d4" ]]; then
|
||||
ALL_RFMODULES=$(echo CYRF6936_INSTALLED);
|
||||
elif [[ "$BOARD" =~ "multi4in1:avr:multiatmega328p:" ]]; then
|
||||
ALL_RFMODULES=$(echo A7105_INSTALLED CYRF6936_INSTALLED CC2500_INSTALLED NRF24L01_INSTALLED);
|
||||
elif [[ "$BOARD" =~ "multi4in1:STM32F1:" ]]; then
|
||||
ALL_RFMODULES=$(echo A7105_INSTALLED CYRF6936_INSTALLED CC2500_INSTALLED NRF24L01_INSTALLED SX1276_INSTALLED);
|
||||
fi
|
||||
}
|
||||
|
||||
getAllProtocols() {
|
||||
A7105_PROTOCOLS=$(sed -n 's/[\/\/]*[[:blank:]]*#define[[:blank:]]*\([[:alnum:]_]*_A7105_INO\)\(.*\)/\1/p' Multiprotocol/_Config.h)
|
||||
CC2500_PROTOCOLS=$(sed -n 's/[\/\/]*[[:blank:]]*#define[[:blank:]]*\([[:alnum:]_]*_CC2500_INO\)\(.*\)/\1/p' Multiprotocol/_Config.h)
|
||||
CYRF6936_PROTOCOLS=$(sed -n 's/[\/\/]*[[:blank:]]*#define[[:blank:]]*\([[:alnum:]_]*_CYRF6936_INO\)\(.*\)/\1/p' Multiprotocol/_Config.h)
|
||||
NRF24L01_PROTOCOLS=$(sed -n 's/[\/\/]*[[:blank:]]*#define[[:blank:]]*\([[:alnum:]_]*_NRF24L01_INO\)\(.*\)/\1/p' Multiprotocol/_Config.h)
|
||||
SX1276_PROTOCOLS=$(sed -n 's/[\/\/]*[[:blank:]]*#define[[:blank:]]*\([[:alnum:]_]*_SX1276_INO\)\(.*\)/\1/p' Multiprotocol/_Config.h)
|
||||
|
||||
if [[ "$BOARD" =~ "multi4in1:avr:multixmega32d4" ]]; then
|
||||
ALL_PROTOCOLS=$(echo $CYRF6936_PROTOCOLS);
|
||||
elif [[ "$BOARD" =~ "multi4in1:avr:multiatmega328p:" ]]; then
|
||||
ALL_PROTOCOLS=$(echo $A7105_PROTOCOLS $CC2500_PROTOCOLS $CYRF6936_PROTOCOLS $NRF24L01_PROTOCOLS);
|
||||
elif [[ "$BOARD" =~ "multi4in1:STM32F1:" ]]; then
|
||||
ALL_PROTOCOLS=$(echo $A7105_PROTOCOLS $CC2500_PROTOCOLS $CYRF6936_PROTOCOLS $NRF24L01_PROTOCOLS $SX1276_PROTOCOLS);
|
||||
fi
|
||||
}
|
||||
|
||||
buildMulti() {
|
||||
echo ::group::_Config.h
|
||||
git diff Multiprotocol/_Config.h
|
||||
echo ::endgroup::
|
||||
BUILDCMD="arduino-cli compile -b $BOARD ${GITHUB_WORKSPACE}/Multiprotocol/Multiprotocol.ino --build-path ${GITHUB_WORKSPACE}/build/";
|
||||
echo $BUILDCMD;
|
||||
$BUILDCMD
|
||||
return $?
|
||||
}
|
||||
|
||||
buildProtocol() {
|
||||
exitcode=0;
|
||||
opt_disable $ALL_PROTOCOLS;
|
||||
opt_enable $1;
|
||||
buildMulti;
|
||||
if [ $? -ne 0 ]; then exitcode=1; fi;
|
||||
return $exitcode;
|
||||
}
|
||||
|
||||
buildEachProtocol() {
|
||||
getAllProtocols;
|
||||
exitcodesum=0;
|
||||
for PROTOCOL in $ALL_PROTOCOLS ; do
|
||||
printf "\e[33;1mBuilding $PROTOCOL\e[0m\n";
|
||||
buildProtocol $PROTOCOL;
|
||||
if [ $? -ne 0 ]; then exitcodesum=$((exitcodesum + 1)); fi;
|
||||
done;
|
||||
return $exitcodesum;
|
||||
}
|
||||
|
||||
buildRFModule() {
|
||||
exitcode=0;
|
||||
opt_disable $ALL_RFMODULES;
|
||||
opt_enable $1;
|
||||
buildMulti;
|
||||
if [ $? -ne 0 ]; then exitcode=1; fi;
|
||||
return $exitcode;
|
||||
}
|
||||
|
||||
buildEachRFModule() {
|
||||
getAllRFModules;
|
||||
exitcodesum=0;
|
||||
for RFMODULE in $ALL_RFMODULES; do
|
||||
printf "\e[33;1mBuilding $RFMODULE\e[0m\n";
|
||||
buildRFModule $RFMODULE;
|
||||
if [ $? -ne 0 ]; then exitcodesum=$((exitcodesum + 1)); fi;
|
||||
done;
|
||||
return $exitcodesum;
|
||||
}
|
||||
|
||||
buildReleaseFiles(){
|
||||
if [[ "$BOARD" == "multi4in1:avr:multixmega32d4" ]]; then
|
||||
build_release_orx;
|
||||
elif [[ "$BOARD" == "multi4in1:avr:multiatmega328p:bootloader=none" ]]; then
|
||||
build_release_avr_noboot;
|
||||
elif [[ "$BOARD" == "multi4in1:avr:multiatmega328p:bootloader=optiboot" ]]; then
|
||||
build_release_avr_optiboot;
|
||||
elif [[ "$BOARD" == "multi4in1:STM32F1:multistm32f103cb:debug_option=none" ]]; then
|
||||
build_release_stm32f1_no_debug;
|
||||
elif [[ "$BOARD" == "multi4in1:STM32F1:multistm32f103cb:debug_option=native" ]]; then
|
||||
build_release_stm32f1_native_debug;
|
||||
elif [[ "$BOARD" == "multi4in1:STM32F1:multistm32f103cb:debug_option=ftdi" ]]; then
|
||||
build_release_stm32f1_serial_debug;
|
||||
elif [[ "$BOARD" == "multi4in1:STM32F1:multi5in1t18int" ]]; then
|
||||
build_release_stm32f1_t18int;
|
||||
else
|
||||
printf "No release files for this board.";
|
||||
fi
|
||||
}
|
||||
@@ -1,8 +1,10 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
source ./buildroot/bin/buildFunctions;
|
||||
getMultiVersion;
|
||||
exitcode=0;
|
||||
|
||||
printf "\n\e[33;1mBuilding multi-avr-usbasp-aetr-A7105-inv-v$MULTI_VERSION.bin\e[0m";
|
||||
printf "\e[33;1mBuilding multi-avr-usbasp-aetr-A7105-inv-v$MULTI_VERSION.bin\e[0m\n";
|
||||
opt_disable CHECK_FOR_BOOTLOADER;
|
||||
opt_disable $ALL_PROTOCOLS;
|
||||
opt_enable $A7105_PROTOCOLS;
|
||||
@@ -10,14 +12,14 @@ buildMulti;
|
||||
exitcode=$((exitcode+$?));
|
||||
mv build/Multiprotocol.ino.bin ./binaries/multi-avr-usbasp-aetr-A7105-inv-v$MULTI_VERSION.bin;
|
||||
|
||||
printf "\n\e[33;1mBuilding multi-avr-usbasp-aetr-CC2500-inv-v$MULTI_VERSION.bin\e[0m";
|
||||
printf "\e[33;1mBuilding multi-avr-usbasp-aetr-CC2500-inv-v$MULTI_VERSION.bin\e[0m\n";
|
||||
opt_disable $ALL_PROTOCOLS;
|
||||
opt_enable $CC2500_PROTOCOLS;
|
||||
opt_disable HITEC_CC2500_INO REDPINE_CC2500_INO SKYARTEC_CC2500_INO SCANNER_CC2500_INO;
|
||||
buildMulti;
|
||||
mv build/Multiprotocol.ino.bin ./binaries/multi-avr-usbasp-aetr-CC2500-inv-v$MULTI_VERSION.bin;
|
||||
|
||||
printf "\n\e[33;1mBuilding multi-avr-usbasp-aetr-CYRF6936-inv-v$MULTI_VERSION.bin\e[0m";
|
||||
printf "\e[33;1mBuilding multi-avr-usbasp-aetr-CYRF6936-inv-v$MULTI_VERSION.bin\e[0m\n";
|
||||
opt_disable $ALL_PROTOCOLS;
|
||||
opt_enable $CYRF6936_PROTOCOLS;
|
||||
buildMulti;
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
source ./buildroot/bin/buildFunctions;
|
||||
getMultiVersion;
|
||||
exitcode=0;
|
||||
|
||||
printf "\n\e[33;1mBuilding multi-avr-txflash-aetr-A7105-inv-v$MULTI_VERSION.bin\e[0m";
|
||||
printf "\e[33;1mBuilding multi-avr-txflash-aetr-A7105-inv-v$MULTI_VERSION.bin\e[0m\n";
|
||||
opt_enable CHECK_FOR_BOOTLOADER;
|
||||
opt_disable $ALL_PROTOCOLS;
|
||||
opt_enable $A7105_PROTOCOLS;
|
||||
@@ -10,7 +12,7 @@ buildMulti;
|
||||
exitcode=$((exitcode+$?));
|
||||
mv build/Multiprotocol.ino.bin ./binaries/multi-avr-txflash-aetr-A7105-inv-v$MULTI_VERSION.bin;
|
||||
|
||||
printf "\n\e[33;1mBuilding multi-avr-txflash-aetr-CC2500-inv-v$MULTI_VERSION.bin\e[0m";
|
||||
printf "\e[33;1mBuilding multi-avr-txflash-aetr-CC2500-inv-v$MULTI_VERSION.bin\e[0m\n";
|
||||
opt_disable $ALL_PROTOCOLS;
|
||||
opt_enable $CC2500_PROTOCOLS;
|
||||
opt_disable HITEC_CC2500_INO REDPINE_CC2500_INO SKYARTEC_CC2500_INO SCANNER_CC2500_INO;
|
||||
@@ -18,7 +20,7 @@ buildMulti;
|
||||
exitcode=$((exitcode+$?));
|
||||
mv build/Multiprotocol.ino.bin ./binaries/multi-avr-txflash-aetr-CC2500-inv-v$MULTI_VERSION.bin;
|
||||
|
||||
printf "\n\e[33;1mBuilding multi-avr-txflash-aetr-CYRF6936-inv-v$MULTI_VERSION.bin\e[0m";
|
||||
printf "\e[33;1mBuilding multi-avr-txflash-aetr-CYRF6936-inv-v$MULTI_VERSION.bin\e[0m\n";
|
||||
opt_disable $ALL_PROTOCOLS;
|
||||
opt_enable $CYRF6936_PROTOCOLS;
|
||||
buildMulti;
|
||||
|
||||
@@ -1,27 +1,27 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
source ./buildroot/bin/buildFunctions;
|
||||
getMultiVersion;
|
||||
exitcode=0;
|
||||
|
||||
printf "\n\e[33;1mBuilding multi-orangerx-aetr-green-inv-v$MULTI_VERSION.bin\e[0m";
|
||||
printf "\e[33;1mBuilding multi-orangerx-aetr-green-inv-v$MULTI_VERSION.bin\e[0m\n";
|
||||
opt_enable $ALL_PROTOCOLS;
|
||||
opt_disable ORANGE_TX_BLUE;
|
||||
buildMulti;
|
||||
exitcode=$((exitcode+$?));
|
||||
mv build/Multiprotocol.ino.bin ./binaries/multi-orangerx-aetr-green-inv-v$MULTI_VERSION.bin;
|
||||
|
||||
printf "\n\e[33;1mBuilding multi-orangerx-aetr-blue-inv-v$MULTI_VERSION.bin\e[0m";
|
||||
printf "\e[33;1mBuilding multi-orangerx-aetr-blue-inv-v$MULTI_VERSION.bin\e[0m\n";
|
||||
opt_enable ORANGE_TX_BLUE;
|
||||
buildMulti;
|
||||
exitcode=$((exitcode+$?));
|
||||
mv build/Multiprotocol.ino.bin ./binaries/multi-orangerx-aetr-blue-inv-v$MULTI_VERSION.bin;
|
||||
|
||||
printf "\n\e[33;1mPackaging ancilliary files for v$MULTI_VERSION\e[0m\n";
|
||||
printf "\e[33;1mPackaging ancilliary files for v$MULTI_VERSION\e[0m\n";
|
||||
cp Multiprotocol/Multi.txt ./binaries/Multi.txt;
|
||||
mkdir -p SCRIPTS/TOOLS;
|
||||
cp Lua_scripts/*.lua SCRIPTS/TOOLS/;
|
||||
cp Lua_scripts/*.txt SCRIPTS/TOOLS/;
|
||||
zip -q ./binaries/MultiLuaScripts.zip SCRIPTS/TOOLS/*;
|
||||
|
||||
printf "\n";
|
||||
|
||||
exit $exitcode;
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
source ./buildroot/bin/buildFunctions;
|
||||
getMultiVersion;
|
||||
exitcode=0;
|
||||
|
||||
printf "\n\e[33;1mBuilding multi-stm-xn297dump-usbdebug-v$MULTI_VERSION.bin\e[0m";
|
||||
printf "\e[33;1mBuilding multi-stm-xn297dump-usbdebug-v$MULTI_VERSION.bin\e[0m\n";
|
||||
opt_disable $ALL_PROTOCOLS;
|
||||
opt_add XN297DUMP_NRF24L01_INO;
|
||||
buildMulti;
|
||||
|
||||
@@ -1,26 +1,28 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
source ./buildroot/bin/buildFunctions;
|
||||
getMultiVersion;
|
||||
exitcode=0;
|
||||
|
||||
printf "\n\e[33;1mBuilding multi-stm-serial-aetr-v$MULTI_VERSION.bin\e[0m";
|
||||
printf "\e[33;1mBuilding multi-stm-serial-aetr-v$MULTI_VERSION.bin\e[0m\n";
|
||||
opt_disable ENABLE_PPM;
|
||||
buildMulti;
|
||||
exitcode=$((exitcode+$?));
|
||||
mv build/Multiprotocol.ino.bin ./binaries/multi-stm-serial-aetr-v$MULTI_VERSION.bin;
|
||||
|
||||
printf "\n\e[33;1mBuilding multi-stm-serial-taer-v$MULTI_VERSION.bin\e[0m";
|
||||
printf "\e[33;1mBuilding multi-stm-serial-taer-v$MULTI_VERSION.bin\e[0m\n";
|
||||
opt_replace AETR TAER;
|
||||
buildMulti;
|
||||
exitcode=$((exitcode+$?));
|
||||
mv build/Multiprotocol.ino.bin ./binaries/multi-stm-serial-taer-v$MULTI_VERSION.bin;
|
||||
|
||||
printf "\n\e[33;1mBuilding multi-stm-serial-reta-v$MULTI_VERSION.bin\e[0m";
|
||||
printf "\e[33;1mBuilding multi-stm-serial-reta-v$MULTI_VERSION.bin\e[0m\n";
|
||||
opt_replace TAER RETA;
|
||||
buildMulti;
|
||||
exitcode=$((exitcode+$?));
|
||||
mv build/Multiprotocol.ino.bin ./binaries/multi-stm-serial-reta-v$MULTI_VERSION.bin;
|
||||
|
||||
printf "\n\e[33;1mBuilding multi-stm-cc2500-aetr-v$MULTI_VERSION.bin\e[0m";
|
||||
printf "\e[33;1mBuilding multi-stm-cc2500-aetr-v$MULTI_VERSION.bin\e[0m\n";
|
||||
opt_replace RETA AETR;
|
||||
opt_disable A7105_INSTALLED;
|
||||
opt_disable CYRF6936_INSTALLED;
|
||||
@@ -30,19 +32,19 @@ buildMulti;
|
||||
exitcode=$((exitcode+$?));
|
||||
mv build/Multiprotocol.ino.bin ./binaries/multi-stm-cc2500-aetr-v$MULTI_VERSION.bin;
|
||||
|
||||
printf "\n\e[33;1mBuilding multi-stm-cc2500-taer-v$MULTI_VERSION.bin\e[0m";
|
||||
printf "\e[33;1mBuilding multi-stm-cc2500-taer-v$MULTI_VERSION.bin\e[0m\n";
|
||||
opt_replace AETR TAER;
|
||||
buildMulti;
|
||||
exitcode=$((exitcode+$?));
|
||||
mv build/Multiprotocol.ino.bin ./binaries/multi-stm-cc2500-taer-v$MULTI_VERSION.bin;
|
||||
|
||||
printf "\n\e[33;1mBuilding multi-stm-cc2500-reta-v$MULTI_VERSION.bin\e[0m";
|
||||
printf "\e[33;1mBuilding multi-stm-cc2500-reta-v$MULTI_VERSION.bin\e[0m\n";
|
||||
opt_replace TAER RETA;
|
||||
buildMulti;
|
||||
exitcode=$((exitcode+$?));
|
||||
mv build/Multiprotocol.ino.bin ./binaries/multi-stm-cc2500-reta-v$MULTI_VERSION.bin;
|
||||
|
||||
printf "\n\e[33;1mBuilding multi-stm-ppm-aetr-v$MULTI_VERSION.bin\e[0m";
|
||||
printf "\e[33;1mBuilding multi-stm-ppm-aetr-v$MULTI_VERSION.bin\e[0m\n";
|
||||
opt_enable A7105_INSTALLED;
|
||||
opt_enable CYRF6936_INSTALLED;
|
||||
opt_enable NRF24L01_INSTALLED;
|
||||
@@ -56,13 +58,13 @@ buildMulti;
|
||||
exitcode=$((exitcode+$?));
|
||||
mv build/Multiprotocol.ino.bin ./binaries/multi-stm-ppm-aetr-v$MULTI_VERSION.bin;
|
||||
|
||||
printf "\n\e[33;1mBuilding multi-stm-ppm-taer-v$MULTI_VERSION.bin\e[0m";
|
||||
printf "\e[33;1mBuilding multi-stm-ppm-taer-v$MULTI_VERSION.bin\e[0m\n";
|
||||
opt_replace AETR TAER;
|
||||
buildMulti;
|
||||
exitcode=$((exitcode+$?));
|
||||
mv build/Multiprotocol.ino.bin ./binaries/multi-stm-ppm-taer-v$MULTI_VERSION.bin;
|
||||
|
||||
printf "\n\e[33;1mBuilding multi-stm-ppm-reta-v$MULTI_VERSION.bin\e[0m";
|
||||
printf "\e[33;1mBuilding multi-stm-ppm-reta-v$MULTI_VERSION.bin\e[0m\n";
|
||||
opt_replace TAER RETA;
|
||||
buildMulti;
|
||||
exitcode=$((exitcode+$?));
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
source ./buildroot/bin/buildFunctions;
|
||||
getMultiVersion;
|
||||
exitcode=0;
|
||||
|
||||
printf "\n\e[33;1mBuilding multi-stm-xn297dump-ftdidebug-v$MULTI_VERSION.bin\e[0m";
|
||||
printf "\e[33;1mBuilding multi-stm-xn297dump-ftdidebug-v$MULTI_VERSION.bin\e[0m\n";
|
||||
opt_disable $ALL_PROTOCOLS;
|
||||
opt_add XN297DUMP_NRF24L01_INO;
|
||||
buildMulti;
|
||||
|
||||
@@ -1,21 +1,23 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
source ./buildroot/bin/buildFunctions;
|
||||
getMultiVersion;
|
||||
exitcode=0;
|
||||
|
||||
printf "\n\e[33;1mBuilding multi-t18int-aetr-v$MULTI_VERSION.bin\e[0m";
|
||||
printf "\e[33;1mBuilding multi-t18int-aetr-v$MULTI_VERSION.bin\e[0m\n";
|
||||
opt_disable ENABLE_PPM;
|
||||
opt_disable INVERT_TELEMETRY;
|
||||
buildMulti;
|
||||
exitcode=$((exitcode+$?));
|
||||
mv build/Multiprotocol.ino.bin ./binaries/multi-t18int-aetr-v$MULTI_VERSION.bin;
|
||||
|
||||
printf "\n\e[33;1mBuilding multi-t18int-taer-v$MULTI_VERSION.bin\e[0m";
|
||||
printf "\e[33;1mBuilding multi-t18int-taer-v$MULTI_VERSION.bin\e[0m\n";
|
||||
opt_replace AETR TAER;
|
||||
buildMulti;
|
||||
exitcode=$((exitcode+$?));
|
||||
mv build/Multiprotocol.ino.bin ./binaries/multi-t18int-taer-v$MULTI_VERSION.bin;
|
||||
|
||||
printf "\n\e[33;1mBuilding multi-t18int-reta-v$MULTI_VERSION.bin\e[0m";
|
||||
printf "\e[33;1mBuilding multi-t18int-reta-v$MULTI_VERSION.bin\e[0m\n";
|
||||
opt_replace TAER RETA;
|
||||
buildMulti;
|
||||
exitcode=$((exitcode+$?));
|
||||
|
||||
Reference in New Issue
Block a user