c# applicatie voor f-16 sim

Status
Niet open voor verdere reacties.

Martijn0315

Gebruiker
Lid geworden
16 mei 2016
Berichten
5
Geachte mensen.

Ik ben een fervent gebruiker van een F-16 sim (BMS).
Bij de sim word een DLL (F4sharedmem) geleverd waarmee je data uit de sim kunt gebruiken, en allerlei applicaties kunt maken.
Wat ik graag zou willen bereiken, is data uit de sim te halen en over te brengen naar mijn arduino.

Nu ben ik al een aantal weken bezig, ik ben een beginner op C# gebied en heb al diverse tutorials gevolgd.
Ik krijg al het één en ander voor elkaar, maar waar de schoen wringt is het volgende.
Ik probeer uit een int bepaalde bit's te halen, als de bit 1 is moet er een ledje gaan branden en als de bit 0 is moet het ledje uitgaan.
Uiteraard moet dit over de serial port naar de arduino gestuurd worden, de serial port aanroepen is het probleem niet.

Hier is een stukje code uit de flightData.h
Code:
 LightBits
    {
        MasterCaution = 0x1,  // Left eyebrow

        // Brow Lights
        TF        = 0x2,   // Left eyebrow
        OXY_BROW  = 0x4,   // repurposed for eyebrow OXY LOW (was OBS, unused)
        EQUIP_HOT = 0x8,   // Caution light; repurposed for cooling fault (was: not used)
        ONGROUND  = 0x10,  // True if on ground: this is not a lamp bit!
        ENG_FIRE  = 0x20,  // Right eyebrow; upper half of split face lamp
        CONFIG    = 0x40,  // Stores config, caution panel
        HYD       = 0x80,  // Right eyebrow; see also OIL (this lamp is not split face)
        Flcs_ABCD = 0x100, // TEST panel FLCS channel lamps; repurposed, was OIL (see HYD; that lamp is not split face)
        FLCS      = 0x200, // Right eyebrow; was called DUAL which matches block 25, 30/32 and older 40/42
        CAN       = 0x400, // Right eyebrow
        T_L_CFG   = 0x800, // Right eyebrow

        // AOA Indexers
        AOAAbove  = 0x1000,
        AOAOn     = 0x2000,
        AOABelow  = 0x4000,

        // Refuel/NWS
        RefuelRDY = 0x8000,
        RefuelAR  = 0x10000,
        RefuelDSC = 0x20000,

        // Caution Lights
        FltControlSys = 0x40000,
        LEFlaps       = 0x80000,
        EngineFault   = 0x100000,
        Overheat      = 0x200000,
        FuelLow       = 0x400000,
        Avionics      = 0x800000,
        RadarAlt      = 0x1000000,
        IFF           = 0x2000000,
        ECM           = 0x4000000,
        Hook          = 0x8000000,
        NWSFail       = 0x10000000,
        CabinPress    = 0x20000000,

        AutoPilotOn   = 0x40000000,  // TRUE if is AP on.  NB: This is not a lamp bit!
        TFR_STBY      = 0x80000000,  // MISC panel; lower half of split face TFR lamp

        // Used with the MAL/IND light code to light up "everything"
        // please update this if you add/change bits!
        AllLampBitsOn     = 0xBFFFFFEF
    };

Lightbits is de INT
De waarde van de functie (bv. AOAAbove is 0x1000).

hier is een stuk code wat ik inmiddels geschreven heb
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using F4SharedMem;
using System.IO.Ports;
using System.Collections;
using System.Threading;

namespace test_2
{

    class Program
    {
        



        static void Main(string[] args)
        {

           
            SerialPort Gate = new SerialPort("com16", 9600);
            Reader BmsData = new Reader();
            while (BmsData.IsFalconRunning == true)
            {
                 
                FlightData lamps = BmsData.GetCurrentData();
                //byte[] lights = BmsData.GetRawFlightData2();
                Int32  cautionpanel = lamps.lightBits;
                BitArray testbit = new BitArray(cautionpanel);
                byte[] lights = new byte[16];

                
               
                testbit[0] = Convert.ToBoolean(cautionpanel[12]);                
                //Gate.Open();
                //Gate.WriteLine(lights.ToString());
                Console.WriteLine(lights);e
                Thread.Sleep(500);
            }


            





            Console.ReadKey();
        }
    }
}

Ik heb het web en diverse forums afgezocht en geprobeerd zonder enig resultaat. Er is zoveel te vinden maar daardoor zie ik de bomen door het bos niet meer.Hopelijk zijn er hier mensen die mij in de juiste richting kunnen sturen.
Ik voeg de ddl en flightdata bij
https://www.dropbox.com/s/xr2o3ymwzck64df/F4SharedMem.dll?dl=0
https://www.dropbox.com/s/4rhostbbq3sv330/FlightData.h?dl=0

Alvast bedankt
Martijn
 
Je convert naar boolean is niet de juiste aanpak.

Overigens is het sowieso erg omslachtig om een bit te krijgen, omdat je dat heel eenvoudig met een AND statement kunt doen:

[cpp]

int test;
//geef test een waarde
a = (test & 1) // a = '1' of 'true' als bit 1 gezet is / '0' of 'false' indien niet
b = (test & 2) // b = '2' of 'true' als bit 2 gezet is / '0' of 'false' indien niet
c = (test & 4) // c = '4' of 'true' als bit 3 gezet is / '0' of 'false' indien niet
d = (test & 8) // d = '8' of 'true' als bit 4 gezet is / '0' of 'false' indien niet

//etc
[/cpp]

Een simpele AND operator met de gewenste bit is eigenlijk alles wat je nodig hebt.
 
Eigenlijk simpel. De correcte syntax in C# moet je er even bij zoeken

Testen op specifieke bits doe je met een logische AND functie.

Voorbeeld:
Je input is 0x0003 en je wilt testen op het 2e bit.
Dan levert 0x0003 AND 0x0002 de uitkomst 0x0002.
Ziet er niet erg logisch uit tot je het binair uitschrijft 00000011 AND 00000010 = 00000010.
Wat overblijft na de AND is namelijk alleen het bit waar je op getest hebt.
Daarna kijken of dit dus 0 of 1 is (in mijn voorbeeld dus kijken of het gelijk is aan 0x0002).
 
Heren dank voor u antwoord.

Oke ik begrijp hieruit dat ik bitwise te werk moet gaan, en de operator AND moet gebruiken.
Het gevolg hiervan is mij duidelijk.
Code:
            SerialPort Gate = new SerialPort("com16", 9600);
            Reader BmsData = new Reader();
            while (BmsData.IsFalconRunning == true)
            {
                 
                FlightData lamps = BmsData.GetCurrentData();
                
                int cautionpanel = lamps.lightBits;
                //BitArray testbit = new BitArray(cautionpanel);
                
                //byte[] lights = new byte[4];
                  [B]int AoaON = cautionpanel;[/B] [COLOR="#FF0000"]// Hoe verkrijg ik hier de juiste bit uit de int cautionpanel(wat verkregen is uit de flightdata [/COLOR]
                  int checkbit = 0xd;
                  int AoaOnOut = AoaON & checkbit;



                

             
             
                        

                //Gate.Open();
                //Gate.WriteLine(lights.ToString());
                Console.WriteLine(AoaOnOut);
                Thread.Sleep(500);
            }


            





            Console.ReadKey();
        }
    }
}
@RogerS

Zou je mij een code voorbeeld kunnen schrijven.

Dank
Martijn
 
Laatst bewerkt:
0xd = 13 = 0b00001101. Dat zijn 3 bits. Met een AND statement krijg je alleen een positieve uitkomst als alle 3 die bits gezet zijn.

Wil je 1 bit? 3 bits?
 
0xd = 13 = 0b00001101. Dat zijn 3 bits. Met een AND statement krijg je alleen een positieve uitkomst als alle 3 die bits gezet zijn.

Wil je 1 bit? 3 bits?

Zoals ik het zie en begrijp stelt elke bit in de integer van f4 sharedmem (int cautionpanel) een lampje voor. Dus als een bit 1 is dan gaat lampje aan en als dezelfde bit 0 is gaat lampje uit.

Dus alle bitjes in de int hebben een aan/uit functie.
 
Ja, maar welke wil je hebben? Je zult een enkel lampje moeten kiezen toch? Indien de arduino een array van bits moet krijgen kun je gewoon de int doorzetten over je com-poort. Dus waar loop je precies vast?
 
Uiteindelijk zou ik alle bits die in de int willen versturen. Ik zou graag eerst 1 bit willen versturen en stapsgewijs uitbreiden, op deze manier hoop ik te leren wat er gebeurt in c#.

Ik heb geprobeerd de int te versturen maar dit geeft mij de melding in c# dat ik het als string moet versturen.
Zo ver ik weet is een string text waar geen waarde aan is verbonden.
 
Ja, maar welke wil je hebben? Je zult een enkel lampje moeten kiezen toch? Indien de arduino een array van bits moet krijgen kun je gewoon de int doorzetten over je com-poort. Dus waar loop je precies vast?

Mijn gedachte is/was dat ik elke bitje over de serialpoort stuur en dan in de arduino het naar een output stuur en zo een ledje hoog of laag schakel.Inmiddels heb ik mijn C# code aangepast dat het de complete int als byte verstuurd.
Code:
SerialPort Gate = new SerialPort("com16", 9600);
            Reader BmsData = new Reader();
            Gate.Open();
            while (BmsData.IsFalconRunning == true)
            {
                 
                FlightData lamps = BmsData.GetCurrentData();
                //byte[] lights = BmsData.GetRawFlightData2();
                int cautionpanel = lamps.lightBits;
                //BitArray testbit = new BitArray(cautionpanel);
                
                //byte[] lights = new byte[4];
                  //int  AoaON = cautionpanel;
                  //int checkbit = 0xd;
                  //int AoaOnOut = AoaON & checkbit;
                byte[] cautionpanelTrafic = BitConverter.GetBytes(cautionpanel);
                Gate.Write(cautionpanelTrafic, 0, 4);
                Console.WriteLine(cautionpanelTrafic);
                Thread.Sleep(500);
                                       
               
            }

Nu moet ik mij eens verdiepen hoe ik dit in de arduino verwerk.

Groet
Martijn
 
Dit is inderdaad meer wat je in de basis zou moeten doen. Je kunt ook even nadenken of je eventueel een uitgebreider protocol wil ontwikkelen voor communicatie met de arduino. Het belangrijkste is dat je comfortabel wordt met het denken van bits/bytes/data als een enkel "ding". voor een computer (ook de arduino) is uiteindelijk alles een verzameling bits.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan