Compare commits

..

59 Commits

Author SHA1 Message Date
Pascal Langer
af71a208fd Ready for release 2022-01-16 11:00:50 +01:00
mheimlich
7e5cb8e884 mention XK A800 in V911S/E119 details (#654) 2022-01-16 10:54:04 +01:00
MattCarothers
8c669ea015 Updated several text fields (#651) 2022-01-09 17:25:11 +01:00
Anders Höglund
acd8379077 A few more Spektrum Fwd Programming text updates (#632)
* DSM FP, Added AR8360T

* DSM FP, Added a few unkown empty lines
2021-11-19 08:37:28 +01:00
Pascal Langer
97c6088715 fix compilation? 2021-11-13 19:08:38 +01:00
Pascal Langer
db017c73b6 HS6200 emulation using CYRF for E01X protocol 2021-11-13 19:03:01 +01:00
Anders Höglund
24aaa0dd0c Text updates in Spektrum Fwd Prog LUA script (#630)
* DSM FP, Added AR636B

* DSM FP, Added AR637TA

* DSM FP, Added On, conflict with AR636B

* DSM FP, Rx name conflict resolved.
2021-11-12 18:37:52 +01:00
Michael
da33df4346 added packet_in[14] to transfer HoTT device warnings to OpenTx (#627) 2021-11-04 14:57:25 +01:00
Pascal Langer
22590ed4f7 Update DSM FwdPrg.lua 2021-10-26 16:34:38 +02:00
Pascal Langer
c0bc64c2aa V911S: increased bind time 2021-10-24 12:03:09 +02:00
Pascal Langer
694d968e8c Update Propel_nrf24l01.ino 2021-10-24 11:04:57 +02:00
Pascal Langer
fff3b8830e MT99xx/A180: F949S flags for RATE, RXLED and 3D6G 2021-10-24 11:04:44 +02:00
Pascal Langer
b740f4cd24 V911S/E119: add 6G_3D channel for P40 plane 2021-10-24 09:57:24 +02:00
Pascal Langer
e247b8b9c1 DSM Fwd Pgm updated 2021-10-20 15:13:56 +02:00
Pascal Langer
4f7af553d1 Update doc 2021-09-17 17:07:15 +02:00
Pascal Langer
570e6f8c64 Update Protocols_Details.md 2021-09-17 09:48:35 +02:00
Pascal Langer
b6e665b567 Devo: fix typo 2021-09-16 16:13:39 +02:00
Pascal Langer
48e82304a0 Update Devo_cyrf6936.ino 2021-09-16 00:30:46 +02:00
Pascal Langer
7b58b9aca0 Devo: support for 2 GPS formats
Use the Fixed ID field, 0/1 first GPS format, +2 for the other format -> 2/3
2021-09-16 00:11:25 +02:00
Pascal Langer
dfcf3f533c Update NRF24l01_SPI.ino 2021-09-16 00:08:47 +02:00
Pascal Langer
4c14925b4f Bump version for release 2021-09-12 19:35:11 +02:00
Pascal Langer
4c74bc869d Update _Config.h 2021-09-11 00:08:09 +02:00
Pascal Langer
45edfa1ec0 AFHDS2A doc update 2021-09-10 23:58:12 +02:00
Pascal Langer
88343b7424 Proto list: fix flags 2021-09-09 08:40:09 +02:00
Pascal Langer
13197840c2 V761: code cleanup 2021-09-09 08:39:37 +02:00
Pascal Langer
ffe4ac68fd Proto list: add number of protocols in the list 2021-09-08 14:30:01 +02:00
Pascal Langer
5bab5f03db Update Multi_Protos.ino 2021-09-08 13:38:25 +02:00
Pascal Langer
ae748e25f8 Update XN297Dump_nrf24l01.ino 2021-09-07 23:17:21 +02:00
Pascal Langer
e9c7959ecb Update V761_nrf24l01.ino 2021-09-07 23:17:11 +02:00
Pascal Langer
bf09855014 Another attempt 2021-09-07 16:59:06 +02:00
Pascal Langer
32bd39f209 Save space in the 5in1 modules 2021-09-07 15:07:37 +02:00
Pascal Langer
940f241b9d Fix compilation issues 2021-09-07 14:29:35 +02:00
Pascal Langer
5c00ce6b88 New 0 protocol: enable to list all protocols and sub protocols 2021-09-07 14:08:24 +02:00
Pascal Langer
016b282246 Multi Status: send frame as soon as a new protocol is selected 2021-09-05 22:15:56 +02:00
Pascal Langer
d6ecac1302 Xerall: few improvements 2021-09-04 11:48:41 +02:00
Ben Lye
901f8ca6b0 Disable some protocols for the DIY 5-in-1 (#618) 2021-09-01 15:20:10 +02:00
Pascal Langer
9c3b6ba9f6 Update Validate.h 2021-09-01 09:45:38 +02:00
Pascal Langer
53ec484028 Update Validate.h 2021-09-01 01:39:26 +02:00
Pascal Langer
246e808cb4 Xerall protocol 2021-09-01 01:21:38 +02:00
Pascal Langer
a7b68dc2aa F949G: will it work? 2021-08-27 10:22:47 +02:00
Pascal Langer
08404f9223 F949G: another try... 2021-08-26 23:43:42 +02:00
Pascal Langer
149554e61c Update MT99xx_ccnrf.ino 2021-08-26 23:23:38 +02:00
Pascal Langer
7b71425db2 F949G test with original radio ID 2021-08-26 23:19:59 +02:00
Pascal Langer
f9cfb7f20f Update Protocols_Details.md 2021-08-26 22:51:57 +02:00
Pascal Langer
506ee43d41 Update _Config.h 2021-08-26 22:35:42 +02:00
Pascal Langer
ebde0915cd MT99xx/F949G: new sub protocol 2021-08-26 22:33:38 +02:00
Pascal Langer
2501656bf4 Update XN297Dump_nrf24l01.ino 2021-08-26 11:52:36 +02:00
Pascal Langer
9356e7654e XN297EMU: allows to send and receive 0 payload length in enhanced mode 2021-08-25 19:07:36 +02:00
Pascal Langer
4f1e5d2452 BUGSMINI: fix
No one has reported an issue but from the look of the code it was broken since some time...
2021-08-25 19:05:24 +02:00
Ben Lye
64c75414d8 Add release build for 64KB CC2500-only module (#615) 2021-08-24 20:54:46 +02:00
Pascal Langer
5147833487 DSM RX: use directly the TX type and channels 2021-08-21 10:14:05 +02:00
Ben Lye
324419241f Prefix release binaries with mm instead of multi (#596)
Better for radios with 128x64 LCDs.
2021-08-16 17:59:07 +02:00
Pascal Langer
1a921b1cdb Disable multi config if telemetry is disabled 2021-07-05 17:08:57 +02:00
Pascal Langer
25c052c0a3 KF606: new sub protocol MIG320 2021-07-04 14:05:42 +02:00
Pascal Langer
a02586cca9 RadioLink: RSSI correction 2021-07-03 14:09:28 +02:00
Pascal Langer
226e082c5a E129 and E010R5 not supported on atmega328p 2021-06-30 09:45:25 +02:00
Pascal Langer
5afdff8477 V911S: Rate channel on CH6 (default is high) 2021-06-28 18:10:44 +02:00
Pascal Langer
c52ac2cefc Fix XN297Dump enhanced payload detection 2021-06-28 18:04:17 +02:00
pascallanger
09f39ea60f Update README.md 2021-06-27 12:38:53 +02:00
38 changed files with 1383 additions and 573 deletions

316
Lua_scripts/DSM FwdPrg.lua Normal file → Executable file
View File

@@ -1,4 +1,4 @@
local toolName = "TNS|DSM Forward Programming|TNE" local toolName = "TNS|DSM Forward Programming v0.2|TNE"
---- ######################################################################### ---- #########################################################################
---- # # ---- # #
@@ -31,11 +31,12 @@ local toolName = "TNS|DSM Forward Programming|TNE"
-- Write "DSM" at address 0..2 -- Write "DSM" at address 0..2
--############################################################################### --###############################################################################
local RX_VERSION, WAIT_CMD, MENU_TITLE, MENU_LINES, MENU_VALUES, VALUE_CHANGING, VALUE_CHANGING_WAIT, VALUE_CHANGED = 0, 1, 2, 3, 4, 5, 6, 7 local RX_VERSION, WAIT_CMD, MENU_TITLE, MENU_LINES, MENU_VALUES, VALUE_CHANGING, VALUE_CHANGING_WAIT, VALUE_CHANGED, EXIT, EXIT_DONE = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
local MENU, LIST_MENU_NOCHANGING, LIST_MENU2, PERCENTAGE_VALUE = 0x1C, 0x6C, 0x4C, 0xC0 local MENU, LIST_MENU_NOCHANGING, LIST_MENU1, LIST_MENU2, VALUE_NOCHANGING = 0x1C, 0x6C, 0x0C, 0x4C, 0x60
local Phase = RX_VERSION local Phase = RX_VERSION
local Waiting_RX = 0 local Waiting_RX = 0
local Text = {} local Text = {}
local RxName = {}
local Retry=100 local Retry=100
local Blink = 0 local Blink = 0
local Value_Changed=0 local Value_Changed=0
@@ -44,13 +45,30 @@ local Menu = { Cur=nil, Id=nil, Title="", Prev=nil, PrevId=nil, Next=nil, NextId
local Line = {} local Line = {}
local RX = { Name="", Version="" } local RX = { Name="", Version="" }
-- used for debug
local rxAnswer = ""
local debugLine = 0
------------------------------------------------------------------------------------------------------------
local function GetDebugInfo(lineNr) -- used for debug
local i
debugLine = lineNr
rxAnswer = "RX:"
for i=10, 25 do
rxAnswer = rxAnswer.." "..string.format("%02X", multiBuffer(i))
end
end
------------------------------------------------------------------------------------------------------------
local function conv_int16(number) local function conv_int16(number)
if number >= 0x8000 then if number >= 0x8000 then
return number - 0x10000 return number - 0x10000
end end
return number return number
end end
------------------------------------------------------------------------------------------------------------
local function Get_Text(index) local function Get_Text(index)
out = Text[index] out = Text[index]
if out == nil then -- unknown... if out == nil then -- unknown...
@@ -58,11 +76,20 @@ local function Get_Text(index)
end end
return out return out
end end
------------------------------------------------------------------------------------------------------------
local function Get_RxName(index)
out = RxName[index]
if out == nil then -- unknown...
out = "Unknown_"..string.format("%X",index)
end
return out
end
------------------------------------------------------------------------------------------------------------
local function DSM_Release() local function DSM_Release()
multiBuffer( 0, 0 ) multiBuffer( 0, 0 )
Phase = EXIT_DONE
end end
------------------------------------------------------------------------------------------------------------
local function DSM_Send(...) local function DSM_Send(...)
local arg = {...} local arg = {...}
for i = 1 , #arg do for i = 1 , #arg do
@@ -70,7 +97,7 @@ local function DSM_Send(...)
end end
multiBuffer( 3, 0x70+#arg) multiBuffer( 3, 0x70+#arg)
end end
------------------------------------------------------------------------------------------------------------
local function Value_Add(dir) local function Value_Add(dir)
local line=Line[Menu.SelLine] local line=Line[Menu.SelLine]
Speed = getRotEncSpeed() Speed = getRotEncSpeed()
@@ -91,17 +118,25 @@ local function Value_Add(dir)
Waiting_RX = 0 Waiting_RX = 0
end end
end end
------------------------------------------------------------------------------------------------------------
local function DSM_Menu(event) local function DSM_Menu(event)
local Speed = 0 local Speed = 0
if event == EVT_VIRTUAL_NEXT then
if event == EVT_VIRTUAL_EXIT then
if Phase == RX_VERSION then
DSM_Release()
else
Phase = EXIT
Waiting_RX = 0
end
elseif event == EVT_VIRTUAL_NEXT then
if Menu.EditLine == nil then if Menu.EditLine == nil then
-- not changing a value -- not changing a value
if Menu.SelLine ~= nil then if Menu.SelLine ~= nil then
if Menu.SelLine < 7 then if Menu.SelLine < 7 then
local num = Menu.SelLine local num = Menu.SelLine
for i = Menu.SelLine + 1, 6, 1 do for i = Menu.SelLine + 1, 6, 1 do
if Line[i].Type ~= nil and Line[i].Next ~= nil then if Line[i].Type ~= nil and Line[i].Next ~= nil and Line[i].Type ~= VALUE_NOCHANGING then
Menu.SelLine=i Menu.SelLine=i
break break
end end
@@ -131,7 +166,7 @@ local function DSM_Menu(event)
end end
local num = Menu.SelLine local num = Menu.SelLine
for i = Menu.SelLine-1, 0, -1 do for i = Menu.SelLine-1, 0, -1 do
if Line[i].Type ~= nil and Line[i].Next ~= nil then if Line[i].Type ~= nil and Line[i].Next ~= nil and Line[i].Type ~= VALUE_NOCHANGING then
Menu.SelLine=i Menu.SelLine=i
break break
end end
@@ -146,6 +181,15 @@ local function DSM_Menu(event)
else -- need to dec the value else -- need to dec the value
Value_Add(-1) Value_Add(-1)
end end
elseif event == EVT_VIRTUAL_ENTER_LONG then
if Menu.EditLine ~= nil then
-- reset the value to default
if Line[Menu.SelLine].Type ~= LIST_MENU_NOCHANGING then
Line[Menu.SelLine].Val = Line[Menu.SelLine].Def
Phase = VALUE_CHANGING
Waiting_RX = 0
end
end
elseif event == EVT_VIRTUAL_ENTER then elseif event == EVT_VIRTUAL_ENTER then
if Menu.SelLine == -1 then -- Back if Menu.SelLine == -1 then -- Back
Menu.Cur = Menu.Back Menu.Cur = Menu.Back
@@ -185,23 +229,27 @@ local function DSM_Menu(event)
end end
end end
end end
------------------------------------------------------------------------------------------------------------
local function DSM_Send_Receive() local function DSM_Send_Receive()
if Waiting_RX == 0 then if Waiting_RX == 0 then
Waiting_RX = 1 Waiting_RX = 1
-- Need to send a request
-- Need to send a request
if Phase == RX_VERSION then -- request RX version if Phase == RX_VERSION then -- request RX version
DSM_Send(0x11,0x06,0x00,0x14,0x00,0x00) DSM_Send(0x11,0x06,0x00,0x14,0x00,0x00)
elseif Phase == WAIT_CMD then -- keep connection open
elseif Phase == WAIT_CMD then -- keep connection open
DSM_Send(0x00,0x04,0x00,0x00) DSM_Send(0x00,0x04,0x00,0x00)
elseif Phase == MENU_TITLE then -- request menu title
elseif Phase == MENU_TITLE then -- request menu title
if Menu.Cur == nil then if Menu.Cur == nil then
DSM_Send(0x12,0x06,0x00,0x14,0x00,0x00) -- first menu only DSM_Send(0x12,0x06,0x00,0x14,0x00,0x00) -- first menu only
Menu.Cur = 0 Menu.Cur = 0
else else
DSM_Send(0x16,0x06,Menu.Id,Menu.Cur,0x00,Menu.SelLine) DSM_Send(0x16,0x06,Menu.Id,Menu.Cur,0x00,Menu.SelLine)
end end
elseif Phase == MENU_LINES then -- request menu lines
elseif Phase == MENU_LINES then -- request menu lines
if Menu.CurLine == nil then if Menu.CurLine == nil then
DSM_Send(0x13,0x04,Menu.Id,Menu.Cur) -- line 0 DSM_Send(0x13,0x04,Menu.Id,Menu.Cur) -- line 0
elseif Menu.CurLine >= 0x80 then elseif Menu.CurLine >= 0x80 then
@@ -210,46 +258,59 @@ local function DSM_Send_Receive()
else else
DSM_Send(0x14,0x06,Menu.Id,Menu.Cur,0x00,Menu.CurLine) -- line X DSM_Send(0x14,0x06,Menu.Id,Menu.Cur,0x00,Menu.CurLine) -- line X
end end
elseif Phase == MENU_VALUES then -- request menu values
DSM_Send(0x15,0x06,Menu.Id,Menu.Cur,Line[Menu.CurLine].ValId,Menu.CurLine) -- line X elseif Phase == MENU_VALUES then -- request menu values
elseif Phase == VALUE_CHANGING then -- send value DSM_Send(0x15,0x06,Menu.Id,Menu.Cur,Line[Menu.CurLine].ValId,Line[Menu.CurLine].Next) -- line X
local value=Line[Menu.SelLine].Val
elseif Phase == VALUE_CHANGING then -- send value
local value=Line[Menu.SelLine].Val
if value < 0 then if value < 0 then
value = 0x10000 + value value = 0x10000 + value
end end
DSM_Send(0x18,0x06,Line[Menu.SelLine].ValId,Menu.SelLine,bit32.rshift(value,8),bit32.band(value,0xFF)) -- send current value DSM_Send(0x18,0x06,Line[Menu.SelLine].ValId,Line[Menu.SelLine].Next,bit32.rshift(value,8),bit32.band(value,0xFF)) -- send current value
Phase = VALUE_CHANGING_WAIT Phase = VALUE_CHANGING_WAIT
elseif Phase == VALUE_CHANGED then -- send value
elseif Phase == VALUE_CHANGED then -- send value
if Value_Changed == 0 then if Value_Changed == 0 then
local value=Line[Menu.SelLine].Val local value=Line[Menu.SelLine].Val
if value < 0 then if value < 0 then
value = 0x10000 + value value = 0x10000 + value
end end
DSM_Send(0x18,0x06,Line[Menu.SelLine].ValId,Menu.SelLine,bit32.rshift(value,8),bit32.band(value,0xFF)) -- send current value DSM_Send(0x18,0x06,Line[Menu.SelLine].ValId,Line[Menu.SelLine].Next,bit32.rshift(value,8),bit32.band(value,0xFF)) -- send current value
Value_Changed = Value_Changed + 1 Value_Changed = Value_Changed + 1
Waiting_RX = 0 Waiting_RX = 0
elseif Value_Changed == 1 then elseif Value_Changed == 1 then
DSM_Send(0x19,0x06,Line[Menu.SelLine].ValId,Menu.SelLine) -- validate DSM_Send(0x19,0x06,Line[Menu.SelLine].ValId,Line[Menu.SelLine].Next) -- validate
-- Value_Changed = Value_Changed + 1 -- Value_Changed = Value_Changed + 1
-- Waiting_RX = 0 -- Waiting_RX = 0
--elseif Value_Changed == 2 then --elseif Value_Changed == 2 then
-- DSM_Send(0x1B,0x06,0x10,Menu.SelLine) -- validate again? -- DSM_Send(0x1B,0x06,0x10,Menu.SelLine) -- validate again?
-- Value_Changed = Value_Changed + 1 -- Value_Changed = Value_Changed + 1
end end
elseif Phase == VALUE_CHANGING_WAIT then
DSM_Send(0x1A,0x06,Line[Menu.SelLine].ValId,Menu.SelLine) elseif Phase == VALUE_CHANGING_WAIT then
end DSM_Send(0x1A,0x06,Line[Menu.SelLine].ValId,Line[Menu.SelLine].Next)
elseif Phase == EXIT then
DSM_Send(0x1F,0x02,0xAA)
end
multiBuffer(10,0x00); multiBuffer(10,0x00);
Retry = 50 Retry = 50
-- -- -- -- -- -- -- -- -- -- -- -- receive part -- -- -- -- -- -- -- -- -- -- -- -- --
elseif multiBuffer(10) == 0x09 then elseif multiBuffer(10) == 0x09 then
-- Answer received -- Answer received
--if multiBuffer(11) == 0x00 then -- waiting for commands? -- GetDebugInfo(292) -- used for debug
if multiBuffer(11) == 0x01 then -- read version
--ex: 0x09 0x01 0x00 0x15 0x02 0x22 0x01 0x00 0x14 0x00 0x00 0x00 0x00 0x00 0x00 0x00 --if multiBuffer(11) == 0x00 then -- waiting for commands?
RX.Name = Get_Text(multiBuffer(13))
if multiBuffer(11) == 0x01 then -- read version
--ex: 0x09 0x01 0x00 0x15 0x02 0x22 0x01 0x00 0x14 0x00 0x00 0x00 0x00 0x00 0x00 0x00
RX.Name = Get_RxName(multiBuffer(13))
RX.Version = multiBuffer(14).."."..multiBuffer(15).."."..multiBuffer(16) RX.Version = multiBuffer(14).."."..multiBuffer(15).."."..multiBuffer(16)
Phase = MENU_TITLE Phase = MENU_TITLE
elseif multiBuffer(11) == 0x02 then -- read menu title
elseif multiBuffer(11) == 0x02 then -- read menu title
--ex: 0x09 0x02 0x4F 0x10 0xA5 0x00 0x00 0x00 0x50 0x10 0x10 0x10 0x00 0x00 0x00 0x00 --ex: 0x09 0x02 0x4F 0x10 0xA5 0x00 0x00 0x00 0x50 0x10 0x10 0x10 0x00 0x00 0x00 0x00
Menu.Cur = multiBuffer(12) Menu.Cur = multiBuffer(12)
Menu.Id = multiBuffer(13) Menu.Id = multiBuffer(13)
@@ -271,7 +332,8 @@ local function DSM_Send_Receive()
end end
Blink = 0 Blink = 0
Phase = MENU_LINES Phase = MENU_LINES
elseif multiBuffer(11) == 0x03 then -- read menu lines
elseif multiBuffer(11) == 0x03 then -- read menu lines
--ex: 0x09 0x03 0x00 0x10 0x00 0x1C 0xF9 0x00 0x10 0x10 0x00 0x00 0x00 0x00 0x03 0x00 --ex: 0x09 0x03 0x00 0x10 0x00 0x1C 0xF9 0x00 0x10 0x10 0x00 0x00 0x00 0x00 0x03 0x00
-- Menu Id line Type Text_idx Next V_Id Val_Min Val_Max Val_Def -- Menu Id line Type Text_idx Next V_Id Val_Min Val_Max Val_Def
--ex: 0x09 0x03 0x61 0x10 0x00 0x6C 0x50 0x00 0x00 0x10 0x36 0x00 0x49 0x00 0x36 0x00 --ex: 0x09 0x03 0x61 0x10 0x00 0x6C 0x50 0x00 0x00 0x10 0x36 0x00 0x49 0x00 0x36 0x00
@@ -279,13 +341,13 @@ local function DSM_Send_Receive()
local line = Line[Menu.CurLine] local line = Line[Menu.CurLine]
line.Menu = multiBuffer(12) line.Menu = multiBuffer(12)
line.Id = multiBuffer(13) -- not quite sure yet line.Id = multiBuffer(13) -- not quite sure yet
line.Type = multiBuffer(15) -- not quite sure yet: 1C is text menu only, 4C/6C is text followed by text list, C0 is text followed by percentage value line.Type = multiBuffer(15) -- not quite sure yet: 1C is text menu only, 4C/6C is text followed by text list, C0 is text followed by percentage value, 0C new list type
line.Text = Get_Text(multiBuffer(16)+multiBuffer(17)*256) line.Text = Get_Text(multiBuffer(16)+multiBuffer(17)*256)
if multiBuffer(18) == Menu.Cur then --if multiBuffer(18) == Menu.Cur then
line.Next = nil -- line.Next = nil
else --else
line.Next = multiBuffer(18) -- not quite sure yet: 1C=text menu=>next menu, others=>line number of the value line.Next = multiBuffer(18) -- not quite sure yet: 1C=text menu=>next menu, others=>identifier of line number of the value
end --end
if Menu.SelLine == -1 and line.Next ~= nil then -- Auto select first line of the menu if Menu.SelLine == -1 and line.Next ~= nil then -- Auto select first line of the menu
Menu.SelLine = Menu.CurLine Menu.SelLine = Menu.CurLine
end end
@@ -297,7 +359,7 @@ local function DSM_Send_Receive()
line.Def = conv_int16(multiBuffer(24)+multiBuffer(25)*256) line.Def = conv_int16(multiBuffer(24)+multiBuffer(25)*256)
if line.Type == MENU then if line.Type == MENU then
-- nothing to do on menu entries -- nothing to do on menu entries
elseif line.Type == LIST_MENU_NOCHANGING or line.Type == LIST_MENU2 then elseif line.Type == LIST_MENU_NOCHANGING or line.Type == LIST_MENU1 or line.Type == LIST_MENU2 then
line.Val = nil --line.Def - line.Min -- use default value not sure if needed line.Val = nil --line.Def - line.Min -- use default value not sure if needed
line.Def = line.Min -- pointer to the start of the list in Text line.Def = line.Min -- pointer to the start of the list in Text
line.Max = line.Max - line.Min -- max index line.Max = line.Max - line.Min -- max index
@@ -305,43 +367,66 @@ local function DSM_Send_Receive()
else -- default to numerical value else -- default to numerical value
line.Val = nil --line.Def -- use default value not sure if needed line.Val = nil --line.Def -- use default value not sure if needed
end end
if line.Type ~= 0x1C then -- value to follow if line.Type ~= MENU and line.Type ~= VALUE_NOCHANGING then -- updatable value to follow
line.Text = line.Text..":" line.Text = line.Text..":"
end end
Phase = MENU_LINES Phase = MENU_LINES
elseif multiBuffer(11) == 0x04 then -- read menu values
elseif multiBuffer(11) == 0x04 then -- read menu values
--ex: 0x09 0x04 0x53 0x10 0x00 0x10 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 --ex: 0x09 0x04 0x53 0x10 0x00 0x10 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
-- Menu MeId line VaId Value -- Menu MeId line VaId Value
--ex: 0x09 0x04 0x61 0x10 0x02 0x10 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 --ex: 0x09 0x04 0x61 0x10 0x02 0x10 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
Menu.CurLine = multiBuffer(14) -- Identify the line and update the value
Line[Menu.CurLine].Val = conv_int16(multiBuffer(16)+multiBuffer(17)*256) for i = 0, 6 do
if Line[i] ~= nil and Line[i].Type ~= nil then
if Line[i].Type ~= MENU and Line[i].Next == multiBuffer(14) then -- identifier of line number stored in .Next
Line[i].Val = conv_int16(multiBuffer(16)+multiBuffer(17)*256)
Menu.CurLine = i
break
end
end
end
Phase = MENU_VALUES Phase = MENU_VALUES
elseif multiBuffer(11) == 0x05 then -- unknown... need to get through the lines...
elseif multiBuffer(11) == 0x05 then -- unknown... need to get through the lines...
Menu.CurLine = 0x80 + multiBuffer(12) Menu.CurLine = 0x80 + multiBuffer(12)
Phase = MENU_LINES Phase = MENU_LINES
elseif multiBuffer(11) == 0x00 and Phase == VALUE_CHANGING then
elseif multiBuffer(11) == 0xA7 then -- answer to EXIT command
DSM_Release()
elseif multiBuffer(11) == 0x00 and Phase == VALUE_CHANGING then
Phase = VALUE_CHANGING_WAIT Phase = VALUE_CHANGING_WAIT
end
-- Data processed end
-- Data processed
Waiting_RX = 0 Waiting_RX = 0
multiBuffer(10,0x00) multiBuffer(10,0x00)
Retry = 50 Retry = 50
else else
Retry = Retry - 1 Retry = Retry - 1
if Retry <= 0 then if Retry <= 0 then
-- Retry the RX request -- Retry the RX request
Retry = 50 Retry = 50
Waiting_RX = 0 Waiting_RX = 0
if Phase == EXIT then
DSM_Release()
end
if Phase ~= RX_VERSION and Phase ~= VALUE_CHANGING_WAIT then if Phase ~= RX_VERSION and Phase ~= VALUE_CHANGING_WAIT then
Phase = WAIT_CMD Phase = WAIT_CMD
end end
end end
end end
end end
------------------------------------------------------------------------------------------------------------
local function DSM_Display() local function DSM_Display()
lcd.clear() lcd.clear()
if LCD_W == 480 then if LCD_W == 480 then
--lcd.drawText(10,55,debugLine.." "..rxAnswer) -- draw debug info
--Draw title --Draw title
lcd.drawFilledRectangle(0, 0, LCD_W, 30, TITLE_BGCOLOR) lcd.drawFilledRectangle(0, 0, LCD_W, 30, TITLE_BGCOLOR)
lcd.drawText(1, 5, "DSM Forward Programming", MENU_TITLE_COLOR) lcd.drawText(1, 5, "DSM Forward Programming", MENU_TITLE_COLOR)
@@ -362,12 +447,13 @@ local function DSM_Display()
if Line[i].Type ~= MENU then -- list/value if Line[i].Type ~= MENU then -- list/value
if Line[i].Val ~= nil then if Line[i].Val ~= nil then
local text="" local text=""
if Line[i].Type == LIST_MENU_NOCHANGING or Line[i].Type == LIST_MENU2 then if Line[i].Type == LIST_MENU_NOCHANGING or Line[i].Type == LIST_MENU1 or Line[i].Type == LIST_MENU2 then
text = Get_Text(Line[i].Val+Line[i].Def) text = Get_Text(Line[i].Val+Line[i].Def)
elseif Line[i].Type == PERCENTAGE_VALUE then elseif ( Line[i].Min == 0 and Line[i].Max == 100) or ( Line[i].Min == -100 and Line[i].Max == 100) or ( Line[i].Min == 0 and Line[i].Max == 150) or ( Line[i].Min == -150 and Line[i].Max == 150) then
text = Line[i].Val.." %" text = Line[i].Val.." %"
else else
text = Line[i].Val --text = Line[i].Val .." T="..Line[i].Type -- used for debug
text = Line[i].Val
end end
if Menu.EditLine == Menu.SelLine then -- blink edited entry if Menu.EditLine == Menu.SelLine then -- blink edited entry
Blink = Blink + 1 Blink = Blink + 1
@@ -437,7 +523,7 @@ local function DSM_Display()
-- end -- end
end end
end end
------------------------------------------------------------------------------------------------------------
-- Init -- Init
local function DSM_Init() local function DSM_Init()
--Set protocol to talk to --Set protocol to talk to
@@ -456,11 +542,30 @@ local function DSM_Init()
multiBuffer( 1, string.byte('S') ) multiBuffer( 1, string.byte('S') )
multiBuffer( 2, string.byte('M') ) multiBuffer( 2, string.byte('M') )
--Text to be displayed -> need to use a file instead?
--RX names-- --RX names--
Text[0x0014]="SPM4651T" RxName[0x0001]="AR636B"
Text[0x0015]="AR637T" RxName[0x0014]="SPM4651T"
RxName[0x0015]="AR637T"
RxName[0x0016]="AR637TA"
RxName[0x0018]="FC6250HX"
RxName[0x001A]="AR8360T"
RxName[0x001E]="AR631"
--Text to be displayed -> need to use a file instead?
Text[0x0001]="On"
Text[0x0002]="Off"
Text[0x0003]="Inh"
Text[0x0004]="Act"
Text[0x000C]="Inhibit?" --?
Text[0x000D]="Gear"
--Lists-- --Lists--
Text[0x002E]="11ms"
Text[0x002F]="22ms"
Text[0x0032]="1 X"
Text[0x0033]="2 X"
Text[0x0034]="4 X"
Text[0x0035]="Inhibit?" --?
Text[0x0036]="Throttle" Text[0x0036]="Throttle"
Text[0x0037]="Aileron" Text[0x0037]="Aileron"
Text[0x0038]="Elevator" Text[0x0038]="Elevator"
@@ -479,9 +584,12 @@ local function DSM_Init()
Text[0x0040]="Roll" Text[0x0040]="Roll"
Text[0x0041]="Pitch" Text[0x0041]="Pitch"
Text[0x0042]="Yaw" Text[0x0042]="Yaw"
Text[0x0043]="Gain" -- FC6250HX
Text[0x0045]="Differential"
Text[0x0046]="Priority" Text[0x0046]="Priority"
Text[0x0049]="Output Setup" -- FC6250HX
--****** --******
Text[0x004A]="Failsafe" Text[0x004A]="Failsafe"
Text[0x004B]="Main Menu" Text[0x004B]="Main Menu"
Text[0x004E]="Position" Text[0x004E]="Position"
@@ -497,21 +605,32 @@ local function DSM_Init()
Text[0x0060]="Preset" Text[0x0060]="Preset"
--Text[0x0061]="Custom" --Text[0x0061]="Custom"
--Messages-- --Messages--
Text[0x0071]="Proportional"
Text[0x0072]="Integral"
Text[0x0073]="Derivate"
Text[0x0078]="FM Channel" Text[0x0078]="FM Channel"
Text[0x0080]="Orientation" Text[0x0080]="Orientation"
Text[0x0082]="Heading"
Text[0x0085]="Frame Rate" Text[0x0085]="Frame Rate"
Text[0x0086]="System Setup" Text[0x0086]="System Setup"
Text[0x0087]="F-Mode Setup" Text[0x0087]="F-Mode Setup"
Text[0x0088]="Enabled F-Modes" Text[0x0088]="Enabled F-Modes"
Text[0x0089]="Gain Channel"
Text[0x008A]="Gain Sensitivity" Text[0x008A]="Gain Sensitivity"
Text[0x008B]="Panic"
Text[0x0090]="Apply" Text[0x0090]="Apply"
Text[0x0092]="Start"
Text[0x0093]="Complete" Text[0x0093]="Complete"
Text[0x0094]="Done" Text[0x0094]="Done"
Text[0x0097]="Factory Reset" Text[0x0097]="Factory Reset"
Text[0x0099]="Advanced Setup"
Text[0x009A]="Capture Failsafe Positions" Text[0x009A]="Capture Failsafe Positions"
Text[0x009C]="Custom Failsafe" Text[0x009C]="Custom Failsafe"
Text[0x00A5]="First Time Setup" Text[0x00A5]="First Time Setup"
Text[0x00AA]="Capture Gyro Gains"
Text[0x00AD]="Gain Channel Select" Text[0x00AD]="Gain Channel Select"
Text[0x00B0]="Self-Level/Angle Dem"
Text[0x00B5]="Inhibit"
Text[0x00B6]="FM1" Text[0x00B6]="FM1"
Text[0x00B7]="FM2" Text[0x00B7]="FM2"
Text[0x00B8]="FM3" Text[0x00B8]="FM3"
@@ -522,78 +641,125 @@ local function DSM_Init()
Text[0x00BD]="FM8" Text[0x00BD]="FM8"
Text[0x00BE]="FM9" Text[0x00BE]="FM9"
Text[0x00BF]="FM10" Text[0x00BF]="FM10"
Text[0x00C7]="Calibrate Sensor"
Text[0x00CA]="SAFE/Panic Mode Setup"
Text[0x00D3]="Swashplate"
Text[0x00D5]="Agility"
Text[0x00D8]="Stop"
Text[0x00DA]="SAFE"
Text[0x00DB]="Stability"
Text[0x00DC]="@ per sec"
Text[0x00DD]="Tail rotor"
Text[0x00DE]="Setup"
Text[0x00DF]="AFR"
Text[0x00E0]="Collective"
Text[0x00E1]="Subtrim"
Text[0x00E2]="Phasing"
Text[0x00E4]="E-Ring"
Text[0x00E7]="Left"
Text[0x00E8]="Right"
Text[0x00F2]="Fixed"
Text[0x00F3]="Adjustable"
Text[0x00F9]="Gyro settings" Text[0x00F9]="Gyro settings"
Text[0x00FE]="Stick Priority" Text[0x00FE]="Stick Priority"
Text[0x0100]="Make sure the model has been" Text[0x0100]="Make sure the model has been"
Text[0x0101]="configured, including wing type," Text[0x0101]="configured, including wing type,"
Text[0x0102]="reversing, travel, trimmed, etc." Text[0x0102]="reversing, travel, trimmed, etc."
Text[0x0103]="before continuing setup." Text[0x0103]="before continuing setup."
Text[0x0104]="0104"
Text[0x0105]="0105"
Text[0x0106]="Any wing type, channel assignment," Text[0x0106]="Any wing type, channel assignment,"
Text[0x0107]="subtrim, or servo reversing changes" Text[0x0107]="subtrim, or servo reversing changes"
Text[0x0108]="require running through initial" Text[0x0108]="require running through initial"
Text[0x0109]="setup again." Text[0x0109]="setup again."
Text[0x010A]="010A"
Text[0x010B]="010B"
Text[0x0190]="Relearn Servo Settings" Text[0x0190]="Relearn Servo Settings"
Text[0x019C]="Enter Receiver Bind Mode" Text[0x019C]="Enter Receiver Bind Mode"
Text[0x01D7]="SAFE Select Channel"
Text[0x01DC]="AS3X" Text[0x01DC]="AS3X"
Text[0x01DD]="AS3X Settings" Text[0x01DD]="AS3X Settings"
Text[0x01DE]="AS3X Gains" Text[0x01DE]="AS3X Gains"
Text[0x01E0]="Rate Gains" Text[0x01E0]="Rate Gains"
Text[0x020A]="Restore from Backup" Text[0x01E2]="SAFE Settings"
Text[0x01E3]="SAFE Gains"
Text[0x01E6]="Attitude Trim"
Text[0x01E7]="Envelope"
Text[0x01E9]="Roll Right"
Text[0x01EA]="Roll Left"
Text[0x01EB]="Pitch Down"
Text[0x01EC]="Pitch Up"
Text[0x01EE]="Throttle to Pitch"
Text[0x01EF]="Low Thr to Pitch"
Text[0x01F0]="High Thr to Pitch"
Text[0x01F3]="Threshold"
Text[0x01F4]="Angle"
Text[0x01F6]="Failsafe Angles"
Text[0x01F8]="Safe Mode"
Text[0x01F9]="SAFE Select"
Text[0x01FD]="SAFE Failsafe FMode"
Text[0x0208]="Decay"
Text[0x0209]="Save to Backup" Text[0x0209]="Save to Backup"
Text[0x020A]="Restore from Backup"
Text[0x020D]="First Time SAFE Setup" Text[0x020D]="First Time SAFE Setup"
Text[0x021A]="Set the model level," Text[0x021A]="Set the model level,"
Text[0x021B]="and press Continue." Text[0x021B]="and press Continue."
Text[0x021C]="021C" Text[0x021C]="" -- empty??
Text[0x021D]="021D" Text[0x021D]="" -- empty??
Text[0x021F]="Set the model on its nose," Text[0x021F]="Set the model on its nose,"
Text[0x0220]="and press Continue. If the" Text[0x0220]="and press Continue. If the"
Text[0x0221]="orientation on the next" Text[0x0221]="orientation on the next"
Text[0x0222]="screen is wrong go back" Text[0x0222]="screen is wrong go back"
Text[0x0223]="and try again." Text[0x0223]="and try again."
Text[0x0224]="Continue" Text[0x0224]="Continue"
Text[0x0229]="Set Orientation Manually" Text[0x0226]="Angle Limits"
Text[0x0227]="Other settings" Text[0x0227]="Other settings"
Text[0x0229]="Set Orientation Manually"
Text[0x022B]="WARNING!" Text[0x022B]="WARNING!"
Text[0x022C]="This will reset the" Text[0x022C]="This will reset the"
Text[0x022D]="configuration to factory" Text[0x022D]="configuration to factory"
Text[0x022E]="defaults. This does not" Text[0x022E]="defaults. This does not"
Text[0x022F]="affect the backup config." Text[0x022F]="affect the backup config."
Text[0x0230]="0230" Text[0x0230]="" -- empty??
Text[0x0231]="This will overwrite the" Text[0x0231]="This will overwrite the"
Text[0x0232]="backup memory with your" Text[0x0232]="backup memory with your"
Text[0x0233]="current configuartion." Text[0x0233]="current configuartion."
Text[0x0234]="0234" Text[0x0234]="" -- blank line
Text[0x0235]="0235" Text[0x0235]="" -- blank line
Text[0x0236]="This will overwrite the" Text[0x0236]="This will overwrite the"
Text[0x0237]="current config with" Text[0x0237]="current config with"
Text[0x0238]="that which is in" Text[0x0238]="that which is in"
Text[0x0239]="the backup memory." Text[0x0239]="the backup memory."
Text[0x023A]="023A" Text[0x023A]="" -- blank line
Text[0x023D]="Copy Flight Mode Settings" Text[0x023D]="Copy Flight Mode Settings"
Text[0x0240]="Utilities" Text[0x0240]="Utilities"
Text[0x024C]="Gains will be captured on"
Text[0x024D]="Captured gains will be"
Text[0x024E]="Gains on"
Text[0x024F]="were captured and changed"
Text[0x0250]="from Adjustable to Fixed"
Text[0x0254]="Postive = Up, Negative = Down"
Text[0x0263]="Fixed/Adjustable Gains"
Text[0x0266]="Heading Gain"
Text[0x0267]="Positive = Nose Up/Roll Right"
Text[0x0268]="Negative = Nose Down/Roll Left"
Text[0x0269]="SAFE - Throttle to Pitch"
Text[0x026A]="Use CAUTION for Yaw gain!"
Text[0x8000]="FLIGHT MODE"
Text[0x8001]="Flight Mode 1" Text[0x8001]="Flight Mode 1"
Text[0x8002]="Flight Mode 2" Text[0x8002]="Flight Mode 2"
Text[0x8003]="Flight Mode 3" Text[0x8003]="Flight Mode 3"
end end
------------------------------------------------------------------------------------------------------------
-- Main -- Main
local function DSM_Run(event) local function DSM_Run(event)
if event == nil then if event == nil then
error("Cannot be run as a model script!") error("Cannot be run as a model script!")
return 2 return 2
elseif event == EVT_VIRTUAL_EXIT then
DSM_Release()
return 2
else else
DSM_Menu(event) DSM_Menu(event)
DSM_Send_Receive() DSM_Send_Receive()
DSM_Display() DSM_Display()
end
if Phase == EXIT_DONE then
return 2
else
return 0 return 0
end end
end end

View File

@@ -55,6 +55,8 @@
28,3,Flysky_AFHDS2A,PPM_SBUS,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14 28,3,Flysky_AFHDS2A,PPM_SBUS,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14
28,4,Flysky_AFHDS2A,PWM_IB16,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16 28,4,Flysky_AFHDS2A,PWM_IB16,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16
28,5,Flysky_AFHDS2A,PPM_IB16,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16 28,5,Flysky_AFHDS2A,PPM_IB16,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16
28,6,Flysky_AFHDS2A,PWM_SB16,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16
28,7,Flysky_AFHDS2A,PPM_SB16,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16
56,0,Flysky2A_RX,RX,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14 56,0,Flysky2A_RX,RX,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14
56,1,Flysky2A_RX,CPPM,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14 56,1,Flysky2A_RX,CPPM,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14
53,0,Height,5ch,0,Gear 53,0,Height,5ch,0,Gear
@@ -112,7 +114,8 @@
22,0,J6Pro,Std,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12 22,0,J6Pro,Std,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12
71,0,JJRC345,JJRC345,1,Flip,HLess,RTH,LED,UNK1,UNK2,UNK3 71,0,JJRC345,JJRC345,1,Flip,HLess,RTH,LED,UNK1,UNK2,UNK3
71,1,JJRC345,SkyTmblr,1,Flip,HLess,RTH,LED,UNK1,UNK2,UNK3 71,1,JJRC345,SkyTmblr,1,Flip,HLess,RTH,LED,UNK1,UNK2,UNK3
49,0,KF606,Std,1,Trim 49,0,KF606,KF606,1,Trim
49,1,KF606,MIG320,1,Trim
9,0,KN,WLToys,0,DRate,THold,IdleUp,Gyro,Ttrim,Atrim,Etrim 9,0,KN,WLToys,0,DRate,THold,IdleUp,Gyro,Ttrim,Atrim,Etrim
9,1,KN,Feilun,0,DRate,THold,IdleUp,Gyro,Ttrim,Atrim,Etrim 9,1,KN,Feilun,0,DRate,THold,IdleUp,Gyro,Ttrim,Atrim,Etrim
73,0,Kyosho,Std,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14 73,0,Kyosho,Std,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14
@@ -130,6 +133,7 @@
17,4,MT99XX,FY805,1,Flip,n-a,n-a,n-a,HLess 17,4,MT99XX,FY805,1,Flip,n-a,n-a,n-a,HLess
17,5,MT99XX,A180,0,3D_6G 17,5,MT99XX,A180,0,3D_6G
17,6,MT99XX,Dragon,0,Mode,RTH 17,6,MT99XX,Dragon,0,Mode,RTH
17,7,MT99XX,F949G,0,6G_3D,Light
44,0,NCC1701,Std,1,Warp 44,0,NCC1701,Std,1,Warp
77,0,OMP,M2,0,THold,IdleUp,6G_3D 77,0,OMP,M2,0,THold,IdleUp,6G_3D
60,0,Pelikan,PRO_V4,0,CH5,CH6,CH7,CH8 60,0,Pelikan,PRO_V4,0,CH5,CH6,CH7,CH8
@@ -167,8 +171,8 @@
5,1,V2x2,JXD506,1,Flip,Light,Pict,Video,HLess,StaSto,Emerg,Cam_UD 5,1,V2x2,JXD506,1,Flip,Light,Pict,Video,HLess,StaSto,Emerg,Cam_UD
48,0,V761,3CH,0,Gyro,Calib,Flip,RtnAct,Rtn 48,0,V761,3CH,0,Gyro,Calib,Flip,RtnAct,Rtn
48,1,V761,4CH,0,Gyro,Calib,Flip,RtnAct,Rtn 48,1,V761,4CH,0,Gyro,Calib,Flip,RtnAct,Rtn
46,0,V911s,V911s,1,Calib 46,0,V911s,V911s,1,Calib,Rate
46,1,V911s,E119,1,Calib 46,1,V911s,E119,1,Calib,Rate,6G_3D
22,0,WFLY,WFR0xS,0,CH5,CH6,CH7,CH8,CH9 22,0,WFLY,WFR0xS,0,CH5,CH6,CH7,CH8,CH9
30,0,WK2x01,WK2801,0,CH5,CH6,CH7,CH8 30,0,WK2x01,WK2801,0,CH5,CH6,CH7,CH8
30,1,WK2x01,WK2401,0 30,1,WK2x01,WK2401,0
@@ -194,5 +198,6 @@
85,0,E016H,Std,1,Stop,Flip,n-a,HLess,RTH 85,0,E016H,Std,1,Stop,Flip,n-a,HLess,RTH
87,0,IKEA 87,0,IKEA
89,0,LOSI 89,0,LOSI
90,0,MouldKg,Analog 90,0,MouldKg,Analog,0
90,1,MouldKg,Digit,E,F 90,1,MouldKg,Digit,0
91,0,Xerall,Tank,0,FlTa,TakLan,Rate,HLess,Photo,Video,TrimR,TrimE,TrimA

View File

@@ -17,6 +17,8 @@ If you like this project and want to support further development please consider
Enables to modify on a Multi module the Global ID, Cyrf ID or format the EEPROM. Enables to modify on a Multi module the Global ID, Cyrf ID or format the EEPROM.
Matching the ID of 2 Multi modules enable them to control the same receivers without rebinding. Be carefull the 2 modules should not be used at the same time unless you know what you are doing.
Notes: Notes:
- Supported from Multi v1.3.2.85 or above and OpenTX 2.3.12 or above - Supported from Multi v1.3.2.85 or above and OpenTX 2.3.12 or above
- The Multi module to be configured must be active, if there is a second Multi module in the radio it must be off - The Multi module to be configured must be active, if there is a second Multi module in the radio it must be off
@@ -52,6 +54,8 @@ Notes:
## DSM Forward Programming ## DSM Forward Programming
Navigation is mainly done using the scroll wheel and ENT. Short press on ENT will edit a value. When editing a value a long ENT press will restore the value to its default. To exit the script and terminate all current operations correctly short press RTN (if you don't do this the RX might not store the changes).
This is a work in progress. It's only available for color screens (Horus, TX16S, T16, T18...). This is a work in progress. It's only available for color screens (Horus, TX16S, T16, T18...).
If some text appears as Unknown_xxx, please report xxx and what the exact text display should be. If some text appears as Unknown_xxx, please report xxx and what the exact text display should be.

View File

@@ -147,7 +147,7 @@ static void __attribute__((unused)) BUGSMINI_send_packet()
hopping_frequency_no++; hopping_frequency_no++;
if(hopping_frequency_no >= BUGSMINI_NUM_RF_CHANNELS) if(hopping_frequency_no >= BUGSMINI_NUM_RF_CHANNELS)
hopping_frequency_no = 0; hopping_frequency_no = 0;
XN297_Hopping(IS_BIND_IN_PROGRESS ? hopping_frequency[hopping_frequency_no+BUGSMINI_NUM_RF_CHANNELS] : hopping_frequency[hopping_frequency_no]); XN297_Hopping(IS_BIND_IN_PROGRESS ? hopping_frequency_no+BUGSMINI_NUM_RF_CHANNELS : hopping_frequency_no);
} }
// Send // Send

View File

@@ -247,10 +247,9 @@ uint16_t DSM_RX_callback()
eeprom_write_byte((EE_ADDR)temp++, cyrfmfg_id[i]); eeprom_write_byte((EE_ADDR)temp++, cyrfmfg_id[i]);
debug(" %02X", cyrfmfg_id[i]); debug(" %02X", cyrfmfg_id[i]);
} }
// check num_ch // save num_ch
num_ch=packet_in[11]; num_ch=packet_in[11];
if(num_ch>12) num_ch=12; // store DSM_rx_type
//check DSM_rx_type
/*packet[12] 1 byte -> max DSM type allowed: /*packet[12] 1 byte -> max DSM type allowed:
0x01 => 22ms 1024 DSM2 1 packet => number of channels is <8 0x01 => 22ms 1024 DSM2 1 packet => number of channels is <8
0x02 => 22ms 1024 DSM2 2 packets => either a number of channel >7 0x02 => 22ms 1024 DSM2 2 packets => either a number of channel >7
@@ -262,22 +261,6 @@ uint16_t DSM_RX_callback()
&0xF0 => false=1024, true=2048 */ &0xF0 => false=1024, true=2048 */
DSM_rx_type=packet_in[12]; DSM_rx_type=packet_in[12];
debugln(", num_ch=%d, type=%02X",num_ch, DSM_rx_type); debugln(", num_ch=%d, type=%02X",num_ch, DSM_rx_type);
switch(DSM_rx_type)
{
case 0x01:
if(num_ch>7) DSM_rx_type = 0x02; // Can't be 0x01 with this number of channels
break;
case 0xA2:
if(num_ch>7) DSM_rx_type = 0xB2; // Can't be 0xA2 with this number of channels
break;
case 0x02:
case 0x12:
case 0xB2:
break;
default: // Unknown type, default to DSMX 11ms
DSM_rx_type = 0xB2;
break;
}
eeprom_write_byte((EE_ADDR)temp, DSM_rx_type); eeprom_write_byte((EE_ADDR)temp, DSM_rx_type);
CYRF_WriteRegister(CYRF_29_RX_ABORT, 0x20); // Abort RX operation CYRF_WriteRegister(CYRF_29_RX_ABORT, 0x20); // Abort RX operation
CYRF_SetTxRxMode(TX_EN); // Force end state TX CYRF_SetTxRxMode(TX_EN); // Force end state TX

View File

@@ -55,14 +55,14 @@ static void __attribute__((unused)) DEVO_add_pkt_suffix()
{ {
uint8_t bind_state; uint8_t bind_state;
#ifdef ENABLE_PPM #ifdef ENABLE_PPM
if(mode_select && option==0 && IS_BIND_DONE) //PPM mode and option not already set and bind is finished if(mode_select && (option&0x01)==0 && IS_BIND_DONE) //PPM mode and option not already set and bind is finished
{ {
BIND_SET_INPUT; BIND_SET_INPUT;
BIND_SET_PULLUP; // set pullup BIND_SET_PULLUP; // set pullup
if(IS_BIND_BUTTON_on) if(IS_BIND_BUTTON_on)
{ {
eeprom_write_byte((EE_ADDR)(MODELMODE_EEPROM_OFFSET+RX_num),0x01); // Set fixed id mode for the current model eeprom_write_byte((EE_ADDR)(MODELMODE_EEPROM_OFFSET+RX_num),0x01); // Set fixed id mode for the current model
option=1; option |= 0x01;
} }
BIND_SET_OUTPUT; BIND_SET_OUTPUT;
} }
@@ -72,7 +72,7 @@ static void __attribute__((unused)) DEVO_add_pkt_suffix()
MProtocol_id = RX_num + MProtocol_id_master; MProtocol_id = RX_num + MProtocol_id_master;
bind_counter=DEVO_BIND_COUNT; bind_counter=DEVO_BIND_COUNT;
} }
if (option) if (option&0x01)
{ {
if (bind_counter > 0) if (bind_counter > 0)
bind_state = 0xc0; bind_state = 0xc0;
@@ -220,6 +220,7 @@ static void __attribute__((unused)) DEVO_parse_telemetry_packet()
#if defined HUB_TELEMETRY #if defined HUB_TELEMETRY
//Telemetry https://github.com/DeviationTX/deviation/blob/5efb6a28bea697af9a61b5a0ed2528cc8d203f90/src/protocol/devo_cyrf6936.c#L232 //Telemetry https://github.com/DeviationTX/deviation/blob/5efb6a28bea697af9a61b5a0ed2528cc8d203f90/src/protocol/devo_cyrf6936.c#L232
uint16_t val, dec; uint16_t val, dec;
uint32_t val32;
switch(packet[0]) switch(packet[0])
{ {
case 0x30: // Volt and RPM packet case 0x30: // Volt and RPM packet
@@ -255,18 +256,30 @@ static void __attribute__((unused)) DEVO_parse_telemetry_packet()
break; break;
// GPS Data // GPS Data
case 0x32: // Longitude case 0x32: // Longitude
//memcpy(&packet[1],"\x30\x33\x30\x32\x30\x2e\x38\x32\x37\x30\x45\xfb",12); // 030°20.8270E //memcpy(&packet[1],"\x30\x33\x30\x32\x30\x2e\x38\x32\x37\x30\x45\xfb",12); // 030°20.8270E in ddmm.mmmm
val = DEVO_text_to_int(&packet[1], 3)*100 + DEVO_text_to_int(&packet[4], 2); // dddmm //memcpy(&packet[1],"\x31\x31\x37\x31\x31\x2e\x35\x39\x34\x37\x57\xfb",12); // RX705 sends 117°11.5947W which should be 11706.95685W in ddmm.mmmm
val = DEVO_text_to_int(&packet[1], 3)*100; // dd00
val32 = DEVO_text_to_int(&packet[4], 2) * 10000 + DEVO_text_to_int(&packet[7], 4); // mmmmmm
if(option&0x02) // if RX705 GPS format
val32 = (val32*3)/5; // then * 6/10 correction
dec = val32/10000;
val = val + dec; // dddmm
frsky_send_user_frame(0x12 , val, val>>8); frsky_send_user_frame(0x12 , val, val>>8);
val = DEVO_text_to_int(&packet[7], 4); // .mmmm val = val32 - dec*10000; // .mmmm
frsky_send_user_frame(0x12+8, val, val>>8); frsky_send_user_frame(0x12+8, val, val>>8);
frsky_send_user_frame(0x1A+8, packet[11], 0x00); // 'E'/'W' frsky_send_user_frame(0x1A+8, packet[11], 0x00); // 'E'/'W'
break; break;
case 0x33: // Latitude case 0x33: // Latitude
//memcpy(&packet[1],"\x35\x39\x35\x34\x2e\x37\x37\x37\x36\x4e\x07\x00",12); // 59°54.776N //memcpy(&packet[1],"\x35\x39\x35\x34\x2e\x37\x37\x37\x36\x4e\x07\x00",12); // 59°54.776N in ddmm.mmmm
val = DEVO_text_to_int(&packet[1], 2)*100 + DEVO_text_to_int(&packet[3], 2); // ddmm //memcpy(&packet[1],"\x31\x37\x31\x31\x2e\x35\x39\x34\x37\x4e\xfb\x00",12); // RX705 sends 17°11.5947N which should be 1706.95685N in ddmm.mmmm
val = DEVO_text_to_int(&packet[1], 2)*100; // dd00
val32 = DEVO_text_to_int(&packet[3], 2) * 10000 + DEVO_text_to_int(&packet[6], 4); // mmmmmm
if(option&0x02) // if RX705 GPS format
val32 = (val32*3)/5; // then * 6/10 correction
dec = val32/10000;
val = val + dec; // dddmm
frsky_send_user_frame(0x13 , val, val>>8); frsky_send_user_frame(0x13 , val, val>>8);
val = DEVO_text_to_int(&packet[6], 4); // .mmmm val = val32 - dec*10000; // .mmmm
frsky_send_user_frame(0x13+8, val, val>>8); frsky_send_user_frame(0x13+8, val, val>>8);
frsky_send_user_frame(0x1B+8, packet[10], 0x00); // 'N'/'S' frsky_send_user_frame(0x1B+8, packet[10], 0x00); // 'N'/'S'
break; break;
@@ -530,13 +543,13 @@ void DEVO_init()
{ {
if(IS_BIND_BUTTON_FLAG_on) if(IS_BIND_BUTTON_FLAG_on)
{ {
eeprom_write_byte((EE_ADDR)(MODELMODE_EEPROM_OFFSET+RX_num),0x00); // reset to autobind mode for the current model option &= 0xFE;
option=0; eeprom_write_byte((EE_ADDR)(MODELMODE_EEPROM_OFFSET+RX_num),option); // reset to autobind mode for the current model
} }
else else
{ {
option=eeprom_read_byte((EE_ADDR)(MODELMODE_EEPROM_OFFSET+RX_num)); // load previous mode: autobind or fixed id option=eeprom_read_byte((EE_ADDR)(MODELMODE_EEPROM_OFFSET+RX_num)); // load previous mode: autobind or fixed id
if(option!=1) option=0; // if not fixed id mode then it should be autobind if(option > 3) option = 0; // if invalid then it should be autobind
} }
} }
#endif //ENABLE_PPM #endif //ENABLE_PPM
@@ -570,8 +583,13 @@ void DEVO_init()
packet_count = 0; packet_count = 0;
prev_option=option; if(option&0x01)
if(option==0) {
phase = DEVO_BOUND_1;
bind_counter = 0;
DEVO_cyrf_set_bound_sop_code();
}
else
{ {
MProtocol_id = ((uint32_t)(hopping_frequency[0] ^ cyrfmfg_id[0] ^ cyrfmfg_id[3]) << 16) MProtocol_id = ((uint32_t)(hopping_frequency[0] ^ cyrfmfg_id[0] ^ cyrfmfg_id[3]) << 16)
| ((uint32_t)(hopping_frequency[1] ^ cyrfmfg_id[1] ^ cyrfmfg_id[4]) << 8) | ((uint32_t)(hopping_frequency[1] ^ cyrfmfg_id[1] ^ cyrfmfg_id[4]) << 8)
@@ -581,12 +599,6 @@ void DEVO_init()
phase = DEVO_BIND; phase = DEVO_BIND;
BIND_IN_PROGRESS; BIND_IN_PROGRESS;
} }
else
{
phase = DEVO_BOUND_1;
bind_counter = 0;
DEVO_cyrf_set_bound_sop_code();
}
} }
#endif #endif

View File

@@ -14,9 +14,9 @@
*/ */
// compatible with E012 and E015 // compatible with E012 and E015
#if defined(E01X_NRF24L01_INO) #if defined(E01X_CYRF6936_INO)
#include "iface_nrf24l01.h" #include "iface_hs6200.h"
//Protocols constants //Protocols constants
#define E01X_BIND_COUNT 500 #define E01X_BIND_COUNT 500
@@ -28,7 +28,8 @@
#define E012_NUM_RF_CHANNELS 4 #define E012_NUM_RF_CHANNELS 4
#define E012_PACKET_SIZE 15 #define E012_PACKET_SIZE 15
#define E015_PACKET_PERIOD 4500 // stock Tx=9000, but let's send more packets ... //#define E015_FORCE_ID
#define E015_PACKET_PERIOD 9000
#define E015_RF_CHANNEL 0x2d // 2445 MHz #define E015_RF_CHANNEL 0x2d // 2445 MHz
#define E015_PACKET_SIZE 10 #define E015_PACKET_SIZE 10
#define E015_BIND_PACKET_SIZE 9 #define E015_BIND_PACKET_SIZE 9
@@ -87,13 +88,15 @@ static void __attribute__((unused)) E01X_send_packet()
packet[0] = rx_tx_addr[1]; packet[0] = rx_tx_addr[1];
if(IS_BIND_IN_PROGRESS) if(IS_BIND_IN_PROGRESS)
{ {
rf_ch_num = E012_RF_BIND_CHANNEL;
packet[1] = 0xaa; packet[1] = 0xaa;
memcpy(&packet[2], hopping_frequency, E012_NUM_RF_CHANNELS); memcpy(&packet[2], hopping_frequency, E012_NUM_RF_CHANNELS);
memcpy(&packet[6], rx_tx_addr, E01X_ADDRESS_LENGTH); memcpy(&packet[6], rx_tx_addr, E01X_ADDRESS_LENGTH);
rf_ch_num=E012_RF_BIND_CHANNEL;
} }
else else
{ {
rf_ch_num = hopping_frequency[hopping_frequency_no++];
hopping_frequency_no %= E012_NUM_RF_CHANNELS;
packet[1] = 0x01 packet[1] = 0x01
| GET_FLAG(E01X_RTH_SW, E012_FLAG_RTH) | GET_FLAG(E01X_RTH_SW, E012_FLAG_RTH)
| GET_FLAG(E01X_HEADLESS_SW, E012_FLAG_HEADLESS) | GET_FLAG(E01X_HEADLESS_SW, E012_FLAG_HEADLESS)
@@ -107,8 +110,6 @@ static void __attribute__((unused)) E01X_send_packet()
packet[8] = 0x00; packet[8] = 0x00;
packet[9] = 0x00; packet[9] = 0x00;
packet[10]= 0x00; packet[10]= 0x00;
rf_ch_num=hopping_frequency[hopping_frequency_no++];
hopping_frequency_no %= E012_NUM_RF_CHANNELS;
} }
packet[11] = 0x00; packet[11] = 0x00;
packet[12] = 0x00; packet[12] = 0x00;
@@ -117,6 +118,7 @@ static void __attribute__((unused)) E01X_send_packet()
} }
else else
{ // E015 { // E015
rf_ch_num = E015_RF_CHANNEL;
if(IS_BIND_IN_PROGRESS) if(IS_BIND_IN_PROGRESS)
{ {
packet[0] = 0x18; packet[0] = 0x18;
@@ -124,10 +126,11 @@ static void __attribute__((unused)) E01X_send_packet()
packet[2] = 0x06; packet[2] = 0x06;
// data phase address // data phase address
memcpy(&packet[3], rx_tx_addr, E01X_ADDRESS_LENGTH); memcpy(&packet[3], rx_tx_addr, E01X_ADDRESS_LENGTH);
packet[8] = 0x63; // unknown calculation
// checksum // checksum
packet[8] = packet[3]; //packet[8] = packet[3];
for(uint8_t i=4; i<8; i++) //for(uint8_t i=4; i<8; i++)
packet[8] += packet[i]; // packet[8] += packet[i];
packet_length=E015_BIND_PACKET_SIZE; packet_length=E015_BIND_PACKET_SIZE;
} }
else else
@@ -154,24 +157,15 @@ static void __attribute__((unused)) E01X_send_packet()
} }
} }
HS6200_Configure(_BV(NRF24L01_00_EN_CRC) | _BV(NRF24L01_00_CRCO) | _BV(NRF24L01_00_PWR_UP)); HS6200_RFChannel(rf_ch_num);
NRF24L01_WriteReg(NRF24L01_05_RF_CH, rf_ch_num); HS6200_SetPower();
delayMicroseconds(270); // Wait for RF channel to settle
NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x70); HS6200_SendPayload(packet, packet_length);
NRF24L01_FlushTx();
HS6200_WritePayload(packet, packet_length);
// Check and adjust transmission power. We do this after
// transmission to not bother with timeout after power
// settings change - we have plenty of time until next
// packet.
NRF24L01_SetPower();
} }
static void __attribute__((unused)) E01X_RF_init() static void __attribute__((unused)) E01X_RF_init()
{ {
NRF24L01_Initialize(); HS6200_Init(true); // CRC enabled
if(sub_protocol==E012) if(sub_protocol==E012)
HS6200_SetTXAddr((uint8_t *)"\x55\x42\x9C\x8F\xC9", E01X_ADDRESS_LENGTH); HS6200_SetTXAddr((uint8_t *)"\x55\x42\x9C\x8F\xC9", E01X_ADDRESS_LENGTH);
@@ -218,8 +212,21 @@ void E01X_init()
} }
else //E015 else //E015
{ {
#ifdef E015_FORCE_ID
rx_tx_addr[0] = 0x06;
rx_tx_addr[1] = 0xC6;
rx_tx_addr[2] = 0xB7;
rx_tx_addr[3] = 0x56;
rx_tx_addr[4] = 0x8A;
#endif
//force the sum to give 0x63 since the id calculation is unknown
uint8_t sum=0x63;
for(uint8_t i=0; i < 4; i++)
sum -= rx_tx_addr[i];
rx_tx_addr[4] = sum;
packet_period=E015_PACKET_PERIOD; packet_period=E015_PACKET_PERIOD;
rf_ch_num=E015_RF_CHANNEL;
armed = 0; armed = 0;
arm_flags = 0; arm_flags = 0;
arm_channel_previous = E01X_ARM_SW; arm_channel_previous = E01X_ARM_SW;

View File

@@ -390,7 +390,7 @@ uint16_t HOTT_callback()
{ //Telemetry { //Telemetry
// [0..4] = TXID // [0..4] = TXID
// [5..9] = RXID // [5..9] = RXID
// [10] = 0x40 bind, 0x00 normal, 0x80 config menu // [10] = holds warnings issued by hott devices
// [11] = telmetry pages. For sensors 0x00 to 0x04, for config mennu 0x00 to 0x12. // [11] = telmetry pages. For sensors 0x00 to 0x04, for config mennu 0x00 to 0x12.
// Normal telem page 0 = 0x55, 0x32, 0x38, 0x55, 0x64, 0x32, 0xD0, 0x07, 0x00, 0x55 // Normal telem page 0 = 0x55, 0x32, 0x38, 0x55, 0x64, 0x32, 0xD0, 0x07, 0x00, 0x55
// Page 0 [12] = [21] = [15] // Page 0 [12] = [21] = [15]
@@ -400,7 +400,7 @@ uint16_t HOTT_callback()
// Page 0 [16] = RX_LQI in % // Page 0 [16] = RX_LQI in %
// Page 0 [17] = RX_Voltage Min*10 in V // Page 0 [17] = RX_Voltage Min*10 in V
// Page 0 [18,19] = [19]<<8+[18]=max lost packet time in ms, max value seems 2s=0x7D0 // Page 0 [18,19] = [19]<<8+[18]=max lost packet time in ms, max value seems 2s=0x7D0
// Page 0 [20] = 0x00 ?? // Page 0 [20] = rx events
// //
// Config menu consists of the different telem pages put all together // Config menu consists of the different telem pages put all together
// Page X [12] = seems like all the telem pages with the same value are going together to make the full config menu text. Seen so far 'a', 'b', 'c', 'd' // Page X [12] = seems like all the telem pages with the same value are going together to make the full config menu text. Seen so far 'a', 'b', 'c', 'd'
@@ -412,6 +412,7 @@ uint16_t HOTT_callback()
// Reduce telemetry to 14 bytes // Reduce telemetry to 14 bytes
packet_in[0]= packet_in[HOTT_RX_PACKET_LEN]; packet_in[0]= packet_in[HOTT_RX_PACKET_LEN];
packet_in[1]= TX_LQI; packet_in[1]= TX_LQI;
uint8_t hott_warnings = packet_in[10]; // save warnings from hott devices
bool send_telem=true; bool send_telem=true;
HOTT_sensor_seq++; // Increment RX sequence counter HOTT_sensor_seq++; // Increment RX sequence counter
if(packet[29] & 1) if(packet[29] & 1)
@@ -464,6 +465,7 @@ uint16_t HOTT_callback()
packet_in[i-8]=packet_in[i]; packet_in[i-8]=packet_in[i];
debug(" %02X",packet_in[i]); debug(" %02X",packet_in[i]);
} }
packet_in[14] = hott_warnings; // restore saved warnings from hott devices
debugln(""); debugln("");
if(send_telem) if(send_telem)
telemetry_link=2; telemetry_link=2;

View File

@@ -0,0 +1,112 @@
/*
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/>.
*/
#ifdef CYRF6936_INSTALLED
#include "iface_hs6200.h"
static bool HS6200_crc;
static uint16_t HS6200_crc_init;
static uint8_t HS6200_address_length, HS6200_tx_addr[5];
static void __attribute__((unused)) HS6200_Init(bool crc_en)
{
CYRF_GFSK1M_Init(32, 1); //Dummy number of bytes for now
HS6200_crc = crc_en;
}
static void __attribute__((unused)) HS6200_SetTXAddr(const uint8_t* addr, uint8_t addr_len)
{
// precompute address crc
crc = 0xffff;
for(uint8_t i=0; i<addr_len; i++)
crc16_update(addr[addr_len-1-i], 8);
HS6200_crc_init=crc;
memcpy(HS6200_tx_addr, addr, addr_len);
HS6200_address_length = addr_len;
}
static uint16_t __attribute__((unused)) HS6200_calc_crc(uint8_t* msg, uint8_t len)
{
uint8_t pos;
crc = HS6200_crc_init;
// pcf + payload
for(pos=0; pos < len-1; pos++)
crc16_update(msg[pos], 8);
// last byte (1 bit only)
if(len > 0)
crc16_update(msg[pos+1], 1);
return crc;
}
static void __attribute__((unused)) HS6200_SendPayload(uint8_t* msg, uint8_t len)
{
static const uint8_t HS6200_scramble[] = { 0x80,0xf5,0x3b,0x0d,0x6d,0x2a,0xf9,0xbc,0x51,0x8e,0x4c,0xfd,0xc1,0x65,0xd0 }; // todo: find all 32 bytes ...
uint8_t payload[32];
const uint8_t no_ack = 1; // never ask for an ack
static uint8_t pid;
uint8_t pos = 0;
if(len > sizeof(HS6200_scramble))
len = sizeof(HS6200_scramble);
// address
for(int8_t i=HS6200_address_length-1; i>=0; i--)
payload[pos++] = HS6200_tx_addr[i];
// guard bytes
payload[pos++] = HS6200_tx_addr[0];
payload[pos++] = HS6200_tx_addr[0];
// packet control field
payload[pos++] = ((len & 0x3f) << 2) | (pid & 0x03);
payload[pos] = (no_ack & 0x01) << 7;
pid++;
// scrambled payload
if(len > 0)
{
payload[pos++] |= (msg[0] ^ HS6200_scramble[0]) >> 1;
for(uint8_t i=1; i<len; i++)
payload[pos++] = ((msg[i-1] ^ HS6200_scramble[i-1]) << 7) | ((msg[i] ^ HS6200_scramble[i]) >> 1);
payload[pos] = (msg[len-1] ^ HS6200_scramble[len-1]) << 7;
}
// crc
if(HS6200_crc)
{
uint16_t crc = HS6200_calc_crc(&payload[HS6200_address_length+2], len+2);
uint8_t hcrc = crc >> 8;
uint8_t lcrc = crc & 0xff;
payload[pos++] |= (hcrc >> 1);
payload[pos++] = (hcrc << 7) | (lcrc >> 1);
payload[pos++] = lcrc << 7;
}
#if 0
debug("E:");
for(uint8_t i=0; i<pos; i++)
debug(" %02X",payload[i]);
debugln("");
#endif
//CYRF wants LSB first
for(uint8_t i=0; i<pos; i++)
payload[i]=bit_reverse(payload[i]);
//Send
CYRF_WriteRegister(CYRF_01_TX_LENGTH, pos);
CYRF_GFSK1M_SendPayload(payload, pos);
}
#endif

View File

@@ -19,6 +19,7 @@ Multiprotocol is distributed in the hope that it will be useful,
#include "iface_xn297.h" #include "iface_xn297.h"
//#define FORCE_KF606_ORIGINAL_ID //#define FORCE_KF606_ORIGINAL_ID
//#define FORCE_MIG320_ORIGINAL_ID
#define KF606_INITIAL_WAIT 500 #define KF606_INITIAL_WAIT 500
#define KF606_PACKET_PERIOD 3000 #define KF606_PACKET_PERIOD 3000
@@ -35,25 +36,48 @@ static void __attribute__((unused)) KF606_send_packet()
memcpy(&packet[1],rx_tx_addr,3); memcpy(&packet[1],rx_tx_addr,3);
} }
else else
{
packet[0]= 0x55;
packet[1]= convert_channel_8b(THROTTLE); // 0..255
// Deadband is needed on aileron, 40 gives +-6%
packet[2]=convert_channel_8b_limit_deadband(AILERON,0x20,0x80,0xE0,40); // Aileron: Max values:20..80..E0, Low rates:50..80..AF, High rates:3E..80..C1
// Aileron trim must be on a separated channel C1..D0..DF
packet[3]= convert_channel_16b_limit(CH5,0xC1,0xDF);
}
if(IS_BIND_DONE)
{ {
XN297_Hopping(hopping_frequency_no); XN297_Hopping(hopping_frequency_no);
hopping_frequency_no ^= 1; // 2 RF channels hopping_frequency_no ^= 1; // 2 RF channels
packet[0] = 0x55;
packet[1] = convert_channel_8b(THROTTLE); // 0..255
// Deadband is needed on aileron, 40 gives +-6%
if(sub_protocol == KF606_KF606)
{
packet[2] = convert_channel_8b_limit_deadband(AILERON,0x20,0x80,0xE0,40); // Aileron: Max values:20..80..E0, Low rates:50..80..AF, High rates:3E..80..C1
packet[3] = convert_channel_16b_limit(CH5,0xC1,0xDF); // Aileron trim must be on a separated channel C1..D0..DF
}
else
{
packet[2] = convert_channel_8b_limit_deadband(AILERON,0x00,0x80,0xFF,40); // Aileron: High rate:2B..80..DA
packet[3] = convert_channel_16b_limit(CH5,0x01,0x1F); // Aileron trim must be on a separated channel 01..10..1F
packet[3] += (packet[2]-0x80)>>3; // Drive trims for more aileron authority
if(packet[3] > 0x80)
packet[3] = 0x01;
else if(packet[3] > 0x1F)
packet[3] = 0x1F;
}
} }
uint8_t len = KF606_PAYLOAD_SIZE;
if(sub_protocol == KF606_MIG320)
{
len++;
packet[4] = 0; // additional channel?
}
#if 0
for(uint8_t i=0; i<len; i++)
debug("%02X ",packet[i]);
debugln("");
#endif
// Send // Send
XN297_SetPower(); XN297_SetPower();
XN297_SetFreqOffset(); XN297_SetFreqOffset();
XN297_SetTxRxMode(TX_EN); XN297_SetTxRxMode(TX_EN);
XN297_WritePayload(packet, KF606_PAYLOAD_SIZE); XN297_WritePayload(packet, len);
} }
static void __attribute__((unused)) KF606_initialize_txid() static void __attribute__((unused)) KF606_initialize_txid()
@@ -67,13 +91,20 @@ static void __attribute__((unused)) KF606_initialize_txid()
rx_tx_addr[1]=0x02; rx_tx_addr[1]=0x02;
rx_tx_addr[2]=0x00; rx_tx_addr[2]=0x00;
hopping_frequency[0]=0x20; hopping_frequency[0]=0x20;
hopping_frequency[0]=0x23; hopping_frequency[1]=0x23;
//TX2 //TX2
rx_tx_addr[0]=0x25; rx_tx_addr[0]=0x25;
rx_tx_addr[1]=0x04; rx_tx_addr[1]=0x04;
rx_tx_addr[2]=0x00; rx_tx_addr[2]=0x00;
hopping_frequency[0]=0x2E; hopping_frequency[0]=0x2E;
hopping_frequency[0]=0x31; hopping_frequency[1]=0x31;
#endif
#ifdef FORCE_MIG320_ORIGINAL_ID
rx_tx_addr[0]=0xBB;
rx_tx_addr[1]=0x13;
rx_tx_addr[2]=0x00;
hopping_frequency[0]=68;
hopping_frequency[1]=71;
#endif #endif
} }
@@ -110,3 +141,14 @@ void KF606_init()
} }
#endif #endif
// MIG320 protocol
// Bind
// 250K C=7 S=Y A= E7 E7 E7 E7 E7 P(5)= AA BB 13 00 00
// 3ms on ch7
// Normal
// 250K C=68 S=Y A= BB 13 00 P(5)= 55 00 80 10 00
// P[1] = THR 00..FF
// P[2] = AIL 2B..80..DA
// P[3] = TRIM 01..10..1F
// channels 68=BB&3F+9 and 71

View File

@@ -26,11 +26,13 @@
#define MT99XX_PACKET_PERIOD_A180 3400 // timing changes between the packets 2 x 27220 then 1x 26080, it seems that it is only on the first RF channel which jitters by 1.14ms but hard to pinpoint with XN297dump #define MT99XX_PACKET_PERIOD_A180 3400 // timing changes between the packets 2 x 27220 then 1x 26080, it seems that it is only on the first RF channel which jitters by 1.14ms but hard to pinpoint with XN297dump
#define MT99XX_PACKET_PERIOD_DRAGON 1038 // there is a pause of 2x1038 between two packets, no idea why and how since it is not even stable on a same dump... #define MT99XX_PACKET_PERIOD_DRAGON 1038 // there is a pause of 2x1038 between two packets, no idea why and how since it is not even stable on a same dump...
#define MT99XX_PACKET_PERIOD_DRAGON_TELEM 10265 // long pause to receive the telemetry packets, 3 are sent by the RX one after the other #define MT99XX_PACKET_PERIOD_DRAGON_TELEM 10265 // long pause to receive the telemetry packets, 3 are sent by the RX one after the other
#define MT99XX_PACKET_PERIOD_F949G 3450
#define MT99XX_INITIAL_WAIT 500 #define MT99XX_INITIAL_WAIT 500
#define MT99XX_PACKET_SIZE 9 #define MT99XX_PACKET_SIZE 9
//#define FORCE_A180_ID //#define FORCE_A180_ID
//#define FORCE_DRAGON_ID //#define FORCE_DRAGON_ID
//#define FORCE_F949G_ID
enum { enum {
MT99XX_DATA, MT99XX_DATA,
@@ -75,6 +77,12 @@ enum{
FLAG_DRAGON_UNK = 0x04, FLAG_DRAGON_UNK = 0x04,
}; };
enum{
// flags going to packet[6] (F949G)
FLAG_F949G_LIGHT = 0x01,
FLAG_F949G_3D6G = 0x20,
};
const uint8_t h7_mys_byte[] = { const uint8_t h7_mys_byte[] = {
0x01, 0x11, 0x02, 0x12, 0x03, 0x13, 0x04, 0x14, 0x01, 0x11, 0x02, 0x12, 0x03, 0x13, 0x04, 0x14,
0x05, 0x15, 0x06, 0x16, 0x07, 0x17, 0x00, 0x10 0x05, 0x15, 0x06, 0x16, 0x07, 0x17, 0x00, 0x10
@@ -97,6 +105,15 @@ static void __attribute__((unused)) MT99XX_send_packet()
{ {
static uint8_t seq_num=0; static uint8_t seq_num=0;
//Set RF freq
if(sub_protocol == LS)
XN297_RFChannel(0x2D); // LS always transmits on the same channel
else
if(sub_protocol==FY805)
XN297_RFChannel(0x4B); // FY805 always transmits on the same channel
else // MT99 & H7 & YZ & A180 & DRAGON & F949G
XN297_Hopping(hopping_frequency_no);
if(IS_BIND_IN_PROGRESS) if(IS_BIND_IN_PROGRESS)
{ {
//Bind packet //Bind packet
@@ -120,9 +137,10 @@ static void __attribute__((unused)) MT99XX_send_packet()
packet[2] = 0x12; packet[2] = 0x12;
packet[3] = 0x17; packet[3] = 0x17;
break; break;
case F949G:
case A180: case A180:
packet_period = MT99XX_PACKET_PERIOD_A180; packet_period = MT99XX_PACKET_PERIOD_A180;
default: // MT99 & H7 & A180 & DRAGON default: // MT99 & H7 & A180 & DRAGON & F949G
packet[1] = 0x14; packet[1] = 0x14;
packet[2] = 0x03; packet[2] = 0x03;
packet[3] = 0x25; packet[3] = 0x25;
@@ -132,12 +150,15 @@ static void __attribute__((unused)) MT99XX_send_packet()
packet[5] = rx_tx_addr[1]; packet[5] = rx_tx_addr[1];
packet[6] = rx_tx_addr[2]; packet[6] = rx_tx_addr[2];
packet[7] = crc8; // checksum offset packet[7] = crc8; // checksum offset
packet[8] = 0xAA; // fixed if(sub_protocol != F949G)
packet[8] = 0xAA; // fixed
else
packet[8] = 0x00;
} }
else else
{ {
if(sub_protocol != YZ) if(sub_protocol != YZ)
{ // MT99XX & H7 & LS & FY805 & A180 & DRAGON { // MT99XX & H7 & LS & FY805 & A180 & DRAGON & F949G
packet[0] = convert_channel_16b_limit(THROTTLE,0xE1,0x00); // throttle packet[0] = convert_channel_16b_limit(THROTTLE,0xE1,0x00); // throttle
packet[1] = convert_channel_16b_limit(RUDDER ,0x00,0xE1); // rudder packet[1] = convert_channel_16b_limit(RUDDER ,0x00,0xE1); // rudder
packet[2] = convert_channel_16b_limit(AILERON ,0xE1,0x00); // aileron packet[2] = convert_channel_16b_limit(AILERON ,0xE1,0x00); // aileron
@@ -177,8 +198,9 @@ static void __attribute__((unused)) MT99XX_send_packet()
crc8=0; crc8=0;
break; break;
case A180: case A180:
packet[6] = FLAG_A180_RATE packet[6] = GET_FLAG( !CH6_SW,FLAG_A180_RATE) // 0x02, A180=RATE, F949S=LED
| GET_FLAG( CH5_SW, FLAG_A180_3D6G ); |GET_FLAG( CH5_SW, FLAG_A180_3D6G ) // 0x01, A180=3D_6G, F949S=RATE
|GET_FLAG( CH7_SW, 0x20 ); // 0x20, F949S=3D_6G
packet[7] = 0x00; packet[7] = 0x00;
break; break;
case DRAGON: case DRAGON:
@@ -212,6 +234,12 @@ static void __attribute__((unused)) MT99XX_send_packet()
packet[7] = 0x20; packet[7] = 0x20;
#endif #endif
break; break;
case F949G:
packet[6] = 0x02
| GET_FLAG( CH5_SW, FLAG_F949G_3D6G )
| GET_FLAG( CH6_SW, FLAG_F949G_LIGHT );
packet[7] = 0x00;
break;
} }
uint8_t result=crc8; uint8_t result=crc8;
for(uint8_t i=0; i<8; i++) for(uint8_t i=0; i<8; i++)
@@ -245,17 +273,9 @@ static void __attribute__((unused)) MT99XX_send_packet()
} }
} }
//RF freq //Hopp
if(sub_protocol == LS)
XN297_RFChannel(0x2D); // LS always transmits on the same channel
else
if(sub_protocol==FY805)
XN297_RFChannel(0x4B); // FY805 always transmits on the same channel
else // MT99 & H7 & YZ & A180 & DRAGON
XN297_Hopping(hopping_frequency_no);
hopping_frequency_no++; hopping_frequency_no++;
if(sub_protocol == YZ || sub_protocol == A180 || sub_protocol == DRAGON ) if(sub_protocol == YZ || sub_protocol == A180 || sub_protocol == DRAGON || sub_protocol == F949G)
hopping_frequency_no++; // skip every other channel hopping_frequency_no++; // skip every other channel
if(hopping_frequency_no > 15) if(hopping_frequency_no > 15)
hopping_frequency_no = 0; hopping_frequency_no = 0;
@@ -265,12 +285,20 @@ static void __attribute__((unused)) MT99XX_send_packet()
XN297_SetFreqOffset(); XN297_SetFreqOffset();
XN297_SetTxRxMode(TX_EN); XN297_SetTxRxMode(TX_EN);
XN297_WritePayload(packet, MT99XX_PACKET_SIZE); XN297_WritePayload(packet, MT99XX_PACKET_SIZE);
#if 0
for(uint8_t i=0; i<MT99XX_PACKET_SIZE; i++)
debug(" %02X",packet[i]);
debugln();
#endif
} }
static void __attribute__((unused)) MT99XX_RF_init() static void __attribute__((unused)) MT99XX_RF_init()
{ {
if(sub_protocol == YZ) if(sub_protocol == YZ)
XN297_Configure(XN297_CRCEN, XN297_UNSCRAMBLED, XN297_250K); XN297_Configure(XN297_CRCEN, XN297_UNSCRAMBLED, XN297_250K);
else if(sub_protocol == F949G)
XN297_Configure(XN297_CRCEN, XN297_SCRAMBLED, XN297_250K);
else else
XN297_Configure(XN297_CRCEN, XN297_SCRAMBLED, XN297_1M); XN297_Configure(XN297_CRCEN, XN297_SCRAMBLED, XN297_1M);
XN297_SetTXAddr((uint8_t *)"\xCC\xCC\xCC\xCC\xCC", 5); XN297_SetTXAddr((uint8_t *)"\xCC\xCC\xCC\xCC\xCC", 5);
@@ -318,7 +346,16 @@ static void __attribute__((unused)) MT99XX_initialize_txid()
//channel_offset = 0x06 //channel_offset = 0x06
break; break;
#endif #endif
default: //MT99 & H7 & A180 & DRAGON #ifdef FORCE_F949G_ID
case F949G:
rx_tx_addr[0] = 0x7E; // LilTeo14 ID
rx_tx_addr[1] = 0x2F;
rx_tx_addr[2] = 0x29;
//crc8 = 0xD6
//channel_offset = 0x03
break;
#endif
default: //MT99 & H7 & A180 & DRAGON & F949G
rx_tx_addr[2] = 0x00; rx_tx_addr[2] = 0x00;
break; break;
} }
@@ -409,7 +446,7 @@ uint16_t MT99XX_callback()
void MT99XX_init(void) void MT99XX_init(void)
{ {
if(sub_protocol != A180 && sub_protocol != DRAGON) if(sub_protocol != A180 && sub_protocol != DRAGON && sub_protocol != F949G)
BIND_IN_PROGRESS; // autobind protocol BIND_IN_PROGRESS; // autobind protocol
bind_counter = MT99XX_BIND_COUNT; bind_counter = MT99XX_BIND_COUNT;

View File

@@ -14,7 +14,7 @@
14,Bayang,Bayang,H8S3D,X16_AH,IRDRONE,DHD_D4,QX100 14,Bayang,Bayang,H8S3D,X16_AH,IRDRONE,DHD_D4,QX100
15,FrskyX,CH_16,CH_8,EU_16,EU_8,Cloned,Clon_8 15,FrskyX,CH_16,CH_8,EU_16,EU_8,Cloned,Clon_8
16,ESky,Std,ET4 16,ESky,Std,ET4
17,MT99xx,MT,H7,YZ,LS,FY805,A180,Dragon 17,MT99xx,MT,H7,YZ,LS,FY805,A180,Dragon,F949G
18,MJXq,WLH08,X600,X800,H26D,E010,H26WH,PHOENIX 18,MJXq,WLH08,X600,X800,H26D,E010,H26WH,PHOENIX
19,Shenqi 19,Shenqi
20,FY326,FY326,FY319 20,FY326,FY326,FY319
@@ -25,7 +25,7 @@
25,FrskyV 25,FrskyV
26,HONTAI,HONTAI,JJRCX1,X5C1,FQ777_951 26,HONTAI,HONTAI,JJRCX1,X5C1,FQ777_951
27,OpnLrs 27,OpnLrs
28,AFHDS2A,PWM_IBUS,PPM_IBUS,PWM_SBUS,PPM_SBUS,PWM_IB16,PPM_IB16 28,AFHDS2A,PWM_IBUS,PPM_IBUS,PWM_SBUS,PPM_SBUS,PWM_IB16,PPM_IB16,PWM_SB16,PPM_SB16
29,Q2X2,Q222,Q242,Q282 29,Q2X2,Q222,Q242,Q282
30,WK2x01,WK2801,WK2401,W6_5_1,W6_6_1,W6_HEL,W6_HEL_I 30,WK2x01,WK2801,WK2401,W6_5_1,W6_6_1,W6_HEL,W6_HEL_I
31,Q303,Q303,CX35,CX10D,CX10WD 31,Q303,Q303,CX35,CX10D,CX10WD
@@ -46,7 +46,7 @@
46,V911S,V911S,E119 46,V911S,V911S,E119
47,GD00x,GD_V1,GD_V2 47,GD00x,GD_V1,GD_V2
48,V761,3CH,4CH 48,V761,3CH,4CH
49,KF606 49,KF606,KF606,MIG320
50,Redpine,Fast,Slow 50,Redpine,Fast,Slow
51,Potensic,A20 51,Potensic,A20
52,ZSX,280 52,ZSX,280
@@ -84,5 +84,7 @@
84,JOYSWAY 84,JOYSWAY
85,E016H 85,E016H
87,IKEA 87,IKEA
88,WILLIFM
89,Losi 89,Losi
90,MouldKg,Analog,Digit 90,MouldKg,Analog,Digit
91,Xerall

View File

@@ -102,6 +102,7 @@ const char STR_IKEAANSLUTA[]="Ansluta";
const char STR_CONFIG[] ="Config"; const char STR_CONFIG[] ="Config";
const char STR_LOSI[] ="Losi"; const char STR_LOSI[] ="Losi";
const char STR_MOULDKG[] ="MouldKg"; const char STR_MOULDKG[] ="MouldKg";
const char STR_XERALL[] ="Xerall";
const char STR_SUBTYPE_FLYSKY[] = "\x04""Std\0""V9x9""V6x6""V912""CX20"; const char STR_SUBTYPE_FLYSKY[] = "\x04""Std\0""V9x9""V6x6""V912""CX20";
const char STR_SUBTYPE_HUBSAN[] = "\x04""H107""H301""H501"; const char STR_SUBTYPE_HUBSAN[] = "\x04""H107""H301""H501";
@@ -118,7 +119,7 @@ const char STR_SUBTYPE_SLT[] = "\x06""V1_6ch""V2_8ch""Q100\0 ""Q200\0 ""M
const char STR_SUBTYPE_CX10[] = "\x07""Green\0 ""Blue\0 ""DM007\0 ""-\0 ""JC3015a""JC3015b""MK33041"; const char STR_SUBTYPE_CX10[] = "\x07""Green\0 ""Blue\0 ""DM007\0 ""-\0 ""JC3015a""JC3015b""MK33041";
const char STR_SUBTYPE_CG023[] = "\x05""Std\0 ""YD829"; const char STR_SUBTYPE_CG023[] = "\x05""Std\0 ""YD829";
const char STR_SUBTYPE_BAYANG[] = "\x07""Std\0 ""H8S3D\0 ""X16 AH\0""IRDrone""DHD D4\0""QX100\0 "; const char STR_SUBTYPE_BAYANG[] = "\x07""Std\0 ""H8S3D\0 ""X16 AH\0""IRDrone""DHD D4\0""QX100\0 ";
const char STR_SUBTYPE_MT99[] = "\x06""MT99\0 ""H7\0 ""YZ\0 ""LS\0 ""FY805\0""A180\0 ""Dragon"; const char STR_SUBTYPE_MT99[] = "\x06""MT99\0 ""H7\0 ""YZ\0 ""LS\0 ""FY805\0""A180\0 ""Dragon""F949G\0";
const char STR_SUBTYPE_MJXQ[] = "\x07""WLH08\0 ""X600\0 ""X800\0 ""H26D\0 ""E010\0 ""H26WH\0 ""Phoenix"; const char STR_SUBTYPE_MJXQ[] = "\x07""WLH08\0 ""X600\0 ""X800\0 ""H26D\0 ""E010\0 ""H26WH\0 ""Phoenix";
const char STR_SUBTYPE_FY326[] = "\x05""Std\0 ""FY319"; const char STR_SUBTYPE_FY326[] = "\x05""Std\0 ""FY319";
const char STR_SUBTYPE_HONTAI[] = "\x07""Std\0 ""JJRC X1""X5C1\0 ""FQ_951"; const char STR_SUBTYPE_HONTAI[] = "\x07""Std\0 ""JJRC X1""X5C1\0 ""FQ_951";
@@ -137,7 +138,7 @@ const char STR_SUBTYPE_GD00X[] = "\x05""GD_V1""GD_V2";
const char STR_SUBTYPE_REDPINE[] = "\x04""Fast""Slow"; const char STR_SUBTYPE_REDPINE[] = "\x04""Fast""Slow";
const char STR_SUBTYPE_POTENSIC[] = "\x03""A20"; const char STR_SUBTYPE_POTENSIC[] = "\x03""A20";
const char STR_SUBTYPE_ZSX[] = "\x07""280JJRC"; const char STR_SUBTYPE_ZSX[] = "\x07""280JJRC";
const char STR_SUBTYPE_HEIGHT[] = "\x03""5ch""8ch"; const char STR_SUBTYPE_HEIGHT[] = "\x03""5ch""8ch";
const char STR_SUBTYPE_FX816[] = "\x03""P38"; const char STR_SUBTYPE_FX816[] = "\x03""P38";
const char STR_SUBTYPE_XN297DUMP[] = "\x07""250Kbps""1Mbps\0 ""2Mbps\0 ""Auto\0 ""NRF\0 ""CC2500\0"; const char STR_SUBTYPE_XN297DUMP[] = "\x07""250Kbps""1Mbps\0 ""2Mbps\0 ""Auto\0 ""NRF\0 ""CC2500\0";
const char STR_SUBTYPE_ESKY150[] = "\x03""4ch""7ch"; const char STR_SUBTYPE_ESKY150[] = "\x03""4ch""7ch";
@@ -159,6 +160,7 @@ 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"; const char STR_SUBTYPE_JJRC345[] = "\x08""JJRC345\0""SkyTmblr";
const char STR_SUBTYPE_MOULKG[] = "\x06""Analog""Digit\0"; const char STR_SUBTYPE_MOULKG[] = "\x06""Analog""Digit\0";
const char STR_SUBTYPE_KF606[] = "\x06""KF606\0""MIG320";
#define NO_SUBTYPE nullptr #define NO_SUBTYPE nullptr
@@ -245,8 +247,8 @@ const mm_protocol_definition multi_protocols[] = {
#if defined(E016HV2_CC2500_INO) #if defined(E016HV2_CC2500_INO)
{PROTO_E016HV2, STR_E016HV2, NO_SUBTYPE, 0, OPTION_RFTUNE, 0, 0, SW_CC2500, E016HV2_init, E016HV2_callback }, {PROTO_E016HV2, STR_E016HV2, NO_SUBTYPE, 0, OPTION_RFTUNE, 0, 0, SW_CC2500, E016HV2_init, E016HV2_callback },
#endif #endif
#if defined(E01X_NRF24L01_INO) #if defined(E01X_CYRF6936_INO)
{PROTO_E01X, STR_E01X, STR_SUBTYPE_E01X, 2, OPTION_OPTION, 0, 0, SW_NRF, E01X_init, E01X_callback }, {PROTO_E01X, STR_E01X, STR_SUBTYPE_E01X, 2, OPTION_NONE, 0, 0, SW_CYRF, E01X_init, E01X_callback },
#endif #endif
#if defined(E129_CYRF6936_INO) #if defined(E129_CYRF6936_INO)
{PROTO_E129, STR_E129, NO_SUBTYPE, 0, OPTION_NONE, 0, 0, SW_CYRF, E129_init, E129_callback }, {PROTO_E129, STR_E129, NO_SUBTYPE, 0, OPTION_NONE, 0, 0, SW_CYRF, E129_init, E129_callback },
@@ -346,7 +348,7 @@ const mm_protocol_definition multi_protocols[] = {
{PROTO_JOYSWAY, STR_JOYSWAY, NO_SUBTYPE, 0, OPTION_NONE, 0, 0, SW_A7105, JOYSWAY_init, JOYSWAY_callback }, {PROTO_JOYSWAY, STR_JOYSWAY, NO_SUBTYPE, 0, OPTION_NONE, 0, 0, SW_A7105, JOYSWAY_init, JOYSWAY_callback },
#endif #endif
#if defined(KF606_CCNRF_INO) #if defined(KF606_CCNRF_INO)
{PROTO_KF606, STR_KF606, NO_SUBTYPE, 0, OPTION_RFTUNE, 0, 0, SW_NRF, KF606_init, KF606_callback }, {PROTO_KF606, STR_KF606, STR_SUBTYPE_KF606, 2, OPTION_RFTUNE, 0, 0, SW_NRF, KF606_init, KF606_callback },
#endif #endif
#if defined(KN_NRF24L01_INO) #if defined(KN_NRF24L01_INO)
{PROTO_KN, STR_KN, STR_SUBTYPE_KN, 2, OPTION_NONE, 0, 0, SW_NRF, KN_init, KN_callback }, {PROTO_KN, STR_KN, STR_SUBTYPE_KN, 2, OPTION_NONE, 0, 0, SW_NRF, KN_init, KN_callback },
@@ -370,7 +372,7 @@ const mm_protocol_definition multi_protocols[] = {
{PROTO_MOULDKG, STR_MOULDKG, STR_SUBTYPE_MOULKG, 2, OPTION_OPTION, 0, 0, SW_NRF, MOULDKG_init, MOULDKG_callback }, {PROTO_MOULDKG, STR_MOULDKG, STR_SUBTYPE_MOULKG, 2, OPTION_OPTION, 0, 0, SW_NRF, MOULDKG_init, MOULDKG_callback },
#endif #endif
#if defined(MT99XX_CCNRF_INO) #if defined(MT99XX_CCNRF_INO)
{PROTO_MT99XX, STR_MT99XX, STR_SUBTYPE_MT99, 7, OPTION_NONE, 0, 0, SW_NRF, MT99XX_init, MT99XX_callback }, {PROTO_MT99XX, STR_MT99XX, STR_SUBTYPE_MT99, 8, OPTION_NONE, 0, 0, SW_NRF, MT99XX_init, MT99XX_callback },
#endif #endif
#if defined(NCC1701_NRF24L01_INO) #if defined(NCC1701_NRF24L01_INO)
{PROTO_NCC1701, STR_NCC1701, NO_SUBTYPE, 0, OPTION_NONE, 0, 0, SW_NRF, NCC_init, NCC_callback }, {PROTO_NCC1701, STR_NCC1701, NO_SUBTYPE, 0, OPTION_NONE, 0, 0, SW_NRF, NCC_init, NCC_callback },
@@ -445,6 +447,9 @@ const mm_protocol_definition multi_protocols[] = {
{PROTO_WFLY2, STR_WFLY2, STR_SUBTYPE_WFLY2, 1, OPTION_OPTION, 1, 0, SW_A7105, WFLY2_init, WFLY2_callback }, {PROTO_WFLY2, STR_WFLY2, STR_SUBTYPE_WFLY2, 1, OPTION_OPTION, 1, 0, SW_A7105, WFLY2_init, WFLY2_callback },
// {PROTO_WFLY2, STR_WFLY2, STR_SUBTYPE_WFLY2, 1, OPTION_WBUS, 1, 0, SW_A7105, WFLY2_init, WFLY2_callback },// crash OpenTX... // {PROTO_WFLY2, STR_WFLY2, STR_SUBTYPE_WFLY2, 1, OPTION_WBUS, 1, 0, SW_A7105, WFLY2_init, WFLY2_callback },// crash OpenTX...
#endif #endif
#if defined(XERALL_NRF24L01_INO)
{PROTO_XERALL, STR_XERALL, NO_SUBTYPE, 0, OPTION_NONE, 0, 0, SW_NRF, XERALL_init, XERALL_callback },
#endif
#if defined(XK_CCNRF_INO) #if defined(XK_CCNRF_INO)
{PROTO_XK, STR_XK, STR_SUBTYPE_XK, 2, OPTION_RFTUNE, 0, 0, SW_NRF, XK_init, XK_callback }, {PROTO_XK, STR_XK, STR_SUBTYPE_XK, 2, OPTION_RFTUNE, 0, 0, SW_NRF, XK_init, XK_callback },
#endif #endif
@@ -465,3 +470,69 @@ const mm_protocol_definition multi_protocols[] = {
#endif #endif
{0xFF, nullptr, nullptr, 0, 0, 0, 0, 0, nullptr, nullptr } {0xFF, nullptr, nullptr, 0, 0, 0, 0, 0, nullptr, nullptr }
}; };
#ifdef MULTI_TELEMETRY
uint16_t PROTOLIST_callback()
{
if(option != prev_option)
{//Only send once
/* Type 0x11 Protocol list export via telemetry. Used by the protocol PROTO_PROTOLIST=0, the list entry is given by the Option field.
length: variable
data[0] = protocol number, 0xFF is an invalid list entry (Option value too large), Option == 0xFF -> number of protocols in the list
data[1..n] = protocol name null terminated
data[n+1] = flags
flags>>4 Option text number to be displayed (check multi status for description)
flags&0x01 failsafe supported
flags&0x02 Channel Map Disabled supported
data[n+2] = number of sub protocols
data[n+3] = sub protocols text length, only sent if nbr_sub != 0
data[n+4..] = sub protocol names, only sent if nbr_sub != 0
*/
prev_option = option;
if(option >= (sizeof(multi_protocols)/sizeof(mm_protocol_definition)) - 1)
{//option is above the end of the list
//Header
multi_send_header(MULTI_TELEMETRY_PROTO, 1);
if(option == 0xFF)
Serial_write((sizeof(multi_protocols)/sizeof(mm_protocol_definition)) - 1); //Nbr proto
else
Serial_write(0xFF); //Error
}
else
{//valid option value
uint8_t proto_len = strlen(multi_protocols[option].ProtoString) + 1;
uint8_t nbr_sub = multi_protocols[option].nbrSubProto;
uint8_t sub_len = 0;
if(nbr_sub)
sub_len = multi_protocols[option].SubProtoString[0];
//Header
multi_send_header(MULTI_TELEMETRY_PROTO, 1 + proto_len + 1 + 1 + (nbr_sub?1:0) + (nbr_sub * sub_len));
//Protocol number
Serial_write(multi_protocols[option].protocol);
//Protocol name
for(uint8_t i=0;i<proto_len;i++)
Serial_write(multi_protocols[option].ProtoString[i]);
//Flags
uint8_t flags=0;
#ifdef FAILSAFE_ENABLE
if(multi_protocols[option].failSafe)
flags |= 0x01; //Failsafe supported
#endif
if(multi_protocols[option].chMap)
flags |= 0x02; //Disable_ch_mapping supported
Serial_write( flags | (multi_protocols[option].optionType<<4)); // flags && option type
//Number of sub protocols
Serial_write(nbr_sub);
if(nbr_sub !=0 )
{//Sub protocols length and texts
for(uint8_t i=0;i<=nbr_sub*sub_len;i++)
Serial_write(multi_protocols[option].SubProtoString[i]);
}
}
}
return 1000;
}
#endif

View File

@@ -18,8 +18,8 @@
//****************** //******************
#define VERSION_MAJOR 1 #define VERSION_MAJOR 1
#define VERSION_MINOR 3 #define VERSION_MINOR 3
#define VERSION_REVISION 2 #define VERSION_REVISION 3
#define VERSION_PATCH_LEVEL 86 #define VERSION_PATCH_LEVEL 7
#define MODE_SERIAL 0 #define MODE_SERIAL 0
@@ -28,6 +28,7 @@
//****************** //******************
enum PROTOCOLS enum PROTOCOLS
{ {
PROTO_PROTOLIST = 0, // NO RF
PROTO_FLYSKY = 1, // =>A7105 PROTO_FLYSKY = 1, // =>A7105
PROTO_HUBSAN = 2, // =>A7105 PROTO_HUBSAN = 2, // =>A7105
PROTO_FRSKYD = 3, // =>CC2500 PROTO_FRSKYD = 3, // =>CC2500
@@ -72,7 +73,7 @@ enum PROTOCOLS
PROTO_BUGSMINI = 42, // =>NRF24L01 PROTO_BUGSMINI = 42, // =>NRF24L01
PROTO_TRAXXAS = 43, // =>CYRF6936 PROTO_TRAXXAS = 43, // =>CYRF6936
PROTO_NCC1701 = 44, // =>NRF24L01 PROTO_NCC1701 = 44, // =>NRF24L01
PROTO_E01X = 45, // =>NRF24L01 PROTO_E01X = 45, // =>CYRF6936
PROTO_V911S = 46, // =>NRF24L01 PROTO_V911S = 46, // =>NRF24L01
PROTO_GD00X = 47, // =>NRF24L01 PROTO_GD00X = 47, // =>NRF24L01
PROTO_V761 = 48, // =>NRF24L01 PROTO_V761 = 48, // =>NRF24L01
@@ -117,6 +118,7 @@ enum PROTOCOLS
PROTO_WILLIFM = 88, // 27/35ab/40/41/72 MHz module external project PROTO_WILLIFM = 88, // 27/35ab/40/41/72 MHz module external project
PROTO_LOSI = 89, // =>CYRF6936 PROTO_LOSI = 89, // =>CYRF6936
PROTO_MOULDKG = 90, // =>NRF24L01 PROTO_MOULDKG = 90, // =>NRF24L01
PROTO_XERALL = 91, // =>NRF24L01
PROTO_NANORF = 126, // =>NRF24L01 PROTO_NANORF = 126, // =>NRF24L01
PROTO_TEST = 127, // =>CC2500 PROTO_TEST = 127, // =>CC2500
@@ -148,6 +150,8 @@ enum AFHDS2A
PPM_SBUS = 3, PPM_SBUS = 3,
PWM_IB16 = 4, PWM_IB16 = 4,
PPM_IB16 = 5, PPM_IB16 = 5,
PWM_SB16 = 6,
PPM_SB16 = 7,
}; };
enum Hisky enum Hisky
{ {
@@ -230,6 +234,7 @@ enum MT99XX
FY805 = 4, FY805 = 4,
A180 = 5, A180 = 5,
DRAGON = 6, DRAGON = 6,
F949G = 7,
}; };
enum MJXQ enum MJXQ
{ {
@@ -445,6 +450,12 @@ enum MOULDKG
MOULDKG_DIGIT = 1, MOULDKG_DIGIT = 1,
}; };
enum KF606
{
KF606_KF606 = 0,
KF606_MIG320 = 1,
};
#define NONE 0 #define NONE 0
#define P_HIGH 1 #define P_HIGH 1
#define P_LOW 0 #define P_LOW 0
@@ -509,6 +520,7 @@ enum MultiPacketTypes
MULTI_TELEMETRY_HOTT = 14, MULTI_TELEMETRY_HOTT = 14,
MULTI_TELEMETRY_MLINK = 15, MULTI_TELEMETRY_MLINK = 15,
MULTI_TELEMETRY_CONFIG = 16, MULTI_TELEMETRY_CONFIG = 16,
MULTI_TELEMETRY_PROTO = 17,
}; };
// Macros // Macros
@@ -915,6 +927,7 @@ Serial: 100000 Baud 8e2 _ xxxx xxxx p --
E129 83 E129 83
JOYSWAY 84 JOYSWAY 84
E016H 85 E016H 85
XERALL 91
BindBit=> 0x80 1=Bind/0=No BindBit=> 0x80 1=Bind/0=No
AutoBindBit=> 0x40 1=Yes /0=No AutoBindBit=> 0x40 1=Yes /0=No
RangeCheck=> 0x20 1=Yes /0=No RangeCheck=> 0x20 1=Yes /0=No
@@ -1280,4 +1293,17 @@ Serial: 100000 Baud 8e2 _ xxxx xxxx p --
Type 0x10 Config telemetry Type 0x10 Config telemetry
length: 22 length: 22
data[0..21] = Config data data[0..21] = Config data
Type 0x11 Protocol list export via telemetry. Used by the protocol PROTO_PROTOLIST=0, the list entry is given by the Option field.
length: variable
data[0] = protocol number, 0xFF is an invalid list entry (Option value too large), Option == 0xFF -> number of protocols in the list
data[1..n] = protocol name null terminated
data[n+1] = flags
flags>>4 Option text number to be displayed (check multi status for description)
flags&0x01 failsafe supported
flags&0x02 Channel Map Disabled supported
data[n+2] = number of sub protocols
data[n+3] = sub protocols text length, only sent if nbr_sub != 0
data[n+4..] = sub protocol names, only sent if nbr_sub != 0
*/ */

View File

@@ -765,6 +765,17 @@ void End_Bind()
bind_counter=2; bind_counter=2;
} }
void Update_Telem()
{
#if defined(TELEMETRY)
#ifndef MULTI_TELEMETRY
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) || (protocol==PROTO_LOLI) || (protocol==PROTO_MLINK) || (protocol==PROTO_MT99XX))
#endif
if(IS_DISABLE_TELEM_off)
TelemetryUpdate();
#endif
}
bool Update_All() bool Update_All()
{ {
#ifdef ENABLE_SERIAL #ifdef ENABLE_SERIAL
@@ -855,13 +866,9 @@ bool Update_All()
} }
else else
#endif #endif
#if defined(TELEMETRY)
#ifndef MULTI_TELEMETRY Update_Telem();
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) || (protocol==PROTO_LOLI) || (protocol==PROTO_MLINK) || (protocol==PROTO_MT99XX))
#endif
if(IS_DISABLE_TELEM_off)
TelemetryUpdate();
#endif
#ifdef ENABLE_BIND_CH #ifdef ENABLE_BIND_CH
if(IS_AUTOBIND_FLAG_on && IS_BIND_CH_PREV_off && Channel_data[BIND_CH-1]>CHANNEL_MAX_COMMAND) if(IS_AUTOBIND_FLAG_on && IS_BIND_CH_PREV_off && Channel_data[BIND_CH-1]>CHANNEL_MAX_COMMAND)
{ // Autobind is on and BIND_CH went up { // Autobind is on and BIND_CH went up
@@ -1128,17 +1135,16 @@ static void protocol_init()
{ {
remote_callback = 0; // No protocol remote_callback = 0; // No protocol
LED_off; // Led off during protocol init LED_off; // Led off during protocol init
modules_reset(); // Reset all modules
crc16_polynomial = 0x1021; // Default CRC crc16_polynomial crc16_polynomial = 0x1021; // Default CRC crc16_polynomial
crc8_polynomial = 0x31; // Default CRC crc8_polynomial crc8_polynomial = 0x31; // Default CRC crc8_polynomial
prev_option = option; prev_option = option;
multi_protocols_index = 0xFF;
// reset telemetry // reset telemetry
#ifdef TELEMETRY #ifdef TELEMETRY
#ifdef MULTI_SYNC #ifdef MULTI_SYNC
inputRefreshRate = 0; // Don't do it unless the protocol asks for it inputRefreshRate = 0; // Don't do it unless the protocol asks for it
#endif #endif
multi_protocols_index = 0xFF;
tx_pause(); tx_pause();
init_frskyd_link_telemetry(); init_frskyd_link_telemetry();
pps_timer=millis(); pps_timer=millis();
@@ -1160,7 +1166,7 @@ static void protocol_init()
TX_RX_PAUSE_off; TX_RX_PAUSE_off;
TX_MAIN_PAUSE_off; TX_MAIN_PAUSE_off;
tx_resume(); tx_resume();
#if defined(AFHDS2A_RX_A7105_INO) || defined(FRSKY_RX_CC2500_INO) || defined(BAYANG_RX_NRF24L01_INO) #if defined(AFHDS2A_RX_A7105_INO) || defined(FRSKY_RX_CC2500_INO) || defined(BAYANG_RX_NRF24L01_INO) || defined(DSM_RX_CYRF6936_INO)
for(uint8_t ch=0; ch<16; ch++) for(uint8_t ch=0; ch<16; ch++)
rx_rc_chan[ch] = 1024; rx_rc_chan[ch] = 1024;
#endif #endif
@@ -1181,52 +1187,71 @@ static void protocol_init()
#endif #endif
DATA_BUFFER_LOW_off; DATA_BUFFER_LOW_off;
SUB_PROTO_VALID; SUB_PROTO_INVALID;
option_override = 0xFF; option_override = 0xFF;
blink=millis(); blink=millis();
debugln("Protocol selected: %d, sub proto %d, rxnum %d, option %d", protocol, sub_protocol, RX_num, option); debugln("Protocol selected: %d, sub proto %d, rxnum %d, option %d", protocol, sub_protocol, RX_num, option);
uint8_t index=0; if(protocol)
#if defined(FRSKYX_CC2500_INO) && defined(EU_MODULE)
if( ! ( (protocol == PROTO_FRSKYX || protocol == PROTO_FRSKYX2) && sub_protocol < 2 ) )
#endif
while(multi_protocols[index].protocol != 0xFF)
{ {
if(multi_protocols[index].protocol==protocol) //Reset all modules
modules_reset();
uint8_t index=0;
#if defined(FRSKYX_CC2500_INO) && defined(EU_MODULE)
if( ! ( (protocol == PROTO_FRSKYX || protocol == PROTO_FRSKYX2) && sub_protocol < 2 ) )
#endif
while(multi_protocols[index].protocol != 0xFF)
{ {
//Save index if(multi_protocols[index].protocol==protocol)
multi_protocols_index = index; {
//Set the RF switch //Save index
rf_switch(multi_protocols[multi_protocols_index].rfSwitch); multi_protocols_index = index;
//Init protocol //Check sub protocol validity
multi_protocols[multi_protocols_index].Init(); if( ((sub_protocol&0x07) == 0) || (sub_protocol&0x07) < multi_protocols[index].nbrSubProto )
//Save call back function address SUB_PROTO_VALID;
remote_callback = multi_protocols[multi_protocols_index].CallBack; if(IS_SUB_PROTO_VALID)
//Send a telemetry status right now {//Start the protocol
SEND_MULTI_STATUS_on; //Set the RF switch
#ifdef DEBUG_SERIAL rf_switch(multi_protocols[index].rfSwitch);
debug("Proto=%s",multi_protocols[multi_protocols_index].ProtoString); //Init protocol
uint8_t nbr=multi_protocols[multi_protocols_index].nbrSubProto; multi_protocols[index].Init(); // Init could invalidate the sub proto in case it is not suuported
debug(", nbr_sub=%d, Sub=",nbr); if(IS_SUB_PROTO_VALID)
if(nbr && (sub_protocol&0x07)<nbr) remote_callback = multi_protocols[index].CallBack; //Save call back function address
{
uint8_t len=multi_protocols[multi_protocols_index].SubProtoString[0];
uint8_t offset=len*(sub_protocol&0x07)+1;
for(uint8_t j=0;j<len;j++)
debug("%c",multi_protocols[multi_protocols_index].SubProtoString[j+offset]);
} }
debug(", Opt=%d",multi_protocols[multi_protocols_index].optionType); #ifdef DEBUG_SERIAL
debug(", FS=%d",multi_protocols[multi_protocols_index].failSafe); debug("Proto=%s", multi_protocols[index].ProtoString);
debug(", CHMap=%d",multi_protocols[multi_protocols_index].chMap); debug(", nbr_sub=%d, Sub=", multi_protocols[index].nbrSubProto);
debugln(", rfSw=%d",multi_protocols[multi_protocols_index].rfSwitch); if(IS_SUB_PROTO_VALID)
#endif {
break; uint8_t len=multi_protocols[index].SubProtoString[0];
uint8_t offset=len*(sub_protocol&0x07)+1;
for(uint8_t j=0;j<len;j++)
debug("%c",multi_protocols[index].SubProtoString[j+offset]);
}
debug(", Opt=%d",multi_protocols[index].optionType);
debug(", FS=%d",multi_protocols[index].failSafe);
debug(", CHMap=%d",multi_protocols[index].chMap);
debugln(", rfSw=%d",multi_protocols[index].rfSwitch);
#endif
break;
}
index++;
} }
index++; //Send a telemetry status right now
SEND_MULTI_STATUS_on;
Update_Telem();
} }
#ifdef MULTI_TELEMETRY
else
{//protocol=PROTO_PROTOLIST=0
remote_callback = PROTOLIST_callback;
prev_option = option + 1;
}
#endif
} }
#if defined(WAIT_FOR_BIND) && defined(ENABLE_BIND_CH) #if defined(WAIT_FOR_BIND) && defined(ENABLE_BIND_CH)
if( IS_AUTOBIND_FLAG_on && IS_BIND_CH_PREV_off && (cur_protocol[1]&0x80)==0 && mode_select == MODE_SERIAL) if( IS_AUTOBIND_FLAG_on && IS_BIND_CH_PREV_off && (cur_protocol[1]&0x80)==0 && mode_select == MODE_SERIAL)
{ // Autobind is active but no bind requested by either BIND_CH or BIND. But do not wait if in PPM mode... { // Autobind is active but no bind requested by either BIND_CH or BIND. But do not wait if in PPM mode...
@@ -1237,16 +1262,19 @@ static void protocol_init()
WAIT_BIND_off; WAIT_BIND_off;
CHANGE_PROTOCOL_FLAG_off; CHANGE_PROTOCOL_FLAG_off;
//Wait 5ms after protocol init if(protocol)
cli(); // disable global int {
OCR1A = TCNT1 + 5000*2; // set compare A for callback //Wait 5ms after protocol init
#ifndef STM32_BOARD cli(); // disable global int
TIFR1 = OCF1A_bm ; // clear compare A flag OCR1A = TCNT1 + 5000*2; // set compare A for callback
#else #ifndef STM32_BOARD
TIMER2_BASE->SR = 0x1E5F & ~TIMER_SR_CC1IF; // Clear Timer2/Comp1 interrupt flag TIFR1 = OCF1A_bm ; // clear compare A flag
#endif #else
sei(); // enable global int TIMER2_BASE->SR = 0x1E5F & ~TIMER_SR_CC1IF; // Clear Timer2/Comp1 interrupt flag
BIND_BUTTON_FLAG_off; // do not bind/reset id anymore even if protocol change #endif
sei(); // enable global int
BIND_BUTTON_FLAG_off; // do not bind/reset id anymore even if protocol change
}
} }
void update_serial_data() void update_serial_data()
@@ -1520,7 +1548,9 @@ void update_serial_data()
if ( used >= MAX_SPORT_BUFFER-(MAX_SPORT_BUFFER>>2) ) if ( used >= MAX_SPORT_BUFFER-(MAX_SPORT_BUFFER>>2) )
{ {
DATA_BUFFER_LOW_on; DATA_BUFFER_LOW_on;
SEND_MULTI_STATUS_on; //Send Multi Status ASAP to inform the TX //Send Multi Status ASAP to inform the TX
SEND_MULTI_STATUS_on;
Update_Telem();
debugln("Low buf=%d,h=%d,t=%d",used,SportHead,SportTail); debugln("Low buf=%d,h=%d,t=%d",used,SportHead,SportTail);
} }
} }

View File

@@ -183,11 +183,9 @@ void NRF24L01_SetPower()
power=NRF_POWER_0; power=NRF_POWER_0;
if(prev_power != power) if(prev_power != power)
{ {
rf_setup = (rf_setup & 0xF9) | (power << 1); rf_setup = (rf_setup & 0xF8) | (power << 1);
if(power==3) if(power==3)
rf_setup |=0x01; // Si24r01 full power, unused bit for NRF rf_setup |= 0x01; // Si24r01 full power, unused bit for NRF
else
rf_setup &=0xFE;
NRF24L01_WriteReg(NRF24L01_06_RF_SETUP, rf_setup); NRF24L01_WriteReg(NRF24L01_06_RF_SETUP, rf_setup);
prev_power=power; prev_power=power;
} }
@@ -246,112 +244,6 @@ uint8_t NRF24L01_packet_ack()
return PKT_PENDING; return PKT_PENDING;
} }
//
// HS6200 emulation layer
///////////////////////////
static uint8_t hs6200_crc;
static uint16_t hs6200_crc_init;
static uint8_t hs6200_tx_addr[5];
static uint8_t hs6200_address_length;
static const uint8_t hs6200_scramble[] = {
0x80,0xf5,0x3b,0x0d,0x6d,0x2a,0xf9,0xbc,
0x51,0x8e,0x4c,0xfd,0xc1,0x65,0xd0 }; // todo: find all 32 bytes ...
void HS6200_SetTXAddr(const uint8_t* addr, uint8_t len)
{
if(len < 4)
len = 4;
else if(len > 5)
len = 5;
// use nrf24 address field as a longer preamble
if(addr[len-1] & 0x80)
NRF24L01_WriteRegisterMulti(NRF24L01_10_TX_ADDR, (uint8_t*)"\x55\x55\x55\x55\x55", 5);
else
NRF24L01_WriteRegisterMulti(NRF24L01_10_TX_ADDR, (uint8_t*)"\xaa\xaa\xaa\xaa\xaa", 5);
// precompute address crc
crc = 0xffff;
for(int i=0; i<len; i++)
crc16_update(addr[len-1-i], 8);
hs6200_crc_init=crc;
memcpy(hs6200_tx_addr, addr, len);
hs6200_address_length = len;
}
static uint16_t hs6200_calc_crc(uint8_t* msg, uint8_t len)
{
uint8_t pos;
crc = hs6200_crc_init;
// pcf + payload
for(pos=0; pos < len-1; pos++)
crc16_update(msg[pos], 8);
// last byte (1 bit only)
if(len > 0)
crc16_update(msg[pos+1], 1);
return crc;
}
void HS6200_Configure(uint8_t flags)
{
hs6200_crc = !!(flags & _BV(NRF24L01_00_EN_CRC));
flags &= ~(_BV(NRF24L01_00_EN_CRC) | _BV(NRF24L01_00_CRCO));
NRF24L01_WriteReg(NRF24L01_00_CONFIG, flags & 0xff);
}
void HS6200_WritePayload(uint8_t* msg, uint8_t len)
{
uint8_t payload[32];
const uint8_t no_ack = 1; // never ask for an ack
static uint8_t pid;
uint8_t pos = 0;
if(len > sizeof(hs6200_scramble))
len = sizeof(hs6200_scramble);
// address
for(int i=hs6200_address_length-1; i>=0; i--)
payload[pos++] = hs6200_tx_addr[i];
// guard bytes
payload[pos++] = hs6200_tx_addr[0];
payload[pos++] = hs6200_tx_addr[0];
// packet control field
payload[pos++] = ((len & 0x3f) << 2) | (pid & 0x03);
payload[pos] = (no_ack & 0x01) << 7;
pid++;
// scrambled payload
if(len > 0)
{
payload[pos++] |= (msg[0] ^ hs6200_scramble[0]) >> 1;
for(uint8_t i=1; i<len; i++)
payload[pos++] = ((msg[i-1] ^ hs6200_scramble[i-1]) << 7) | ((msg[i] ^ hs6200_scramble[i]) >> 1);
payload[pos] = (msg[len-1] ^ hs6200_scramble[len-1]) << 7;
}
// crc
if(hs6200_crc)
{
uint16_t crc = hs6200_calc_crc(&payload[hs6200_address_length+2], len+2);
uint8_t hcrc = crc >> 8;
uint8_t lcrc = crc & 0xff;
payload[pos++] |= (hcrc >> 1);
payload[pos++] = (hcrc << 7) | (lcrc >> 1);
payload[pos++] = lcrc << 7;
}
NRF24L01_WritePayload(payload, pos);
delayMicroseconds(option+20);
NRF24L01_WritePayload(payload, pos);
}
//
// End of HS6200 emulation
////////////////////////////
/////////////// ///////////////
// LT8900 emulation layer // LT8900 emulation layer
uint8_t LT8900_buffer[64]; uint8_t LT8900_buffer[64];

View File

@@ -250,11 +250,16 @@ uint16_t PROPEL_callback()
if (_BV(NRF24L01_07_RX_DR) & NRF24L01_ReadReg(NRF24L01_07_STATUS)) if (_BV(NRF24L01_07_RX_DR) & NRF24L01_ReadReg(NRF24L01_07_STATUS))
{// data received from the model {// data received from the model
NRF24L01_ReadPayload(packet_in, PROPEL_PACKET_SIZE); NRF24L01_ReadPayload(packet_in, PROPEL_PACKET_SIZE);
#if 1
for(uint8_t i=0; i<PROPEL_PACKET_SIZE; i++)
debug("%02X ",packet_in[i]);
debugln("");
#endif
if (packet_in[0] == 0xa3 && memcmp(&packet_in[1],rx_id,3)==0) if (packet_in[0] == 0xa3 && memcmp(&packet_in[1],rx_id,3)==0)
{ {
telemetry_counter++; //LQI telemetry_counter++; //LQI
v_lipo1=packet[5]; //number of life left? v_lipo1=packet_in[5]; //number of life left?
v_lipo2=packet[4]; //bit mask: 0x80=flying, 0x08=taking off, 0x04=landing, 0x00=landed/crashed v_lipo2=packet_in[4]; //bit mask: 0x80=flying, 0x08=taking off, 0x04=landing, 0x00=landed/crashed
if(telemetry_lost==0) if(telemetry_lost==0)
telemetry_link=1; telemetry_link=1;
} }

View File

@@ -271,7 +271,7 @@ uint16_t RLINK_callback()
TX_RSSI -= 128; TX_RSSI -= 128;
else else
TX_RSSI += 128; TX_RSSI += 128;
RX_RSSI=packet_in[7]; //Should be packet_in[7]-256 but since it's an uint8_t... RX_RSSI=packet_in[7]&0x7F; //Should be packet_in[7]-256 but since it's an uint8_t...
v_lipo1=packet_in[8]<<1; //RX Batt v_lipo1=packet_in[8]<<1; //RX Batt
v_lipo2=packet_in[9]; //Batt v_lipo2=packet_in[9]; //Batt
telemetry_link=1; //Send telemetry out telemetry_link=1; //Send telemetry out

View File

@@ -123,45 +123,32 @@ static void telemetry_set_input_sync(uint16_t refreshRate)
static void multi_send_status() static void multi_send_status()
{ {
if(protocol == 0) return;
multi_send_header(MULTI_TELEMETRY_STATUS, 24); multi_send_header(MULTI_TELEMETRY_STATUS, 24);
// Build flags // Build flags
uint8_t flags=0; uint8_t flags=0;
if (IS_INPUT_SIGNAL_on) if(IS_INPUT_SIGNAL_on)
flags |= 0x01; flags |= 0x01;
if (mode_select==MODE_SERIAL) if(mode_select==MODE_SERIAL)
flags |= 0x02; flags |= 0x02;
if (remote_callback != 0) if(remote_callback != 0)
{ {
flags |= 0x04; if(multi_protocols_index != 0xFF && IS_SUB_PROTO_VALID)
if(multi_protocols_index == 0xFF) flags |= 0x04; //Invalid protocol / sub protocol, can't make the distinction since there is no more flags...
{ if(IS_WAIT_BIND_on)
if(protocol!=PROTO_SCANNER)
flags &= ~0x04; //Invalid protocol
}
else if(IS_SUB_PROTO_INVALID)
{
flags &= ~0x04; //Invalid sub protocol
}
else if(sub_protocol&0x07)
{
uint8_t nbr=multi_protocols[multi_protocols_index].nbrSubProto;
//if(protocol==PROTO_DSM) nbr++; //Auto sub_protocol
if((sub_protocol&0x07)>=nbr )
flags &= ~0x04; //Invalid sub protocol
}
if (IS_WAIT_BIND_on)
flags |= 0x10; flags |= 0x10;
else else
if (IS_BIND_IN_PROGRESS) if(IS_BIND_IN_PROGRESS)
flags |= 0x08; flags |= 0x08;
if(multi_protocols_index != 0xFF) if(multi_protocols_index != 0xFF)
{ {
if(multi_protocols[multi_protocols_index].chMap) if(multi_protocols[multi_protocols_index].chMap)
flags |= 0x40; //Disable_ch_mapping supported flags |= 0x40; //Disable_ch_mapping supported
#ifdef FAILSAFE_ENABLE #ifdef FAILSAFE_ENABLE
if(multi_protocols[multi_protocols_index].failSafe) if(multi_protocols[multi_protocols_index].failSafe)
flags |= 0x20; //Failsafe supported flags |= 0x20; //Failsafe supported
#endif #endif
} }
if(IS_DATA_BUFFER_LOW_on) if(IS_DATA_BUFFER_LOW_on)
@@ -226,7 +213,7 @@ static void multi_send_status()
else else
Serial_write(nbr | (option_override<<4)); // number of sub protocols && option_override type Serial_write(nbr | (option_override<<4)); // number of sub protocols && option_override type
uint8_t j=0; uint8_t j=0;
if(nbr && (sub_protocol&0x07)<nbr) if(IS_SUB_PROTO_VALID)
{ {
uint8_t len=multi_protocols[multi_protocols_index].SubProtoString[0]; uint8_t len=multi_protocols[multi_protocols_index].SubProtoString[0];
uint8_t offset=len*(sub_protocol&0x07)+1; uint8_t offset=len*(sub_protocol&0x07)+1;
@@ -322,8 +309,8 @@ static void multi_send_status()
#ifdef HOTT_FW_TELEMETRY #ifdef HOTT_FW_TELEMETRY
void HOTT_short_frame() void HOTT_short_frame()
{ {
multi_send_header(MULTI_TELEMETRY_HOTT, 14); multi_send_header(MULTI_TELEMETRY_HOTT, 15);
for (uint8_t i = 0; i < 14; i++) // TX RSSI and TX LQI values followed by frame number and telemetry data for (uint8_t i = 0; i < 15; i++) // TX RSSI and TX LQI values followed by frame number and telemetry data
Serial_write(packet_in[i]); Serial_write(packet_in[i]);
} }
#endif #endif

View File

@@ -50,24 +50,32 @@ static void __attribute__((unused)) V761_set_checksum()
} }
} }
static void __attribute__((unused)) V761_send_packet() static void __attribute__((unused)) V761_send_packet()
{ {
static bool calib=false, prev_ch6=false; static bool calib=false, prev_ch6=false;
if(phase != V761_DATA) if(phase != V761_DATA)
{ {
packet[0] = rx_tx_addr[0]; packet[0] = rx_tx_addr[0];
packet[1] = rx_tx_addr[1]; packet[1] = rx_tx_addr[1];
packet[2] = rx_tx_addr[2]; packet[2] = rx_tx_addr[2];
packet[3] = rx_tx_addr[3]; packet[3] = rx_tx_addr[3];
packet[4] = hopping_frequency[1]; packet[4] = hopping_frequency[1];
packet[5] = hopping_frequency[2]; packet[5] = hopping_frequency[2];
if(phase == V761_BIND2) if(phase == V761_BIND2)
packet[6] = 0xf0; // ? packet[6] = 0xf0; // ?
} }
else else
{ {
XN297_Hopping(hopping_frequency_no++);
if(hopping_frequency_no >= V761_RF_NUM_CHANNELS)
{
hopping_frequency_no = 0;
packet_count++;
if(packet_count >= 4)
packet_count = 0;
}
packet[0] = convert_channel_8b(THROTTLE); // Throttle packet[0] = convert_channel_8b(THROTTLE); // Throttle
packet[2] = convert_channel_8b(ELEVATOR)>>1; // Elevator packet[2] = convert_channel_8b(ELEVATOR)>>1; // Elevator
@@ -82,8 +90,8 @@ static void __attribute__((unused)) V761_send_packet()
packet[3] = convert_channel_8b(RUDDER)>>1; // Rudder packet[3] = convert_channel_8b(RUDDER)>>1; // Rudder
} }
packet[5] = (packet_count++ / 3)<<6; packet[5] = packet_count<<6; // 0X, 4X, 8X, CX
packet[4] = (packet[5] == 0x40) ? 0x1a : 0x20; // ? packet[4] = 0x20; // Trims 00..20..40, 0X->20 4X->TrAil 8X->TrEle CX->TrRud
if(CH5_SW) // Mode Expert Gyro off if(CH5_SW) // Mode Expert Gyro off
flags = 0x0c; flags = 0x0c;
@@ -105,17 +113,16 @@ static void __attribute__((unused)) V761_send_packet()
|GET_FLAG(CH8_SW, 0x08) // RTH activation |GET_FLAG(CH8_SW, 0x08) // RTH activation
|GET_FLAG(CH9_SW, 0x10); // RTH on/off |GET_FLAG(CH9_SW, 0x10); // RTH on/off
if(sub_protocol==V761_3CH) if(sub_protocol==V761_3CH)
packet[6] |= 0x80; // unknown, set on original V761-1 dump but not on eachine dumps, keeping for compatibility packet[6] |= 0x80; // Unknown, set on original V761-1 dump but not on eachine dumps, keeping for compatibility
//packet counter
if(packet_count >= 12)
packet_count = 0;
NRF24L01_WriteReg(NRF24L01_05_RF_CH, hopping_frequency[hopping_frequency_no++]);
if(hopping_frequency_no >= V761_RF_NUM_CHANNELS)
hopping_frequency_no = 0;
} }
V761_set_checksum(); V761_set_checksum();
#if 0
debug("H:%02X P:",hopping_frequency_no);
for(uint8_t i=0;i<V761_PACKET_SIZE;i++)
debug(" %02X",packet[i]);
debugln("");
#endif
// Send // Send
XN297_SetPower(); XN297_SetPower();
XN297_SetTxRxMode(TX_EN); XN297_SetTxRxMode(TX_EN);
@@ -191,8 +198,9 @@ uint16_t V761_callback()
V761_send_packet(); V761_send_packet();
if(bind_counter == 0) if(bind_counter == 0)
{ {
phase = V761_DATA; packet_count = 0;
BIND_DONE; BIND_DONE;
phase = V761_DATA;
} }
else if(packet_count >= 20) else if(packet_count >= 20)
{ {

View File

@@ -26,14 +26,15 @@
#define V911S_PACKET_SIZE 16 #define V911S_PACKET_SIZE 16
#define V911S_RF_BIND_CHANNEL 35 #define V911S_RF_BIND_CHANNEL 35
#define V911S_NUM_RF_CHANNELS 8 #define V911S_NUM_RF_CHANNELS 8
#define V911S_BIND_COUNT 200 #define V911S_BIND_COUNT 800
// flags going to packet[1] // flags going to packet[1]
#define V911S_FLAG_EXPERT 0x04 #define V911S_FLAG_EXPERT 0x04
#define E119_FLAG_EXPERT 0x08 #define E119_FLAG_EXPERT 0x08 //0x00 low, 0x08 high
#define E119_FLAG_CALIB 0x40 #define E119_FLAG_CALIB 0x40
// flags going to packet[2] // flags going to packet[2]
#define V911S_FLAG_CALIB 0x01 #define V911S_FLAG_CALIB 0x01
#define A220_FLAG_6G3D 0x04
static void __attribute__((unused)) V911S_send_packet() static void __attribute__((unused)) V911S_send_packet()
{ {
@@ -66,12 +67,15 @@ static void __attribute__((unused)) V911S_send_packet()
memset(packet+1, 0x00, V911S_PACKET_SIZE - 1); memset(packet+1, 0x00, V911S_PACKET_SIZE - 1);
if(sub_protocol==V911S_STD) if(sub_protocol==V911S_STD)
{ {
packet[ 1]=V911S_FLAG_EXPERT; // short press on left button packet[ 1]=GET_FLAG(!CH6_SW,V911S_FLAG_EXPERT); // short press on left button
packet[ 2]=GET_FLAG(CH5_SW,V911S_FLAG_CALIB); // long press on right button packet[ 2]=GET_FLAG(CH5_SW,V911S_FLAG_CALIB); // long press on right button
} }
else else//E119
packet[ 1]=E119_FLAG_EXPERT // short press on left button {
|GET_FLAG(CH5_SW,E119_FLAG_CALIB); // short press on right button packet[ 1]=GET_FLAG(!CH6_SW,E119_FLAG_EXPERT) // short press on left button
|GET_FLAG( CH5_SW,E119_FLAG_CALIB); // short press on right button
packet[ 2]=GET_FLAG( CH7_SW,A220_FLAG_6G3D); // short press on right button
}
//packet[3..6]=trims TAER signed //packet[3..6]=trims TAER signed
uint16_t ch=convert_channel_16b_limit(THROTTLE ,0,0x7FF); uint16_t ch=convert_channel_16b_limit(THROTTLE ,0,0x7FF);
@@ -90,7 +94,7 @@ static void __attribute__((unused)) V911S_send_packet()
packet[12] = ch>>5; packet[12] = ch>>5;
} }
else else
{ {//E119
ch=0x7FF-ch; ch=0x7FF-ch;
packet[ 9]|= ch<<6; packet[ 9]|= ch<<6;
packet[10] = ch>>2; packet[10] = ch>>2;
@@ -103,7 +107,7 @@ static void __attribute__((unused)) V911S_send_packet()
if(sub_protocol==V911S_STD) if(sub_protocol==V911S_STD)
XN297_WritePayload(packet, V911S_PACKET_SIZE); XN297_WritePayload(packet, V911S_PACKET_SIZE);
else else//E119
XN297_WriteEnhancedPayload(packet, V911S_PACKET_SIZE, IS_BIND_IN_PROGRESS?0:1); XN297_WriteEnhancedPayload(packet, V911S_PACKET_SIZE, IS_BIND_IN_PROGRESS?0:1);
XN297_SetPower(); // Set tx_power XN297_SetPower(); // Set tx_power
@@ -115,7 +119,7 @@ static void __attribute__((unused)) V911S_RF_init()
XN297_Configure(XN297_CRCEN, XN297_SCRAMBLED, XN297_250K); XN297_Configure(XN297_CRCEN, XN297_SCRAMBLED, XN297_250K);
if(sub_protocol==V911S_STD) if(sub_protocol==V911S_STD)
XN297_SetTXAddr((uint8_t *)"KNBND",5); // V911S Bind address XN297_SetTXAddr((uint8_t *)"KNBND",5); // V911S Bind address
else else//E119
XN297_SetTXAddr((uint8_t *)"XPBND",5); // E119 Bind address XN297_SetTXAddr((uint8_t *)"XPBND",5); // E119 Bind address
XN297_HoppingCalib(V911S_NUM_RF_CHANNELS); // Calibrate all channels XN297_HoppingCalib(V911S_NUM_RF_CHANNELS); // Calibrate all channels
XN297_RFChannel(V911S_RF_BIND_CHANNEL); // Set bind channel XN297_RFChannel(V911S_RF_BIND_CHANNEL); // Set bind channel
@@ -171,8 +175,7 @@ void V911S_init(void)
rf_ch_num=0; rf_ch_num=0;
} }
else else
{ {//E119
//E119
rx_tx_addr[0]=0x30; rx_tx_addr[0]=0x30;
rx_tx_addr[1]=0xFF; rx_tx_addr[1]=0xFF;
rx_tx_addr[2]=0xD1; rx_tx_addr[2]=0xD1;

View File

@@ -236,8 +236,8 @@
#define CC2500_INSTALLED #define CC2500_INSTALLED
#define NRF24L01_INSTALLED #define NRF24L01_INSTALLED
#define SX1276_INSTALLED #define SX1276_INSTALLED
#undef ENABLE_PPM #undef ENABLE_PPM
#undef SEND_CPPM #undef SEND_CPPM
#endif #endif
//Make sure protocols are selected correctly //Make sure protocols are selected correctly
@@ -258,6 +258,7 @@
#undef DSM_CYRF6936_INO #undef DSM_CYRF6936_INO
#undef DSM_RX_CYRF6936_INO #undef DSM_RX_CYRF6936_INO
#undef E010R5_CYRF6936_INO #undef E010R5_CYRF6936_INO
#undef E01X_CYRF6936_INO
#undef E129_CYRF6936_INO #undef E129_CYRF6936_INO
#undef J6PRO_CYRF6936_INO #undef J6PRO_CYRF6936_INO
#undef LOSI_CYRF6936_INO #undef LOSI_CYRF6936_INO
@@ -295,7 +296,6 @@
#undef CX10_NRF24L01_INO #undef CX10_NRF24L01_INO
#undef DM002_NRF24L01_INO #undef DM002_NRF24L01_INO
#undef E016H_NRF24L01_INO #undef E016H_NRF24L01_INO
#undef E01X_NRF24L01_INO
#undef ESKY_NRF24L01_INO #undef ESKY_NRF24L01_INO
#undef ESKY150_NRF24L01_INO #undef ESKY150_NRF24L01_INO
#undef FQ777_NRF24L01_INO #undef FQ777_NRF24L01_INO
@@ -318,6 +318,7 @@
#undef TIGER_NRF24L01_INO #undef TIGER_NRF24L01_INO
#undef V2X2_NRF24L01_INO #undef V2X2_NRF24L01_INO
#undef V761_NRF24L01_INO #undef V761_NRF24L01_INO
#undef XERALL_NRF24L01_INO
#undef YD717_NRF24L01_INO #undef YD717_NRF24L01_INO
#undef ZSX_NRF24L01_INO #undef ZSX_NRF24L01_INO
#endif #endif
@@ -333,6 +334,11 @@
#undef V911S_CCNRF_INO #undef V911S_CCNRF_INO
#undef XK_CCNRF_INO #undef XK_CCNRF_INO
#endif #endif
#if not defined(STM32_BOARD)
//RF2500 emulation does not work on atmega...
#undef E010R5_CYRF6936_INO
#undef E129_CYRF6936_INO
#endif
#if not defined(STM32_BOARD) #if not defined(STM32_BOARD)
#undef SX1276_INSTALLED #undef SX1276_INSTALLED
#endif #endif
@@ -383,6 +389,7 @@
#undef MT99XX_HUB_TELEMETRY #undef MT99XX_HUB_TELEMETRY
#undef MLINK_HUB_TELEMETRY #undef MLINK_HUB_TELEMETRY
#undef MLINK_FW_TELEMETRY #undef MLINK_FW_TELEMETRY
#undef MULTI_CONFIG_INO
#else #else
#if not defined(SCANNER_CC2500_INO) || not defined(SCANNER_TELEMETRY) #if not defined(SCANNER_CC2500_INO) || not defined(SCANNER_TELEMETRY)
#undef SCANNER_TELEMETRY #undef SCANNER_TELEMETRY
@@ -466,7 +473,7 @@
//protocols using FRSKYD user frames //protocols using FRSKYD user frames
#undef HUB_TELEMETRY #undef HUB_TELEMETRY
#endif #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) && not defined(LOLI_HUB_TELEMETRY) && not defined(MLINK_HUB_TELEMETRY) && not defined(MLINK_FW_TELEMETRY) && not defined(MT99XX_HUB_TELEMETRY) #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) && not defined(LOLI_HUB_TELEMETRY) && not defined(MLINK_HUB_TELEMETRY) && not defined(MLINK_FW_TELEMETRY) && not defined(MT99XX_HUB_TELEMETRY) && not defined(MULTI_CONFIG_INO)
#undef TELEMETRY #undef TELEMETRY
#undef INVERT_TELEMETRY #undef INVERT_TELEMETRY
#undef MULTI_TELEMETRY #undef MULTI_TELEMETRY

View File

@@ -0,0 +1,283 @@
/*
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/>.
*/
// compatible with XERALL
#if defined(XERALL_NRF24L01_INO)
#include "iface_xn297.h"
//#define XERALL_ORIGINAL_ID
#define XERALL_PACKET_PERIOD 2500 //2046
#define XERALL_PACKET_SIZE 10
#define XERALL_NUM_RF_CHANNELS 4
#define XERALL_BIND_COUNT 15000 //about 30sec
// flags going to packet[6]
#define XERALL_FLAG_VIDEO 0x80
#define XERALL_FLAG_PHOTO 0x40
// flags going to packet[7]
#define XERALL_FLAG_RATE 0x80
#define XERALL_FLAG_FLIGHT_GROUND 0x20
#define XERALL_FLAG_HEADING_HOLD 0x04
#define XERALL_FLAG_ONE_BUTTON 0x02
enum {
XERALL_DATA,
XERALL_RX,
XERALL_CHECK,
};
static void __attribute__((unused)) XERALL_send_packet()
{
if(bind_phase)
bind_phase--;
else
{ // Hopping frequency
if(packet_sent==0)
{
XN297_Hopping(hopping_frequency_no);
hopping_frequency_no++;
hopping_frequency_no &= (XERALL_NUM_RF_CHANNELS-1);
}
packet_sent++;
if(IS_BIND_IN_PROGRESS)
{
if(packet_sent > 24)
packet_sent=0; // Hopp after 25 packets
}
else
{
if(packet_sent > 18)
packet_sent = 0; // Hopp after 19 packets
}
// Packet
if(IS_BIND_IN_PROGRESS && (bind_counter&0x10)) // Alternate bind and normal packets
{ // Bind packet: 01 56 06 23 00 13 20 40 02 00 and 01 F9 58 31 00 13 20 40 05 00
if(packet[0] != 0x01)
{
XN297_SetTXAddr((uint8_t *)"\x01\x01\x01\x01\x09", 5); // Bind address
XN297_SetRXAddr((uint8_t *)"\x01\x01\x01\x01\x09", XERALL_PACKET_SIZE);
}
packet[0] = 0x01;
for(uint8_t i=0;i<5;i++)
packet[i+1] = rx_tx_addr[i];
packet[9] = 0;
}
else
{
if(packet[0] != 0x08)
{
XN297_SetTXAddr(rx_tx_addr, 5);
XN297_SetRXAddr(rx_tx_addr, XERALL_PACKET_SIZE);
}
// Normal packet: 08 32 7C 1C 20 20 20 40 0A 00
packet[0] = 0x08;
//Throttle
packet[1] = convert_channel_16b_limit(THROTTLE ,0,0x32)<<1; //00..64 but only even values
//Rudder
packet[2] = (0xFF-convert_channel_8b(RUDDER))&0xF8; //F8..00 -> 5 bits
//Elevator
uint8_t ch = convert_channel_8b(ELEVATOR)>>3;
packet[2] |= ch>>2; //00..07 -> 3 bits high
packet[3] = ch<<6; //00,40,80,C0 -> 2 bits low
//Aileron
packet[3] |= ((0xFF-convert_channel_8b(AILERON))>>3)<<1; //5 bits
//Trim Rudder 0x00..0x20..0x3F
packet[4] = convert_channel_8b(CH11)>>2;
//Trim Elevator 0x00..0x20..0x3F
packet[5] = convert_channel_8b(CH12)>>2;
}
}
// Flags + Trim Aileron
//packet[6]
// 0x20 -> 0x60 short press photo/video => |0x40 -> momentary
// 0x20 -> 0xA0 long press photo/video => |0x80 -> toggle
// 0xA0 -> 0xE0 short press photo/video => |0x40 -> momentary
// 0x20 -> 0x00..0x20..0x3F Trim Aileron
packet[6] = (convert_channel_8b(CH13)>>2)
| GET_FLAG(CH9_SW,XERALL_FLAG_PHOTO)
| GET_FLAG(CH10_SW,XERALL_FLAG_VIDEO);
// Flags
// 0x40 -> 0x44 Heading hold mode => |0x04 -> toggle
// 0x40 -> 0xC0 High/low speed => |0x80 -> toggle
// 0x40 -> 0x42 One button takeoff/landing/emergency => |0x02 -> toggle
// 0x40 -> 0x60 Flight/Ground => |0x20 -> toggle
packet[7] = 0x40
| GET_FLAG(CH5_SW,XERALL_FLAG_FLIGHT_GROUND)
| GET_FLAG(CH6_SW,XERALL_FLAG_ONE_BUTTON)
| GET_FLAG(CH7_SW,XERALL_FLAG_RATE)
| GET_FLAG(CH8_SW,XERALL_FLAG_HEADING_HOLD);
// CRC
uint8_t sum = 0;
for(uint8_t i=1;i<8;i++)
sum += packet[i];
packet[8] = sum & 0x0F;
//0x00 -> 0x1A on first telemetry packet received
//packet[9] = 0x00;
// Send
XN297_SetPower();
XN297_SetTxRxMode(TXRX_OFF);
XN297_SetTxRxMode(TX_EN);
XN297_WriteEnhancedPayload(packet, XERALL_PACKET_SIZE, 0);
#if 0
debug("H:%d,P:",hopping_frequency_no);
for(uint8_t i=0; i<XERALL_PACKET_SIZE; i++)
debug("%02X ", packet[i]);
debugln();
#endif
}
static void __attribute__((unused)) XERALL_RF_init()
{
XN297_Configure(XN297_CRCEN, XN297_SCRAMBLED, XN297_1M);
}
static void __attribute__((unused)) XERALL_initialize_txid()
{
rx_tx_addr[0] = rx_tx_addr[3];
#ifdef XERALL_ORIGINAL_ID
// Pascal
if(RX_num)
{
rx_tx_addr[0]=0x56;
rx_tx_addr[1]=0x06;
rx_tx_addr[2]=0x23;
rx_tx_addr[3]=0x00;
rx_tx_addr[4]=0x13;
}
else
{
// Alfons
rx_tx_addr[0]=0xF9;
rx_tx_addr[1]=0x58;
rx_tx_addr[2]=0x31;
rx_tx_addr[3]=0x00;
rx_tx_addr[4]=0x13;
}
#endif
rx_tx_addr[3] = 0x00;
rx_tx_addr[4] = 0x13;
hopping_frequency[0] = 56; // 0x38
hopping_frequency[1] = 46; // 0x2E
hopping_frequency[2] = 61; // 0x3D
hopping_frequency[3] = 51; // 0x33
}
#define XERALL_WRITE_WAIT 600
#define XERALL_CHECK_WAIT 300
uint16_t XERALL_callback()
{
static uint8_t wait = 0;
switch(phase)
{
case XERALL_DATA:
#ifdef MULTI_SYNC
telemetry_set_input_sync(XERALL_PACKET_PERIOD);
#endif
if (bind_counter == 0)
BIND_DONE;
else
bind_counter--;
XERALL_send_packet();
phase++;
return XERALL_WRITE_WAIT;
case XERALL_RX:
// switch to RX mode
XN297_SetTxRxMode(TXRX_OFF);
XN297_SetTxRxMode(RX_EN);
phase++;
return XERALL_PACKET_PERIOD-XERALL_WRITE_WAIT-XERALL_CHECK_WAIT;
case XERALL_CHECK:
if( XN297_IsRX() )
{ // RX fifo data ready
uint8_t len = XN297_ReadEnhancedPayload(packet_in, XERALL_PACKET_SIZE);
if(len != 255) // CRC OK
{
#if 0
debug("RX(%d):",len);
for(uint8_t i=0; i<len; i++)
debug("%02X ", packet_in[i]);
debugln();
#endif
if(len == XERALL_PACKET_SIZE && packet_in[0] == 0x11)
{ // Request for ack packet
// Ack the telem packet
XN297_SetTxRxMode(TXRX_OFF);
XN297_SetTxRxMode(TX_EN);
XN297_WriteEnhancedPayload(packet, 0, 0);
packet[9] = packet_in[9];
if(packet[0] == 0x01) // Last packet sent was a bind packet
{// Build bind response
packet[0] = 0x02;
for(uint8_t i=1; i<5; i++)
packet[i] = packet_in[i]; // Tank ID???
bind_phase = 14;
XN297_SetTXAddr(rx_tx_addr, 5);
}
wait = 0;
phase = XERALL_DATA;
break;
}
else if(len == XERALL_PACKET_SIZE && packet_in[0] == 0x12)
{
BIND_DONE;
bind_phase = 0;
wait = 0;
}
else if(len == 0)
wait = 5; // The quad wants to talk let's pause sending data...
}
if(wait)
{ // switch to RX mode
XN297_SetTxRxMode(TXRX_OFF);
XN297_SetTxRxMode(RX_EN);
}
}
if(wait)
{
wait--;
break;
}
phase = XERALL_DATA;
return XERALL_CHECK_WAIT;
}
return XERALL_PACKET_PERIOD;
}
void XERALL_init(void)
{
XERALL_initialize_txid();
XERALL_RF_init();
if(IS_BIND_IN_PROGRESS)
bind_counter = XERALL_BIND_COUNT;
hopping_frequency_no=0;
packet_sent = 0;
bind_phase = 0;
memset(packet, 0, XERALL_PACKET_SIZE);
phase = XERALL_DATA;
}
#endif

View File

@@ -119,29 +119,34 @@ static boolean __attribute__((unused)) XN297Dump_process_packet(void)
} }
//Try enhanced payload //Try enhanced payload
crc = 0xb5d2; uint16_t crc_save = 0xb5d2;
packet_length=0; packet_length=0;
for (uint8_t i = 0; i < XN297DUMP_MAX_PACKET_LEN-XN297DUMP_CRC_LENGTH; i++) for (uint8_t i = 0; i < XN297DUMP_MAX_PACKET_LEN-XN297DUMP_CRC_LENGTH; i++)
{ {
packet_sc[i]=packet[i]^xn297_scramble[i]; packet_sc[i]=packet[i]^xn297_scramble[i];
crc = crc_save;
crc16_update( packet[i], 8); crc16_update( packet[i], 8);
crc_save = crc;
crc16_update( packet[i+1] & 0xC0, 2); crc16_update( packet[i+1] & 0xC0, 2);
crcxored=(packet[i+1]<<10)|(packet[i+2]<<2)|(packet[i+3]>>6) ; crcxored=(packet[i+1]<<10)|(packet[i+2]<<2)|(packet[i+3]>>6) ;
if((crc ^ pgm_read_word(&xn297_crc_xorout_scrambled_enhanced[i - 3])) == crcxored) if(i>=3)
{ // Found a valid CRC for the enhanced payload mode {
packet_length=i; if((crc ^ pgm_read_word(&xn297_crc_xorout_scrambled_enhanced[i - 3])) == crcxored)
scramble=true; { // Found a valid CRC for the enhanced payload mode
i++; packet_length=i;
packet_sc[i]=packet[i]^xn297_scramble[i]; scramble=true;
memcpy(packet_un,packet_sc,packet_length+2); // unscramble packet i++;
break; packet_sc[i]=packet[i]^xn297_scramble[i];
} memcpy(packet_un,packet_sc,packet_length+2); // unscramble packet
if((crc ^ pgm_read_word(&xn297_crc_xorout_enhanced[i - 3])) == crcxored) break;
{ // Found a valid CRC for the enhanced payload mode }
packet_length=i; if((crc ^ pgm_read_word(&xn297_crc_xorout_enhanced[i - 3])) == crcxored)
scramble=false; { // Found a valid CRC for the enhanced payload mode
memcpy(packet_un,packet,packet_length+2); // packet is unscrambled packet_length=i;
break; scramble=false;
memcpy(packet_un,packet,packet_length+2); // packet is unscrambled
break;
}
} }
} }
if(packet_length!=0) if(packet_length!=0)
@@ -324,7 +329,7 @@ static uint16_t XN297Dump_callback()
switch(bitrate) switch(bitrate)
{ {
case XN297DUMP_250K: case XN297DUMP_250K:
XN297_Configure(XN297_CRCEN, scramble?XN297_SCRAMBLED:XN297_UNSCRAMBLED, XN297_250K); XN297_Configure(XN297_CRCEN, scramble?XN297_SCRAMBLED:XN297_UNSCRAMBLED, XN297_250K, true);
debug("250K"); debug("250K");
break; break;
case XN297DUMP_2M: case XN297DUMP_2M:
@@ -426,9 +431,12 @@ static uint16_t XN297Dump_callback()
{ // RX fifo data ready { // RX fifo data ready
// if(NRF24L01_ReadReg(NRF24L01_09_CD)) // if(NRF24L01_ReadReg(NRF24L01_09_CD))
{ {
boolean res; uint8_t res;
if(enhanced) if(enhanced)
{
res=XN297_ReadEnhancedPayload(packet, packet_length); res=XN297_ReadEnhancedPayload(packet, packet_length);
res++;
}
else else
res=XN297_ReadPayload(packet, packet_length); res=XN297_ReadPayload(packet, packet_length);
if(res) if(res)
@@ -521,9 +529,12 @@ static uint16_t XN297Dump_callback()
{ // RX fifo data ready { // RX fifo data ready
//if(NRF24L01_ReadReg(NRF24L01_09_CD)) //if(NRF24L01_ReadReg(NRF24L01_09_CD))
{ {
boolean res; uint8_t res;
if(enhanced) if(enhanced)
{
res=XN297_ReadEnhancedPayload(packet, packet_length); res=XN297_ReadEnhancedPayload(packet, packet_length);
res++;
}
else else
res=XN297_ReadPayload(packet, packet_length); res=XN297_ReadPayload(packet, packet_length);
if(res) if(res)
@@ -567,9 +578,12 @@ static uint16_t XN297Dump_callback()
{ // RX fifo data ready { // RX fifo data ready
//if(NRF24L01_ReadReg(NRF24L01_09_CD)) //if(NRF24L01_ReadReg(NRF24L01_09_CD))
{ {
boolean res; uint8_t res;
if(enhanced) if(enhanced)
{
res=XN297_ReadEnhancedPayload(packet, packet_length); res=XN297_ReadEnhancedPayload(packet, packet_length);
res++;
}
else else
res=XN297_ReadPayload(packet, packet_length); res=XN297_ReadPayload(packet, packet_length);
if(res) if(res)

View File

@@ -53,7 +53,7 @@ const uint16_t xn297_crc_xorout_enhanced[] = {
0xABFC, 0xE68E, 0x0DE7, 0x28A2, 0x1965 }; 0xABFC, 0xE68E, 0x0DE7, 0x28A2, 0x1965 };
#endif #endif
static bool __attribute__((unused)) XN297_Configure(bool crc_en, bool scramble_en, bool bitrate) static bool __attribute__((unused)) XN297_Configure(bool crc_en, bool scramble_en, bool bitrate, bool force_nrf)
{ {
xn297_crc = crc_en; xn297_crc = crc_en;
xn297_scramble_enabled = scramble_en; xn297_scramble_enabled = scramble_en;
@@ -61,7 +61,7 @@ static bool __attribute__((unused)) XN297_Configure(bool crc_en, bool scramble_e
xn297_rf = XN297_NRF; xn297_rf = XN297_NRF;
#if defined(NRF24L01_INSTALLED) and defined(CC2500_INSTALLED) #if defined(NRF24L01_INSTALLED) and defined(CC2500_INSTALLED)
if(bitrate == XN297_1M) if(bitrate == XN297_1M || force_nrf)
xn297_rf = XN297_NRF; // Use NRF24L01 xn297_rf = XN297_NRF; // Use NRF24L01
else else
xn297_rf = XN297_CC2500; // Use CC2500 xn297_rf = XN297_CC2500; // Use CC2500
@@ -292,7 +292,7 @@ static void __attribute__((unused)) XN297_WriteEnhancedPayload(uint8_t* msg, uin
uint8_t last = 0; uint8_t last = 0;
static uint8_t pid=0; static uint8_t pid=0;
if (xn297_rf == XN297_NRF && xn297_addr_len < 4 && xn297_rf == XN297_NRF) if (xn297_rf == XN297_NRF && xn297_addr_len < 4)
{ // If address length (which is defined by receiver address length) is less than 4 the TX address can't fit the preamble, so the last byte goes here { // If address length (which is defined by receiver address length) is less than 4 the TX address can't fit the preamble, so the last byte goes here
buf[last++] = 0x55; buf[last++] = 0x55;
} }
@@ -314,22 +314,25 @@ static void __attribute__((unused)) XN297_WriteEnhancedPayload(uint8_t* msg, uin
buf[last] = (pid << 7) | (noack << 6); buf[last] = (pid << 7) | (noack << 6);
// payload // payload
buf[last]|= bit_reverse(msg[0]) >> 2; // first 6 bit of payload if(len)
if(xn297_scramble_enabled)
buf[last] ^= xn297_scramble[scramble_index++];
for (uint8_t i = 0; i < len-1; ++i)
{ {
last++; buf[last]|= bit_reverse(msg[0]) >> 2; // first 6 bit of payload
buf[last] = (bit_reverse(msg[i]) << 6) | (bit_reverse(msg[i+1]) >> 2);
if(xn297_scramble_enabled) if(xn297_scramble_enabled)
buf[last] ^= xn297_scramble[scramble_index++]; buf[last] ^= xn297_scramble[scramble_index++];
}
last++; for (uint8_t i = 0; i < len-1; ++i)
buf[last] = bit_reverse(msg[len-1]) << 6; // last 2 bit of payload {
if(xn297_scramble_enabled) last++;
buf[last] ^= xn297_scramble[scramble_index++] & 0xc0; buf[last] = (bit_reverse(msg[i]) << 6) | (bit_reverse(msg[i+1]) >> 2);
if(xn297_scramble_enabled)
buf[last] ^= xn297_scramble[scramble_index++];
}
last++;
buf[last] = bit_reverse(msg[len-1]) << 6; // last 2 bit of payload
if(xn297_scramble_enabled)
buf[last] ^= xn297_scramble[scramble_index++] & 0xc0;
}
// crc // crc
if (xn297_crc) if (xn297_crc)
@@ -444,7 +447,9 @@ static uint8_t __attribute__((unused)) XN297_ReadEnhancedPayload(uint8_t* msg, u
if(xn297_scramble_enabled) if(xn297_scramble_enabled)
pcf_size ^= xn297_scramble[xn297_addr_len]; pcf_size ^= xn297_scramble[xn297_addr_len];
pcf_size = pcf_size >> 1; pcf_size = pcf_size >> 1;
for(int i=0; i<len; i++) if(pcf_size>32)
return 255; // Error
for(uint8_t i=0; i< pcf_size; i++)
{ {
msg[i] = bit_reverse((buffer[i+1] << 2) | (buffer[i+2] >> 6)); msg[i] = bit_reverse((buffer[i+1] << 2) | (buffer[i+2] >> 6));
if(xn297_scramble_enabled) if(xn297_scramble_enabled)
@@ -461,20 +466,20 @@ static uint8_t __attribute__((unused)) XN297_ReadEnhancedPayload(uint8_t* msg, u
for (uint8_t i = 0; i < xn297_addr_len; ++i) for (uint8_t i = 0; i < xn297_addr_len; ++i)
crc16_update( xn297_rx_addr[xn297_addr_len-i-1], 8); crc16_update( xn297_rx_addr[xn297_addr_len-i-1], 8);
//process payload //process payload
for (uint8_t i = 0; i < len+1; ++i) for (uint8_t i = 0; i < pcf_size+1; ++i)
crc16_update( buffer[i], 8); crc16_update( buffer[i], 8);
crc16_update( buffer[len+1] & 0xc0, 2); crc16_update( buffer[pcf_size+1] & 0xc0, 2);
//xorout //xorout
if (xn297_scramble_enabled) if (xn297_scramble_enabled)
crc ^= pgm_read_word(&xn297_crc_xorout_scrambled_enhanced[xn297_addr_len-3+len]); crc ^= pgm_read_word(&xn297_crc_xorout_scrambled_enhanced[xn297_addr_len-3+pcf_size]);
#ifdef XN297DUMP_NRF24L01_INO #ifdef XN297DUMP_NRF24L01_INO
else else
crc ^= pgm_read_word(&xn297_crc_xorout_enhanced[xn297_addr_len - 3 + len]); crc ^= pgm_read_word(&xn297_crc_xorout_enhanced[xn297_addr_len - 3 + pcf_size]);
#endif #endif
uint16_t crcxored=(buffer[len+1]<<10)|(buffer[len+2]<<2)|(buffer[len+3]>>6) ; uint16_t crcxored=(buffer[pcf_size+1]<<10)|(buffer[pcf_size+2]<<2)|(buffer[pcf_size+3]>>6) ;
if( crc == crcxored) if( crc == crcxored)
return pcf_size; // CRC OK return pcf_size; // CRC OK
return 0; // CRC NOK return 255; // CRC NOK
} }
static bool __attribute__((unused)) XN297_IsPacketSent() static bool __attribute__((unused)) XN297_IsPacketSent()

View File

@@ -188,6 +188,7 @@
#define DSM_CYRF6936_INO #define DSM_CYRF6936_INO
#define DSM_RX_CYRF6936_INO #define DSM_RX_CYRF6936_INO
#define E010R5_CYRF6936_INO #define E010R5_CYRF6936_INO
#define E01X_CYRF6936_INO
#define E129_CYRF6936_INO #define E129_CYRF6936_INO
#define J6PRO_CYRF6936_INO #define J6PRO_CYRF6936_INO
#define LOSI_CYRF6936_INO #define LOSI_CYRF6936_INO
@@ -220,12 +221,11 @@
#define BAYANG_RX_NRF24L01_INO #define BAYANG_RX_NRF24L01_INO
#define BUGSMINI_NRF24L01_INO #define BUGSMINI_NRF24L01_INO
#define CABELL_NRF24L01_INO #define CABELL_NRF24L01_INO
#define CFLIE_NRF24L01_INO //#define CFLIE_NRF24L01_INO
#define CG023_NRF24L01_INO #define CG023_NRF24L01_INO
#define CX10_NRF24L01_INO //Include Q2X2 protocol #define CX10_NRF24L01_INO //Include Q2X2 protocol
#define DM002_NRF24L01_INO #define DM002_NRF24L01_INO
#define E016H_NRF24L01_INO #define E016H_NRF24L01_INO
#define E01X_NRF24L01_INO
#define ESKY_NRF24L01_INO #define ESKY_NRF24L01_INO
#define ESKY150_NRF24L01_INO #define ESKY150_NRF24L01_INO
#define FQ777_NRF24L01_INO #define FQ777_NRF24L01_INO
@@ -238,7 +238,7 @@
#define JJRC345_NRF24L01_INO #define JJRC345_NRF24L01_INO
#define KN_NRF24L01_INO #define KN_NRF24L01_INO
#define LOLI_NRF24L01_INO #define LOLI_NRF24L01_INO
#define MOULDKG_NRF24L01_INO //#define MOULDKG_NRF24L01_INO
#define NCC1701_NRF24L01_INO #define NCC1701_NRF24L01_INO
#define POTENSIC_NRF24L01_INO #define POTENSIC_NRF24L01_INO
#define PROPEL_NRF24L01_INO #define PROPEL_NRF24L01_INO
@@ -248,6 +248,7 @@
#define TIGER_NRF24L01_INO #define TIGER_NRF24L01_INO
#define V2X2_NRF24L01_INO #define V2X2_NRF24L01_INO
#define V761_NRF24L01_INO #define V761_NRF24L01_INO
#define XERALL_NRF24L01_INO
#define YD717_NRF24L01_INO #define YD717_NRF24L01_INO
#define ZSX_NRF24L01_INO #define ZSX_NRF24L01_INO
@@ -292,9 +293,9 @@
/**************************/ /**************************/
/*** FAILSAFE SETTINGS ***/ /*** FAILSAFE SETTINGS ***/
/**************************/ /**************************/
//The following protocols are supporting failsafe: FrSkyX, Devo, WK2x01, Futaba/SFHSS, HISKY/HK310 and AFHDS2A //The following protocols are supporting failsafe: FrSkyX, FrSkyX2, FRSKYR9, Devo, WK2x01, Futaba/SFHSS, HISKY/HK310, HoTT, LOLI, MLINK, WFLY, WFLY2 and AFHDS2A
//In Serial mode failsafe is configured on the radio itself. //In Serial mode failsafe is configured on the radio itself.
//In PPM mode and only after the module is up and fully operational, press the bind button for at least 5sec to send the current stick positions as failsafe to the RX. //In PPM mode and only after the module is up and fully operational, press the bind button for at least 5sec to send all the current channels positions as failsafe to the RX.
//If you want to disable failsafe globally comment the line below using "//". //If you want to disable failsafe globally comment the line below using "//".
#define FAILSAFE_ENABLE #define FAILSAFE_ENABLE
@@ -548,6 +549,8 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]= {
PPM_SBUS PPM_SBUS
PWM_IB16 PWM_IB16
PPM_IB16 PPM_IB16
PWM_SB16
PPM_SB16
PROTO_AFHDS2A_RX PROTO_AFHDS2A_RX
NONE NONE
PROTO_ASSAN PROTO_ASSAN
@@ -709,7 +712,8 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]= {
PROTO_JOYSWAY PROTO_JOYSWAY
NONE NONE
PROTO_KF606 PROTO_KF606
NONE KF606_KF606
KF606_MIG320
PROTO_KN PROTO_KN
WLTOYS WLTOYS
FEILUN FEILUN
@@ -741,6 +745,7 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]= {
FY805 FY805
A180 A180
DRAGON DRAGON
F949G
PROTO_NCC1701 PROTO_NCC1701
NONE NONE
PROTO_OMP PROTO_OMP
@@ -815,6 +820,8 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]= {
W6_6_1 W6_6_1
W6_HEL W6_HEL
W6_HEL_I W6_HEL_I
PROTO_XERALL
NONE
PROTO_XK PROTO_XK
X450 X450
X420 X420

View File

@@ -0,0 +1,13 @@
#ifndef _IFACE_HS6200_H_
#define _IFACE_HS6200_H_
#include "iface_cyrf6936.h"
//HS6200
static void __attribute__((unused)) HS6200_Init(bool);
static void __attribute__((unused)) HS6200_SetTXAddr(const uint8_t*, uint8_t);
static void __attribute__((unused)) HS6200_SendPayload(uint8_t*, uint8_t);
#define HS6200_SetPower() CYRF_GFSK1M_SetPower()
#define HS6200_RFChannel(X) CYRF_ConfigRFChannel(X)
#endif

View File

@@ -23,7 +23,7 @@
////////////// //////////////
// Functions // Functions
static bool __attribute__((unused)) XN297_Configure(bool, bool, bool); static bool __attribute__((unused)) XN297_Configure(bool, bool, bool, bool force_nrf=false);
static void __attribute__((unused)) XN297_SetTXAddr(const uint8_t*, uint8_t); static void __attribute__((unused)) XN297_SetTXAddr(const uint8_t*, uint8_t);
static void __attribute__((unused)) XN297_SetRXAddr(const uint8_t*, uint8_t); static void __attribute__((unused)) XN297_SetRXAddr(const uint8_t*, uint8_t);
static void __attribute__((unused)) XN297_SetTxRxMode(enum TXRX_State); static void __attribute__((unused)) XN297_SetTxRxMode(enum TXRX_State);

View File

@@ -79,13 +79,13 @@ CFlie|38|CFlie||||||||NRF24L01|
[E010R5](Protocols_Details.md#E010R5---81)|81|||||||||CYRF6936/NRF24L01|RF2500 [E010R5](Protocols_Details.md#E010R5---81)|81|||||||||CYRF6936/NRF24L01|RF2500
[E016H](Protocols_Details.md#E016H---85)|85|||||||||NRF24L01|XN297 [E016H](Protocols_Details.md#E016H---85)|85|||||||||NRF24L01|XN297
[E016HV2](Protocols_Details.md#E016HV2---80)|80|||||||||CC2500/NRF24L01|unknown [E016HV2](Protocols_Details.md#E016HV2---80)|80|||||||||CC2500/NRF24L01|unknown
[E01X](Protocols_Details.md#E01X---45)|45|E012|E015|||||||NRF24L01|HS6200 [E01X](Protocols_Details.md#E01X---45)|45|E012|E015|||||||CYRF6936|HS6200
[E129](Protocols_Details.md#E129---83)|83|||||||||CYRF6936/NRF24L01|RF2500 [E129](Protocols_Details.md#E129---83)|83|||||||||CYRF6936/NRF24L01|RF2500
[ESky](Protocols_Details.md#ESKY---16)|16|ESky|ET4|||||||NRF24L01| [ESky](Protocols_Details.md#ESKY---16)|16|ESky|ET4|||||||NRF24L01|
[ESky150](Protocols_Details.md#ESKY150---35)|35|||||||||NRF24L01| [ESky150](Protocols_Details.md#ESKY150---35)|35|||||||||NRF24L01|
[ESky150V2](Protocols_Details.md#ESKY150V2---69)|69|||||||||CC2500|NRF51822 [ESky150V2](Protocols_Details.md#ESKY150V2---69)|69|||||||||CC2500|NRF51822
[Flysky](Protocols_Details.md#FLYSKY---1)|1|Flysky|V9x9|V6x6|V912|CX20||||A7105| [Flysky](Protocols_Details.md#FLYSKY---1)|1|Flysky|V9x9|V6x6|V912|CX20||||A7105|
[Flysky AFHDS2A](Protocols_Details.md#FLYSKY-AFHDS2A---28)|28|PWM_IBUS|PPM_IBUS|PWM_SBUS|PPM_SBUS|PWM_IBUS16|PPM_IBUS16|||A7105| [Flysky AFHDS2A](Protocols_Details.md#FLYSKY-AFHDS2A---28)|28|PWM_IBUS|PPM_IBUS|PWM_SBUS|PPM_SBUS|PWM_IBUS16|PPM_IBUS16|PWM_SBUS16|PPM_SBUS16|A7105|
[Flysky AFHDS2A RX](Protocols_Details.md#FLYSKY-AFHDS2A-RX---56)|56|Multi|CPPM|||||||A7105| [Flysky AFHDS2A RX](Protocols_Details.md#FLYSKY-AFHDS2A-RX---56)|56|Multi|CPPM|||||||A7105|
[FQ777](Protocols_Details.md#FQ777---23)|23|||||||||NRF24L01|SSV7241 [FQ777](Protocols_Details.md#FQ777---23)|23|||||||||NRF24L01|SSV7241
[FrskyD](Protocols_Details.md#FRSKYD---3)|3|D8|Cloned|||||||CC2500| [FrskyD](Protocols_Details.md#FRSKYD---3)|3|D8|Cloned|||||||CC2500|
@@ -110,7 +110,7 @@ CFlie|38|CFlie||||||||NRF24L01|
[J6Pro](Protocols_Details.md#J6Pro---22)|22|||||||||CYRF6936| [J6Pro](Protocols_Details.md#J6Pro---22)|22|||||||||CYRF6936|
[JJRC345](Protocols_Details.md#JJRC345---71)|71|JJRC345|SkyTmblr|||||||NRF24L01|XN297 [JJRC345](Protocols_Details.md#JJRC345---71)|71|JJRC345|SkyTmblr|||||||NRF24L01|XN297
[JOYSWAY](Protocols_Details.md#JOYSWAY---84)|84|||||||||NRF24L01|XN297 [JOYSWAY](Protocols_Details.md#JOYSWAY---84)|84|||||||||NRF24L01|XN297
[KF606](Protocols_Details.md#KF606---49)|49|||||||||NRF24L01|XN297 [KF606](Protocols_Details.md#KF606---49)|49|KF606|MIG320|||||||NRF24L01|XN297
[KN](Protocols_Details.md#KN---9)|9|WLTOYS|FEILUN|||||||NRF24L01| [KN](Protocols_Details.md#KN---9)|9|WLTOYS|FEILUN|||||||NRF24L01|
[Kyosho](Protocols_Details.md#Kyosho---73)|73|FHSS|Hype|||||||A7105| [Kyosho](Protocols_Details.md#Kyosho---73)|73|FHSS|Hype|||||||A7105|
[LOLI](Protocols_Details.md#LOLI---82)|82|||||||||NRF24L01| [LOLI](Protocols_Details.md#LOLI---82)|82|||||||||NRF24L01|
@@ -118,7 +118,7 @@ CFlie|38|CFlie||||||||NRF24L01|
[MJXq](Protocols_Details.md#MJXQ---18)|18|WLH08|X600|X800|H26D|E010*|H26WH|PHOENIX*||NRF24L01|XN297 [MJXq](Protocols_Details.md#MJXQ---18)|18|WLH08|X600|X800|H26D|E010*|H26WH|PHOENIX*||NRF24L01|XN297
[MLINK](Protocols_Details.md#MLINK---78)|78|||||||||CYRF6936| [MLINK](Protocols_Details.md#MLINK---78)|78|||||||||CYRF6936|
[MouldKg](Protocols_Details.md#mouldkg---90)|90|Analog|Digit|||||||NRF24L01|XN297 [MouldKg](Protocols_Details.md#mouldkg---90)|90|Analog|Digit|||||||NRF24L01|XN297
[MT99xx](Protocols_Details.md#MT99XX---17)|17|MT|H7|YZ|LS|FY805|A180|DRAGON||NRF24L01|XN297 [MT99xx](Protocols_Details.md#MT99XX---17)|17|MT|H7|YZ|LS|FY805|A180|DRAGON|F949G|NRF24L01|XN297
[NCC1701](Protocols_Details.md#NCC1701---44)|44|||||||||NRF24L01| [NCC1701](Protocols_Details.md#NCC1701---44)|44|||||||||NRF24L01|
[OMP](Protocols_Details.md#OMP---77)|77|||||||||CC2500&NRF24L01|XN297L [OMP](Protocols_Details.md#OMP---77)|77|||||||||CC2500&NRF24L01|XN297L
[OpenLRS](Protocols_Details.md#OpenLRS---27)|27|||||||||None| [OpenLRS](Protocols_Details.md#OpenLRS---27)|27|||||||||None|
@@ -144,6 +144,7 @@ CFlie|38|CFlie||||||||NRF24L01|
[WFLY](Protocols_Details.md#WFLY---40)|40|WFR0x||||||||CYRF6936| [WFLY](Protocols_Details.md#WFLY---40)|40|WFR0x||||||||CYRF6936|
[WFLY2](Protocols_Details.md#WFLY2---79)|79|RF20x||||||||A7105| [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| [WK2x01](Protocols_Details.md#WK2X01---30)|30|WK2801|WK2401|W6_5_1|W6_6_1|W6_HEL|W6_HEL_I|||CYRF6936|
[XERALL](Protocols_Details.md#XERALL---91)|91|Tank||||||||NRF24L01|XN297
[XK](Protocols_Details.md#XK---62)|62|X450|X420|||||||NRF24L01|XN297 [XK](Protocols_Details.md#XK---62)|62|X450|X420|||||||NRF24L01|XN297
[YD717](Protocols_Details.md#YD717---8)|8|YD717|SKYWLKR|SYMAX4|XINXUN|NIHUI||||NRF24L01| [YD717](Protocols_Details.md#YD717---8)|8|YD717|SKYWLKR|SYMAX4|XINXUN|NIHUI||||NRF24L01|
[ZSX](Protocols_Details.md#ZSX---52)|52|280||||||||NRF24L01|XN297 [ZSX](Protocols_Details.md#ZSX---52)|52|280||||||||NRF24L01|XN297
@@ -228,17 +229,12 @@ RX output will match the Flysky standard AETR independently of the input configu
### Sub_protocol PPM_IBUS - *1* ### Sub_protocol PPM_IBUS - *1*
### Sub_protocol PWM_SBUS - *2* ### Sub_protocol PWM_SBUS - *2*
### Sub_protocol PPM_SBUS - *3* ### Sub_protocol PPM_SBUS - *3*
As stated above.
### Sub_protocol PWM_IBUS16 - *4* ### Sub_protocol PWM_IBUS16 - *4*
3 additional channels. Need recent or updated RXs.
CH15|CH16|CH17
---|---|---
CH15|CH16|LQI
LQI: Link Quality Indicator
### Sub_protocol PPM_IBUS16 - *5* ### Sub_protocol PPM_IBUS16 - *5*
### Sub_protocol PWM_SBUS16 - *6*
### Sub_protocol PPM_SBUS16 - *7*
3 additional channels. Need recent or updated RXs. 3 additional channels. Need recent or updated RXs.
@@ -400,18 +396,18 @@ A|E|T|R|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12
RX output will match the Devo standard EATR independently of the input configuration AETR, RETA... unless on OpenTX 2.3.3+ you use the "Disable channel mapping" feature on the GUI. RX output will match the Devo standard EATR independently of the input configuration AETR, RETA... unless on OpenTX 2.3.3+ you use the "Disable channel mapping" feature on the GUI.
Full telemetry is available if the RX supports it: TX_RSSI, A1 (set the ratio to 12.7) and A2 (set the ratio to 12.7), VFAS, RPM, temperature 1&2, GPS position/speed/altitude/time. Full telemetry is available if the RX supports it: TX_RSSI, A1 (set the ratio to 12.7) and A2 (set the ratio to 12.7), VFAS, RPM, temperature 1&2, GPS position/speed/altitude/time. The GPS coordinates come in two flavors which can't be distinguished programmatically, to switch from one to the other add 2 to the Option/FixedID setting value (0->2, 1->3).
Bind procedure using serial: Bind procedure using serial:
- With the TX off, put the binding plug in and power on the RX (RX LED slow blink), then power it down and remove the binding plug. Receiver should now be in autobind mode. - With the TX off, put the binding plug in and power on the RX (RX LED slow blink), then power it down and remove the binding plug. Receiver should now be in autobind mode.
- Turn on the TX, set protocol = Devo with option=0, turn off the TX (TX is now in autobind mode). - Turn on the TX, set protocol = Devo with Option/FixedID=0, turn off the TX (TX is now in autobind mode).
- Turn on RX (RX LED fast blink). - Turn on RX (RX LED fast blink).
- Turn on TX (RX LED solid, TX LED fast blink). - Turn on TX (RX LED solid, TX LED fast blink).
- Wait for bind on the TX to complete (TX LED solid). - Wait for bind on the TX to complete (TX LED solid).
- Make sure to set a uniq RX_Num value for model match. - Make sure to set a uniq RX_Num value for model match.
- Change option to 1 to use the global ID. - Change Option/FixedID to 1 to use the global ID.
- Do not touch option/RX_Num anymore. - Do not touch Option/FixedID and RX_Num anymore.
- Note: it might be limited to only the RX705 but to get telemetry, the opion fields has to be set back to 0 at then end of the procedure... - Note: it might be limited to only the RX705 but to get telemetry, the Option/FixedID field has to be set back to 0 at then end of the procedure...
Bind procedure using PPM: Bind procedure using PPM:
- With the TX off, put the binding plug in and power on the RX (RX LED slow blink), then power it down and remove the binding plug. Receiver should now be in autobind mode. - With the TX off, put the binding plug in and power on the RX (RX LED slow blink), then power it down and remove the binding plug. Receiver should now be in autobind mode.
@@ -570,6 +566,8 @@ Once your **setup** is **complete** and before enabling the internal module, you
## E010R5 - *81* ## E010R5 - *81*
Models: E010 R5 red boards, JJRC H36, H36F and H36S Models: E010 R5 red boards, JJRC H36, H36F and H36S
Not supported by Atmega328p modules.
Autobind protocol. Autobind protocol.
**Only 5 IDs are available**. Use RX num to cycle through them. More IDs can be added if you send me your "unused" original TX. **Only 5 IDs are available**. Use RX num to cycle through them. More IDs can be added if you send me your "unused" original TX.
@@ -578,9 +576,30 @@ CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10
---|---|---|---|---|---|---|---|---|--- ---|---|---|---|---|---|---|---|---|---
A|E|T|R|FLIP|LED|CALIB|HEADLESS|RTH|GLIDE A|E|T|R|FLIP|LED|CALIB|HEADLESS|RTH|GLIDE
## E01X - *45*
Autobind protocol
Not supported by Atmega328p modules.
### Sub_protocol E012 - *0*
Models: Eachine E012
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9
---|---|---|---|---|---|---|---|---
A|E|T|R||FLIP||HEADLESS|RTH
### Sub_protocol E015 - *1*
Models: Eachine E015
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9
---|---|---|---|---|---|---|---|---
A|E|T|R|ARM|FLIP|LED|HEADLESS|RTH
## E129 - *83* ## E129 - *83*
Models: Eachine E129/E130 and Twister Ninja 250 Models: Eachine E129/E130 and Twister Ninja 250
Not supported by Atmega328p modules.
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9 CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9
---|---|---|---|---|---|---|---|--- ---|---|---|---|---|---|---|---|---
A|E|T|R|Take off/Land|Emergency|Trim A|Trim E|Trim R A|E|T|R|Take off/Land|Emergency|Trim A|Trim E|Trim R
@@ -1004,12 +1023,17 @@ First generation of GD models, ZC-Z50
New generation of GD models New generation of GD models
## KF606 - *49* ## KF606 - *49*
Model: KF606
CH1|CH2|CH3|CH4|CH5 CH1|CH2|CH3|CH4|CH5
---|---|---|---|--- ---|---|---|---|---
A||T||TRIM A||T||TRIM
### Sub_protocol KF606 - *0*
Model: KF606
### Sub_protocol MIG320 - *1*
Model: Zhiyang MIG-320
## MJXQ - *18* ## MJXQ - *18*
Autobind protocol Autobind protocol
@@ -1091,14 +1115,20 @@ CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9
A|E|T|R|FLIP||||HEADLESS A|E|T|R|FLIP||||HEADLESS
### Sub_protocol A180 - *5* ### Sub_protocol A180 - *5*
Model: XK A180 Model: XK A180, F949S
CH1|CH2|CH3|CH4|CH5 A180:
---|---|---|---|--- CH1|CH2|CH3|CH4|CH5|CH6
A|E|T|R|3D6G ---|---|---|---|---|---
A|E|T|R|3D6G|RATE
F949S:
CH1|CH2|CH3|CH4|CH5|CH6|CH7
---|---|---|---|---|---|---
A|E|T|R|RATE|RXLED|3D6G
### Sub_protocol DRAGON - *6* ### Sub_protocol DRAGON - *6*
Model: Eachine Mini Wing Dragon Model: Eachine Mini Wing Dragon, Eachine Mini Cessna
Telemetry is supported: A1 = battery voltage with a Ratio of 25.5, A2=battery low flag (0=off,>0=on) and RSSI = dummy value of 100 Telemetry is supported: A1 = battery voltage with a Ratio of 25.5, A2=battery low flag (0=off,>0=on) and RSSI = dummy value of 100
@@ -1108,6 +1138,13 @@ A|E|T|R|MODE|RTH
MODE: -100%=Beginner, 0%=Intermediate, +100%=Advanced MODE: -100%=Beginner, 0%=Intermediate, +100%=Advanced
### Sub_protocol F949G - *7*
Model: F949G
CH1|CH2|CH3|CH4|CH5|CH6
---|---|---|---|---|---
A|E|T|R|6G3D|Light
## OMP - *77* ## OMP - *77*
Model: OMPHOBBY M1 & M2 Helis, T720 RC Glider Model: OMPHOBBY M1 & M2 Helis, T720 RC Glider
@@ -1265,15 +1302,21 @@ MODE: -100% level, +100% acro
## V911S - *46* ## V911S - *46*
CH1|CH2|CH3|CH4|CH5 CH1|CH2|CH3|CH4|CH5|CH6
---|---|---|---|--- ---|---|---|---|---|---
A|E|T|R|CALIB A|E|T|R|CALIB|RATE
Rate: -100% High, +100% Low
### Sub_protocol V911S - *0* ### Sub_protocol V911S - *0*
Models: WLtoys V911S, XK A110 Models: WLtoys V911S, XK A110
### Sub_protocol E119 - *1* ### Sub_protocol E119 - *1*
Models: Eachine E119 Models: Eachine E119, JJRC W01-J3, XK A220 P-40, newer XK A800
CH1|CH2|CH3|CH4|CH5|CH6|CH7
---|---|---|---|---|---|---
A|E|T|R|CALIB|RATE|6G_3D
## XK - *62* ## XK - *62*
@@ -1503,27 +1546,6 @@ CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9
---|---|---|---|---|---|---|---|--- ---|---|---|---|---|---|---|---|---
A|E|T|R|STOP|FLIP|-|HEADLESS|RTH A|E|T|R|STOP|FLIP|-|HEADLESS|RTH
## E01X - *45*
Autobind protocol
### Sub_protocol E012 - *0*
Models: Eachine E012
This protocol has been reported to not work properly due to the emulation of the HS6200 RF component using the NRF24L01. The option value is used to adjust the timing, try every values between -127 and +127. If it works please report which value you've used.
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9
---|---|---|---|---|---|---|---|---
A|E|T|R||FLIP||HEADLESS|RTH
### Sub_protocol E015 - *1*
Models: Eachine E015
This protocol has been reported to not work properly due to the emulation of the HS6200 RF component using the NRF24L01. The option value is used to adjust the timing, try every values between -127 and +127. If it works please report which value you've used.
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9
---|---|---|---|---|---|---|---|---
A|E|T|R|ARM|FLIP|LED|HEADLESS|RTH
## ESKY - *16* ## ESKY - *16*
CH1|CH2|CH3|CH4|CH5|CH6 CH1|CH2|CH3|CH4|CH5|CH6
@@ -1643,7 +1665,7 @@ A|E|T|R|DR|THOLD|IDLEUP|GYRO|Ttrim|Atrim|Etrim
Dual Rate: +100%=full range, Throttle Hold: +100%=hold, Idle Up: +100%=3D, GYRO: -100%=6G, +100%=3G Dual Rate: +100%=full range, Throttle Hold: +100%=hold, Idle Up: +100%=3D, GYRO: -100%=6G, +100%=3G
### Sub_protocol WLTOYS - *0* ### Sub_protocol WLTOYS - *0*
Models: V966/V977/F959S/... Models: V966/V977/F959S/A160 J3/...
### Sub_protocol FEILUN - *1* ### Sub_protocol FEILUN - *1*
@@ -1767,7 +1789,7 @@ Model: PROPEL 74-Z Speeder Bike
Autobind protocol Autobind protocol
Telemetry: RSSI is equal to TX_LQI which indicates how well the TX receives the RX (0-100%). A1 voltage should indicate the numbers of life remaining (not tested). A2 is giving the model status using a bit mask: 0x80=flying, 0x08=taking off, 0x04=landing, 0x00=landed/crashed Telemetry: RSSI is equal to TX_LQI which indicates how well the TX receives the RX (0-100%). A1 (with a ratio of 25.5) voltage should indicate the numbers of life remaining 0.2->0.1->0.0(not tested). A2 (with a ratio of 25.5) is giving the model status: 12.8=flying, 0.8=taking off, 0.4=landing, 0=landed/crashed
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14 CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14
---|---|---|---|---|---|---|---|---|----|----|----|----|---- ---|---|---|---|---|---|---|---|---|----|----|----|----|----
@@ -1882,8 +1904,11 @@ A|E|T|R|FLIP|LIGHT
## V761 - *48* ## V761 - *48*
Gyro: -100%=Beginer mode (Gyro on, yaw and pitch rate limited), 0%=Mid Mode ( Gyro on no rate limits), +100%=Mode Expert Gyro off Gyro: -100%=Beginer mode (Gyro on, yaw and pitch rate limited), 0%=Mid Mode ( Gyro on no rate limits), +100%=Mode Expert Gyro off
Calib: momentary switch, calib will happen one the channel goes from -100% to +100% Calib: momentary switch, calib will happen one the channel goes from -100% to +100%
Flip: momentary switch: hold flip(+100%), indicate flip direction with Ele or Ail, release flip(-100%) Flip: momentary switch: hold flip(+100%), indicate flip direction with Ele or Ail, release flip(-100%)
RTN_ACT and RTN: -100% disable, +100% enable RTN_ACT and RTN: -100% disable, +100% enable
### Sub_protocol 3CH - *0* ### Sub_protocol 3CH - *0*
@@ -1900,6 +1925,29 @@ CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9
---|---|---|---|---|---|---|---|--- ---|---|---|---|---|---|---|---|---
A|E|T|R|GYRO|CALIB|FLIP|RTN_ACT|RTN A|E|T|R|GYRO|CALIB|FLIP|RTN_ACT|RTN
## XERALL - *91*
Model: Xerall TankCopter
To bind/link the model faster put the throttle low before powering up the model.
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13
---|---|---|---|---|---|---|---|---|---|---|---|---
A|E|T|R|Fly/Tank|Takeoff/Land/Emerg|Rate|HeadLess|Photo|Video|TrimR|TrimE|TrimA
Fly/Tank: -100%=Fly, +100%=Tank
Takeoff/Land/Emerg: momentary switch -100%->+100%, same switch for all 3 functions. For Takeoff throttle must be centered before actionning the momentary switch. For Emergency stop hold the momentary switch for a few sec.
Unlock the motors is achieved like on the original radio by putting sticks in the bottom corners (position depends on your mode 1,2,3,4) and throttle has to be raised to center before recentering the sticks for the motors to keep spinning. Takeoff happens as soon as the throttle goes above center.
Rate: -100%=Low, +100%=High
HeadLess: -100%=Off, +100%=On
Photo: momentary switch -100%->+100% (short press on the original remote)
Video: -100%=Off, +100%=On (long press on the original remote)
## YD717 - *8* ## YD717 - *8*
Autobind protocol Autobind protocol

View File

@@ -98,6 +98,8 @@ buildReleaseFiles(){
build_release_stm32f1_serial_debug; build_release_stm32f1_serial_debug;
elif [[ "$BOARD" == "multi4in1:STM32F1:multi5in1t18int" ]]; then elif [[ "$BOARD" == "multi4in1:STM32F1:multi5in1t18int" ]]; then
build_release_stm32f1_t18int; build_release_stm32f1_t18int;
elif [[ "$BOARD" == "multi4in1:STM32F1:multistm32f103c8:debug_option=none" ]]; then
build_release_stm32f1_64k;
else else
printf "No release files for this board."; printf "No release files for this board.";
fi fi

View File

@@ -3,27 +3,27 @@
source ./buildroot/bin/buildFunctions; source ./buildroot/bin/buildFunctions;
exitcode=0; exitcode=0;
printf "\e[33;1mBuilding multi-avr-usbasp-aetr-A7105-inv-v$MULTI_VERSION.bin\e[0m\n"; printf "\e[33;1mBuilding mm-avr-usbasp-aetr-A7105-inv-v$MULTI_VERSION.bin\e[0m\n";
opt_disable CHECK_FOR_BOOTLOADER; opt_disable CHECK_FOR_BOOTLOADER;
opt_disable $ALL_PROTOCOLS; opt_disable $ALL_PROTOCOLS;
opt_enable $A7105_PROTOCOLS; opt_enable $A7105_PROTOCOLS;
buildMulti; buildMulti;
exitcode=$((exitcode+$?)); exitcode=$((exitcode+$?));
mv build/Multiprotocol.ino.bin ./binaries/multi-avr-usbasp-aetr-A7105-inv-v$MULTI_VERSION.bin; mv build/Multiprotocol.ino.bin ./binaries/mm-avr-usbasp-aetr-A7105-inv-v$MULTI_VERSION.bin;
printf "\e[33;1mBuilding multi-avr-usbasp-aetr-CC2500-inv-v$MULTI_VERSION.bin\e[0m\n"; printf "\e[33;1mBuilding mm-avr-usbasp-aetr-CC2500-inv-v$MULTI_VERSION.bin\e[0m\n";
opt_disable $ALL_PROTOCOLS; opt_disable $ALL_PROTOCOLS;
opt_enable $CC2500_PROTOCOLS; opt_enable $CC2500_PROTOCOLS;
opt_disable HITEC_CC2500_INO REDPINE_CC2500_INO OMP_CC2500_INO SKYARTEC_CC2500_INO SCANNER_CC2500_INO FRSKYL_CC2500_INO; opt_disable HITEC_CC2500_INO REDPINE_CC2500_INO OMP_CC2500_INO SKYARTEC_CC2500_INO SCANNER_CC2500_INO FRSKYL_CC2500_INO;
buildMulti; buildMulti;
exitcode=$((exitcode+$?)); exitcode=$((exitcode+$?));
mv build/Multiprotocol.ino.bin ./binaries/multi-avr-usbasp-aetr-CC2500-inv-v$MULTI_VERSION.bin; mv build/Multiprotocol.ino.bin ./binaries/mm-avr-usbasp-aetr-CC2500-inv-v$MULTI_VERSION.bin;
printf "\e[33;1mBuilding multi-avr-usbasp-aetr-CYRF6936-inv-v$MULTI_VERSION.bin\e[0m\n"; printf "\e[33;1mBuilding mm-avr-usbasp-aetr-CYRF6936-inv-v$MULTI_VERSION.bin\e[0m\n";
opt_disable $ALL_PROTOCOLS; opt_disable $ALL_PROTOCOLS;
opt_enable $CYRF6936_PROTOCOLS; opt_enable $CYRF6936_PROTOCOLS;
buildMulti; buildMulti;
exitcode=$((exitcode+$?)); exitcode=$((exitcode+$?));
mv build/Multiprotocol.ino.bin ./binaries/multi-avr-usbasp-aetr-CYRF6936-inv-v$MULTI_VERSION.bin; mv build/Multiprotocol.ino.bin ./binaries/mm-avr-usbasp-aetr-CYRF6936-inv-v$MULTI_VERSION.bin;
exit $exitcode; exit $exitcode;

View File

@@ -3,27 +3,27 @@
source ./buildroot/bin/buildFunctions; source ./buildroot/bin/buildFunctions;
exitcode=0; exitcode=0;
printf "\e[33;1mBuilding multi-avr-txflash-aetr-A7105-inv-v$MULTI_VERSION.bin\e[0m\n"; printf "\e[33;1mBuilding mm-avr-txflash-aetr-A7105-inv-v$MULTI_VERSION.bin\e[0m\n";
opt_enable CHECK_FOR_BOOTLOADER; opt_enable CHECK_FOR_BOOTLOADER;
opt_disable $ALL_PROTOCOLS; opt_disable $ALL_PROTOCOLS;
opt_enable $A7105_PROTOCOLS; opt_enable $A7105_PROTOCOLS;
buildMulti; buildMulti;
exitcode=$((exitcode+$?)); exitcode=$((exitcode+$?));
mv build/Multiprotocol.ino.bin ./binaries/multi-avr-txflash-aetr-A7105-inv-v$MULTI_VERSION.bin; mv build/Multiprotocol.ino.bin ./binaries/mm-avr-txflash-aetr-A7105-inv-v$MULTI_VERSION.bin;
printf "\e[33;1mBuilding multi-avr-txflash-aetr-CC2500-inv-v$MULTI_VERSION.bin\e[0m\n"; printf "\e[33;1mBuilding mm-avr-txflash-aetr-CC2500-inv-v$MULTI_VERSION.bin\e[0m\n";
opt_disable $ALL_PROTOCOLS; opt_disable $ALL_PROTOCOLS;
opt_enable $CC2500_PROTOCOLS; opt_enable $CC2500_PROTOCOLS;
opt_disable HITEC_CC2500_INO REDPINE_CC2500_INO OMP_CC2500_INO SKYARTEC_CC2500_INO SCANNER_CC2500_INO FRSKYL_CC2500_INO; opt_disable HITEC_CC2500_INO REDPINE_CC2500_INO OMP_CC2500_INO SKYARTEC_CC2500_INO SCANNER_CC2500_INO FRSKYL_CC2500_INO;
buildMulti; buildMulti;
exitcode=$((exitcode+$?)); exitcode=$((exitcode+$?));
mv build/Multiprotocol.ino.bin ./binaries/multi-avr-txflash-aetr-CC2500-inv-v$MULTI_VERSION.bin; mv build/Multiprotocol.ino.bin ./binaries/mm-avr-txflash-aetr-CC2500-inv-v$MULTI_VERSION.bin;
printf "\e[33;1mBuilding multi-avr-txflash-aetr-CYRF6936-inv-v$MULTI_VERSION.bin\e[0m\n"; printf "\e[33;1mBuilding mm-avr-txflash-aetr-CYRF6936-inv-v$MULTI_VERSION.bin\e[0m\n";
opt_disable $ALL_PROTOCOLS; opt_disable $ALL_PROTOCOLS;
opt_enable $CYRF6936_PROTOCOLS; opt_enable $CYRF6936_PROTOCOLS;
buildMulti; buildMulti;
exitcode=$((exitcode+$?)); exitcode=$((exitcode+$?));
mv build/Multiprotocol.ino.bin ./binaries/multi-avr-txflash-aetr-CYRF6936-inv-v$MULTI_VERSION.bin; mv build/Multiprotocol.ino.bin ./binaries/mm-avr-txflash-aetr-CYRF6936-inv-v$MULTI_VERSION.bin;
exit $exitcode; exit $exitcode;

View File

@@ -3,18 +3,18 @@
source ./buildroot/bin/buildFunctions; source ./buildroot/bin/buildFunctions;
exitcode=0; exitcode=0;
printf "\e[33;1mBuilding multi-orangerx-aetr-green-inv-v$MULTI_VERSION.bin\e[0m\n"; printf "\e[33;1mBuilding mm-orangerx-aetr-green-inv-v$MULTI_VERSION.bin\e[0m\n";
opt_enable $ALL_PROTOCOLS; opt_enable $ALL_PROTOCOLS;
opt_disable ORANGE_TX_BLUE; opt_disable ORANGE_TX_BLUE;
buildMulti; buildMulti;
exitcode=$((exitcode+$?)); exitcode=$((exitcode+$?));
mv build/Multiprotocol.ino.bin ./binaries/multi-orangerx-aetr-green-inv-v$MULTI_VERSION.bin; mv build/Multiprotocol.ino.bin ./binaries/mm-orangerx-aetr-green-inv-v$MULTI_VERSION.bin;
printf "\e[33;1mBuilding multi-orangerx-aetr-blue-inv-v$MULTI_VERSION.bin\e[0m\n"; printf "\e[33;1mBuilding mm-orangerx-aetr-blue-inv-v$MULTI_VERSION.bin\e[0m\n";
opt_enable ORANGE_TX_BLUE; opt_enable ORANGE_TX_BLUE;
buildMulti; buildMulti;
exitcode=$((exitcode+$?)); exitcode=$((exitcode+$?));
mv build/Multiprotocol.ino.bin ./binaries/multi-orangerx-aetr-blue-inv-v$MULTI_VERSION.bin; mv build/Multiprotocol.ino.bin ./binaries/mm-orangerx-aetr-blue-inv-v$MULTI_VERSION.bin;
printf "\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; cp Multiprotocol/Multi.txt ./binaries/Multi.txt;

View File

@@ -0,0 +1,31 @@
#!/usr/bin/env bash
source ./buildroot/bin/buildFunctions;
exitcode=0;
# CC2500-only 64Kb builds
printf "\e[33;1mBuilding mm-stm-cc2500-64-aetr-v$MULTI_VERSION.bin\e[0m\n";
opt_enable $ALL_PROTOCOLS;
opt_disable IKEAANSLUTA_CC2500_INO;
opt_disable ENABLE_PPM;
opt_disable A7105_INSTALLED;
opt_disable CYRF6936_INSTALLED;
opt_disable NRF24L01_INSTALLED;
opt_disable INVERT_TELEMETRY;
buildMulti;
exitcode=$((exitcode+$?));
mv build/Multiprotocol.ino.bin ./binaries/mm-stm-cc2500-64-aetr-v$MULTI_VERSION.bin;
printf "\e[33;1mBuilding mm-stm-cc2500-64-taer-v$MULTI_VERSION.bin\e[0m\n";
opt_replace AETR TAER;
buildMulti;
exitcode=$((exitcode+$?));
mv build/Multiprotocol.ino.bin ./binaries/mm-stm-cc2500-64-taer-v$MULTI_VERSION.bin;
printf "\e[33;1mBuilding mm-stm-cc2500-64-reta-v$MULTI_VERSION.bin\e[0m\n";
opt_replace TAER RETA;
buildMulti;
exitcode=$((exitcode+$?));
mv build/Multiprotocol.ino.bin ./binaries/mm-stm-cc2500-64-reta-v$MULTI_VERSION.bin;
exit $exitcode;

View File

@@ -3,11 +3,11 @@
source ./buildroot/bin/buildFunctions; source ./buildroot/bin/buildFunctions;
exitcode=0; exitcode=0;
printf "\e[33;1mBuilding multi-stm-xn297dump-usbdebug-v$MULTI_VERSION.bin\e[0m\n"; printf "\e[33;1mBuilding mm-stm-xn297dump-usbdebug-v$MULTI_VERSION.bin\e[0m\n";
opt_disable $ALL_PROTOCOLS; opt_disable $ALL_PROTOCOLS;
opt_add XN297DUMP_NRF24L01_INO; opt_add XN297DUMP_NRF24L01_INO;
buildMulti; buildMulti;
exitcode=$((exitcode+$?)); exitcode=$((exitcode+$?));
mv build/Multiprotocol.ino.bin ./binaries/multi-stm-xn297dump-usbdebug-v$MULTI_VERSION.bin; mv build/Multiprotocol.ino.bin ./binaries/mm-stm-xn297dump-usbdebug-v$MULTI_VERSION.bin;
exit $exitcode; exit $exitcode;

View File

@@ -3,69 +3,75 @@
source ./buildroot/bin/buildFunctions; source ./buildroot/bin/buildFunctions;
exitcode=0; exitcode=0;
# Builds for the DIY 5-in-1 module exceed the 120KB working capacity of the STM32F103CB
# To work around this we have to disable some protocols in the builds for this module
#DIY_5IN1_DISABLED="MOULDKG_NRF24L01_INO";
# Generic 4-in-1 builds # Generic 4-in-1 builds
printf "\e[33;1mBuilding multi-stm-serial-aetr-v$MULTI_VERSION.bin\e[0m\n"; printf "\e[33;1mBuilding mm-stm-serial-aetr-v$MULTI_VERSION.bin\e[0m\n";
opt_disable ENABLE_PPM; opt_disable ENABLE_PPM;
buildMulti; buildMulti;
exitcode=$((exitcode+$?)); exitcode=$((exitcode+$?));
mv build/Multiprotocol.ino.bin ./binaries/multi-stm-serial-aetr-v$MULTI_VERSION.bin; mv build/Multiprotocol.ino.bin ./binaries/mm-stm-serial-aetr-v$MULTI_VERSION.bin;
printf "\e[33;1mBuilding multi-stm-serial-taer-v$MULTI_VERSION.bin\e[0m\n"; printf "\e[33;1mBuilding mm-stm-serial-taer-v$MULTI_VERSION.bin\e[0m\n";
opt_replace AETR TAER; opt_replace AETR TAER;
buildMulti; buildMulti;
exitcode=$((exitcode+$?)); exitcode=$((exitcode+$?));
mv build/Multiprotocol.ino.bin ./binaries/multi-stm-serial-taer-v$MULTI_VERSION.bin; mv build/Multiprotocol.ino.bin ./binaries/mm-stm-serial-taer-v$MULTI_VERSION.bin;
printf "\e[33;1mBuilding multi-stm-serial-reta-v$MULTI_VERSION.bin\e[0m\n"; printf "\e[33;1mBuilding mm-stm-serial-reta-v$MULTI_VERSION.bin\e[0m\n";
opt_replace TAER RETA; opt_replace TAER RETA;
buildMulti; buildMulti;
exitcode=$((exitcode+$?)); exitcode=$((exitcode+$?));
mv build/Multiprotocol.ino.bin ./binaries/multi-stm-serial-reta-v$MULTI_VERSION.bin; mv build/Multiprotocol.ino.bin ./binaries/mm-stm-serial-reta-v$MULTI_VERSION.bin;
# DIY 5-in-1 builds # DIY 5-in-1 builds
printf "\e[33;1mBuilding multi-stm-5in1-aetr-v$MULTI_VERSION.bin\e[0m\n"; printf "\e[33;1mBuilding mm-stm-5in1-aetr-v$MULTI_VERSION.bin\e[0m\n";
opt_replace RETA AETR; opt_replace RETA AETR;
#opt_disable $DIY_5IN1_DISABLED;
opt_enable SX1276_INSTALLED; opt_enable SX1276_INSTALLED;
buildMulti; buildMulti;
exitcode=$((exitcode+$?)); exitcode=$((exitcode+$?));
mv build/Multiprotocol.ino.bin ./binaries/multi-stm-5in1-aetr-v$MULTI_VERSION.bin; mv build/Multiprotocol.ino.bin ./binaries/mm-stm-5in1-aetr-v$MULTI_VERSION.bin;
printf "\e[33;1mBuilding multi-stm-5in1-taer-v$MULTI_VERSION.bin\e[0m\n"; printf "\e[33;1mBuilding mm-stm-5in1-taer-v$MULTI_VERSION.bin\e[0m\n";
opt_replace AETR TAER; opt_replace AETR TAER;
buildMulti; buildMulti;
exitcode=$((exitcode+$?)); exitcode=$((exitcode+$?));
mv build/Multiprotocol.ino.bin ./binaries/multi-stm-5in1-taer-v$MULTI_VERSION.bin; mv build/Multiprotocol.ino.bin ./binaries/mm-stm-5in1-taer-v$MULTI_VERSION.bin;
printf "\e[33;1mBuilding multi-stm-5in1-reta-v$MULTI_VERSION.bin\e[0m\n"; printf "\e[33;1mBuilding mm-stm-5in1-reta-v$MULTI_VERSION.bin\e[0m\n";
opt_replace TAER RETA; opt_replace TAER RETA;
buildMulti; buildMulti;
exitcode=$((exitcode+$?)); exitcode=$((exitcode+$?));
mv build/Multiprotocol.ino.bin ./binaries/multi-stm-5in1-reta-v$MULTI_VERSION.bin; mv build/Multiprotocol.ino.bin ./binaries/mm-stm-5in1-reta-v$MULTI_VERSION.bin;
# T-Lite 5-in-1 builds # T-Lite 5-in-1 builds
printf "\e[33;1mBuilding multi-tlite5in1-aetr-v$MULTI_VERSION.bin\e[0m\n"; printf "\e[33;1mBuilding mm-tlite5in1-aetr-v$MULTI_VERSION.bin\e[0m\n";
opt_replace RETA AETR; opt_replace RETA AETR;
opt_disable INVERT_TELEMETRY; opt_disable INVERT_TELEMETRY;
opt_disable SX1276_INSTALLED; opt_disable SX1276_INSTALLED;
#opt_enable $DIY_5IN1_DISABLED;
opt_enable "MULTI_5IN1_INTERNAL JP_TLite" opt_enable "MULTI_5IN1_INTERNAL JP_TLite"
buildMulti; buildMulti;
exitcode=$((exitcode+$?)); exitcode=$((exitcode+$?));
mv build/Multiprotocol.ino.bin ./binaries/multi-tlite5in1-aetr-v$MULTI_VERSION.bin; mv build/Multiprotocol.ino.bin ./binaries/mm-tlite5in1-aetr-v$MULTI_VERSION.bin;
printf "\e[33;1mBuilding multi-tlite5in1-taer-v$MULTI_VERSION.bin\e[0m\n"; printf "\e[33;1mBuilding mm-tlite5in1-taer-v$MULTI_VERSION.bin\e[0m\n";
opt_replace AETR TAER; opt_replace AETR TAER;
buildMulti; buildMulti;
exitcode=$((exitcode+$?)); exitcode=$((exitcode+$?));
mv build/Multiprotocol.ino.bin ./binaries/multi-tlite5in1-taer-v$MULTI_VERSION.bin; mv build/Multiprotocol.ino.bin ./binaries/mm-tlite5in1-taer-v$MULTI_VERSION.bin;
printf "\e[33;1mBuilding multi-tlite5in1-reta-v$MULTI_VERSION.bin\e[0m\n"; printf "\e[33;1mBuilding mm-tlite5in1-reta-v$MULTI_VERSION.bin\e[0m\n";
opt_replace TAER RETA; opt_replace TAER RETA;
buildMulti; buildMulti;
exitcode=$((exitcode+$?)); exitcode=$((exitcode+$?));
mv build/Multiprotocol.ino.bin ./binaries/multi-tlite5in1-reta-v$MULTI_VERSION.bin; mv build/Multiprotocol.ino.bin ./binaries/mm-tlite5in1-reta-v$MULTI_VERSION.bin;
# CC2500-only builds # CC2500-only builds
printf "\e[33;1mBuilding multi-stm-cc2500-aetr-v$MULTI_VERSION.bin\e[0m\n"; printf "\e[33;1mBuilding mm-stm-cc2500-aetr-v$MULTI_VERSION.bin\e[0m\n";
opt_replace RETA AETR; opt_replace RETA AETR;
opt_disable "MULTI_5IN1_INTERNAL JP_TLite" opt_disable "MULTI_5IN1_INTERNAL JP_TLite"
opt_disable A7105_INSTALLED; opt_disable A7105_INSTALLED;
@@ -74,22 +80,22 @@ opt_disable NRF24L01_INSTALLED;
opt_disable INVERT_TELEMETRY; opt_disable INVERT_TELEMETRY;
buildMulti; buildMulti;
exitcode=$((exitcode+$?)); exitcode=$((exitcode+$?));
mv build/Multiprotocol.ino.bin ./binaries/multi-stm-cc2500-aetr-v$MULTI_VERSION.bin; mv build/Multiprotocol.ino.bin ./binaries/mm-stm-cc2500-aetr-v$MULTI_VERSION.bin;
printf "\e[33;1mBuilding multi-stm-cc2500-taer-v$MULTI_VERSION.bin\e[0m\n"; printf "\e[33;1mBuilding mm-stm-cc2500-taer-v$MULTI_VERSION.bin\e[0m\n";
opt_replace AETR TAER; opt_replace AETR TAER;
buildMulti; buildMulti;
exitcode=$((exitcode+$?)); exitcode=$((exitcode+$?));
mv build/Multiprotocol.ino.bin ./binaries/multi-stm-cc2500-taer-v$MULTI_VERSION.bin; mv build/Multiprotocol.ino.bin ./binaries/mm-stm-cc2500-taer-v$MULTI_VERSION.bin;
printf "\e[33;1mBuilding multi-stm-cc2500-reta-v$MULTI_VERSION.bin\e[0m\n"; printf "\e[33;1mBuilding mm-stm-cc2500-reta-v$MULTI_VERSION.bin\e[0m\n";
opt_replace TAER RETA; opt_replace TAER RETA;
buildMulti; buildMulti;
exitcode=$((exitcode+$?)); exitcode=$((exitcode+$?));
mv build/Multiprotocol.ino.bin ./binaries/multi-stm-cc2500-reta-v$MULTI_VERSION.bin; mv build/Multiprotocol.ino.bin ./binaries/mm-stm-cc2500-reta-v$MULTI_VERSION.bin;
# 4-in-1 PPM builds # 4-in-1 PPM builds
printf "\e[33;1mBuilding multi-stm-ppm-aetr-v$MULTI_VERSION.bin\e[0m\n"; printf "\e[33;1mBuilding mm-stm-ppm-aetr-v$MULTI_VERSION.bin\e[0m\n";
opt_enable A7105_INSTALLED; opt_enable A7105_INSTALLED;
opt_enable CYRF6936_INSTALLED; opt_enable CYRF6936_INSTALLED;
opt_enable NRF24L01_INSTALLED; opt_enable NRF24L01_INSTALLED;
@@ -101,18 +107,18 @@ opt_disable MULTI_TELEMETRY;
opt_set NBR_BANKS 5; opt_set NBR_BANKS 5;
buildMulti; buildMulti;
exitcode=$((exitcode+$?)); exitcode=$((exitcode+$?));
mv build/Multiprotocol.ino.bin ./binaries/multi-stm-ppm-aetr-v$MULTI_VERSION.bin; mv build/Multiprotocol.ino.bin ./binaries/mm-stm-ppm-aetr-v$MULTI_VERSION.bin;
printf "\e[33;1mBuilding multi-stm-ppm-taer-v$MULTI_VERSION.bin\e[0m\n"; printf "\e[33;1mBuilding mm-stm-ppm-taer-v$MULTI_VERSION.bin\e[0m\n";
opt_replace AETR TAER; opt_replace AETR TAER;
buildMulti; buildMulti;
exitcode=$((exitcode+$?)); exitcode=$((exitcode+$?));
mv build/Multiprotocol.ino.bin ./binaries/multi-stm-ppm-taer-v$MULTI_VERSION.bin; mv build/Multiprotocol.ino.bin ./binaries/mm-stm-ppm-taer-v$MULTI_VERSION.bin;
printf "\e[33;1mBuilding multi-stm-ppm-reta-v$MULTI_VERSION.bin\e[0m\n"; printf "\e[33;1mBuilding mm-stm-ppm-reta-v$MULTI_VERSION.bin\e[0m\n";
opt_replace TAER RETA; opt_replace TAER RETA;
buildMulti; buildMulti;
exitcode=$((exitcode+$?)); exitcode=$((exitcode+$?));
mv build/Multiprotocol.ino.bin ./binaries/multi-stm-ppm-reta-v$MULTI_VERSION.bin; mv build/Multiprotocol.ino.bin ./binaries/mm-stm-ppm-reta-v$MULTI_VERSION.bin;
exit $exitcode; exit $exitcode;

View File

@@ -3,11 +3,11 @@
source ./buildroot/bin/buildFunctions; source ./buildroot/bin/buildFunctions;
exitcode=0; exitcode=0;
printf "\e[33;1mBuilding multi-stm-xn297dump-ftdidebug-v$MULTI_VERSION.bin\e[0m\n"; printf "\e[33;1mBuilding mm-stm-xn297dump-ftdidebug-v$MULTI_VERSION.bin\e[0m\n";
opt_disable $ALL_PROTOCOLS; opt_disable $ALL_PROTOCOLS;
opt_add XN297DUMP_NRF24L01_INO; opt_add XN297DUMP_NRF24L01_INO;
buildMulti; buildMulti;
exitcode=$((exitcode+$?)); exitcode=$((exitcode+$?));
mv build/Multiprotocol.ino.bin ./binaries/multi-stm-xn297dump-ftdidebug-v$MULTI_VERSION.bin; mv build/Multiprotocol.ino.bin ./binaries/mm-stm-xn297dump-ftdidebug-v$MULTI_VERSION.bin;
exit $exitcode; exit $exitcode;

View File

@@ -3,23 +3,23 @@
source ./buildroot/bin/buildFunctions; source ./buildroot/bin/buildFunctions;
exitcode=0; exitcode=0;
printf "\e[33;1mBuilding multi-t18int-aetr-v$MULTI_VERSION.bin\e[0m\n"; printf "\e[33;1mBuilding mm-t18int-aetr-v$MULTI_VERSION.bin\e[0m\n";
opt_disable ENABLE_PPM; opt_disable ENABLE_PPM;
opt_disable INVERT_TELEMETRY; opt_disable INVERT_TELEMETRY;
buildMulti; buildMulti;
exitcode=$((exitcode+$?)); exitcode=$((exitcode+$?));
mv build/Multiprotocol.ino.bin ./binaries/multi-t18int-aetr-v$MULTI_VERSION.bin; mv build/Multiprotocol.ino.bin ./binaries/mm-t18int-aetr-v$MULTI_VERSION.bin;
printf "\e[33;1mBuilding multi-t18int-taer-v$MULTI_VERSION.bin\e[0m\n"; printf "\e[33;1mBuilding mm-t18int-taer-v$MULTI_VERSION.bin\e[0m\n";
opt_replace AETR TAER; opt_replace AETR TAER;
buildMulti; buildMulti;
exitcode=$((exitcode+$?)); exitcode=$((exitcode+$?));
mv build/Multiprotocol.ino.bin ./binaries/multi-t18int-taer-v$MULTI_VERSION.bin; mv build/Multiprotocol.ino.bin ./binaries/mm-t18int-taer-v$MULTI_VERSION.bin;
printf "\e[33;1mBuilding multi-t18int-reta-v$MULTI_VERSION.bin\e[0m\n"; printf "\e[33;1mBuilding mm-t18int-reta-v$MULTI_VERSION.bin\e[0m\n";
opt_replace TAER RETA; opt_replace TAER RETA;
buildMulti; buildMulti;
exitcode=$((exitcode+$?)); exitcode=$((exitcode+$?));
mv build/Multiprotocol.ino.bin ./binaries/multi-t18int-reta-v$MULTI_VERSION.bin; mv build/Multiprotocol.ino.bin ./binaries/mm-t18int-reta-v$MULTI_VERSION.bin;
exit $exitcode; exit $exitcode;