From 6205c4147db2e78b3138b0a9e3f6697fc9ec0c7f Mon Sep 17 00:00:00 2001 From: Cleric-K <9365881+Cleric-K@users.noreply.github.com> Date: Fri, 10 Jan 2020 22:28:42 +0200 Subject: [PATCH] Fport support --- vJoySerialFeeder/MainForm.Designer.cs | 1 + vJoySerialFeeder/MainForm.cs | 1 + vJoySerialFeeder/MainFormWorker.cs | 2 +- .../SerialProtocols/FportReader.cs | 182 ++++++++++++++++++ .../SerialProtocols/SbusReader.cs | 67 ++++--- .../SerialProtocols/SerialReader.cs | 4 + vJoySerialFeeder/vJoySerialFeeder.csproj | 1 + vJoySerialFeeder/vJoySerialFeederLinux.csproj | 1 + 8 files changed, 226 insertions(+), 33 deletions(-) create mode 100644 vJoySerialFeeder/SerialProtocols/FportReader.cs diff --git a/vJoySerialFeeder/MainForm.Designer.cs b/vJoySerialFeeder/MainForm.Designer.cs index 4db94b3..37cd5da 100644 --- a/vJoySerialFeeder/MainForm.Designer.cs +++ b/vJoySerialFeeder/MainForm.Designer.cs @@ -293,6 +293,7 @@ protected override void Dispose(bool disposing) "KISS", "MultiWii", "SBUS", + "FPort", "DSM", "Dummy"}); this.comboProtocol.Location = new System.Drawing.Point(360, 64); diff --git a/vJoySerialFeeder/MainForm.cs b/vJoySerialFeeder/MainForm.cs index 5afcf6d..c0ead2a 100644 --- a/vJoySerialFeeder/MainForm.cs +++ b/vJoySerialFeeder/MainForm.cs @@ -55,6 +55,7 @@ public partial class MainForm : Form typeof(KissReader), typeof(MultiWiiReader), typeof(SbusReader), + typeof(FportReader), typeof(DsmReader), typeof(DummyReader) }; diff --git a/vJoySerialFeeder/MainFormWorker.cs b/vJoySerialFeeder/MainFormWorker.cs index b511aed..2b25d0f 100644 --- a/vJoySerialFeeder/MainFormWorker.cs +++ b/vJoySerialFeeder/MainFormWorker.cs @@ -212,7 +212,7 @@ void BackgroundWorkerDoWork(object sender, System.ComponentModel.DoWorkEventArgs if(now >= nextUIUpdateTime) { nextUIUpdateTime = now + 100; - // update the Rate on evert 500ms + // update the Rate on every 500ms if(now >= nextRateUpdateTime) { nextRateUpdateTime = now + 500; diff --git a/vJoySerialFeeder/SerialProtocols/FportReader.cs b/vJoySerialFeeder/SerialProtocols/FportReader.cs new file mode 100644 index 0000000..3a0afb2 --- /dev/null +++ b/vJoySerialFeeder/SerialProtocols/FportReader.cs @@ -0,0 +1,182 @@ +/* + * Created by SharpDevelop. + * User: Cleric + * Date: 28.11.2019 г. + * Time: 21:14 ч. + * + */ + +using System; +using System.Collections; +using System.IO.Ports; +using System.Windows.Forms; + +namespace vJoySerialFeeder +{ + /// + /// + /// Info at: + /// https://github.com/betaflight/betaflight/files/1491056/F.Port.protocol.betaFlight.V2.1.2017.11.21.pdf + /// + /// + public class FportReader : SbusReader + { + private const byte BORDER_BYTE = 0x7e; + private const byte ESCAPE_BYTE = 0x7d; + private const byte ESCAPE_MASK = 0x20; + private const byte CONTROL_FRAME = 0x00; + private const byte CRC_CORRECT = 0xff; + private const int FRAME_LENGTH = 25; // sbus frame is always 25 bytes + private const int NUM_CHANNELS = 16; + private const int SBUS_CH_BITS = 11; + private const int SBUS_CH_MASK = (1<> 8)); + if(crc != CRC_CORRECT) { + System.Diagnostics.Debug.WriteLine("bad crc"); + Buffer.Slide(full_frame_len); + return 0; + } + + + if(!ignoreSbusFailsafeFlag && (Buffer[25]&SBUS_FAILSAFE_MASK) != 0) { + Buffer.Slide(full_frame_len); + throw new FailsafeException("SBUS Failsafe active"); + } + + // Fport uses the same channel format as Sbus + DecodeSbusChannels(3); + + // do not check the flags byte, we don't really need anything from there + Buffer.Slide(full_frame_len); + return NUM_CHANNELS; + + } + return 0; + } + + public override bool Configurable { + get { return true; } + } + + public override string Configure(string config) + { + parseConfig(config); + + using(var d = new SbusSetupForm(useRawInput, ignoreSbusFailsafeFlag)) { + d.ShowDialog(); + if(d.DialogResult == DialogResult.OK) { + useRawInput = d.UseRawInput; + ignoreSbusFailsafeFlag = d.IgnoreSbusFailsafeFlag; + return buildConfig(); + } + + return null; + } + } + + public override Configuration.SerialParameters GetDefaultSerialParameters() + { + return new Configuration.SerialParameters() { + BaudRate = 115200, + DataBits = 8, + Parity = Parity.None, + StopBits = StopBits.One + }; + } + + private void parseConfig(string config) { + var tokens = config == null ? + new string[0] + : + config.Split(','); + + foreach(var s in tokens) { + if(s == "raw") + useRawInput = true; + else if(s == "failsafe") + ignoreSbusFailsafeFlag = true; + } + } + + private string buildConfig() { + var cfg = new ArrayList(); + if(useRawInput) + cfg.Add("raw"); + if(ignoreSbusFailsafeFlag) + cfg.Add("failsafe"); + + return string.Join(",", cfg.ToArray()); + } + } +} diff --git a/vJoySerialFeeder/SerialProtocols/SbusReader.cs b/vJoySerialFeeder/SerialProtocols/SbusReader.cs index 05b14e5..2733459 100644 --- a/vJoySerialFeeder/SerialProtocols/SbusReader.cs +++ b/vJoySerialFeeder/SerialProtocols/SbusReader.cs @@ -81,38 +81,7 @@ public override int ReadChannels() throw new FailsafeException("SBUS Failsafe active"); } - int inputbits = 0; - int inputbitsavailable = 0; - int bufIdx = 1; - - // channel parser based on - // https://github.com/opentx/opentx/blob/6bd38ce13a89ade70aa8e83914063464a8d9750a/radio/src/sbus.cpp#L50 - - for (var i=0; i>= SBUS_CH_BITS; - } + DecodeSbusChannels(1); // do not check the flags byte, we don't really need anything from there @@ -149,6 +118,40 @@ public override Configuration.SerialParameters GetDefaultSerialParameters() }; } + protected void DecodeSbusChannels(int bufIdx) { + int inputbits = 0; + int inputbitsavailable = 0; + + // channel parser based on + // https://github.com/opentx/opentx/blob/6bd38ce13a89ade70aa8e83914063464a8d9750a/radio/src/sbus.cpp#L50 + + for (var i=0; i>= SBUS_CH_BITS; + } + } + private void parseConfig(string config) { var tokens = config == null ? new string[0] diff --git a/vJoySerialFeeder/SerialProtocols/SerialReader.cs b/vJoySerialFeeder/SerialProtocols/SerialReader.cs index 6fa8252..6fb8c4b 100644 --- a/vJoySerialFeeder/SerialProtocols/SerialReader.cs +++ b/vJoySerialFeeder/SerialProtocols/SerialReader.cs @@ -66,6 +66,10 @@ public class SerialBuffer { } return buf[index]; } + + set { + buf[index] = value; + } } /// diff --git a/vJoySerialFeeder/vJoySerialFeeder.csproj b/vJoySerialFeeder/vJoySerialFeeder.csproj index ff9d273..2fa96a9 100644 --- a/vJoySerialFeeder/vJoySerialFeeder.csproj +++ b/vJoySerialFeeder/vJoySerialFeeder.csproj @@ -134,6 +134,7 @@ DummySetupForm.cs + diff --git a/vJoySerialFeeder/vJoySerialFeederLinux.csproj b/vJoySerialFeeder/vJoySerialFeederLinux.csproj index d14ad74..799c08a 100644 --- a/vJoySerialFeeder/vJoySerialFeederLinux.csproj +++ b/vJoySerialFeeder/vJoySerialFeederLinux.csproj @@ -129,6 +129,7 @@ DummySetupForm.cs +