Page 1 of 1

Multiwii IOS/Android GCS development

Posted: Sat Mar 19, 2016 9:08 pm
by crow
Hello,

i'm currently developing a cross platform application to control MWC via wifi for my Final year project, but i already hit the wall, i can't find out how to create a checksum, im using socket test and type the message directly to test it before starting with the code
lets say i want to send an

MSP_IDENT:
$M<[0][100][crc?]
36 77 60 49 48 48 [Checksum?]

_________
Solved and implimented using C# but,
________________________
Now im having a diffrent problem i've been searching for few days but i can't find the solution, after converting values and assembling the socket and send it i couldn't get any answer from the arduino considering that when i send it via a socket test android app i.e write the socket manually exp:(24 4d 3c 00 64 64) in Hex, i get an answer, i think it has somethink with the speed of transmission, this is my code:

Code: Select all

  public void setupSocket() {                            // Socket setup here
         try {               
             mySocket = new TcpClient(Host, Port);
             theStream = mySocket.GetStream();
             theWriter = new StreamWriter(theStream);
             theReader = new StreamReader(theStream);
             socketReady = true;
             cnx.Play ();                                //voice assistant "connected"
         }
         catch (Exception e) {
             Debug.Log("Socket error:" + e);                // catch any exceptions
             lostcnx.Play ();                                    //Disconnected voice assistant
         }
     }
     
     public void writeSocket(string theLine) {            // function to write data out
         if (!socketReady)
             return;
         string tmpString = theLine;
         
         theWriter.WriteLine(tmpString);
         theWriter.Flush();
 
                           /************i've tried also*************/
                            //tmpString = System.Convert.ToByte ("244d3c006464");
                           //String nx="24 4d 3c 00 64 64";
                           //writer(theLine, 0, theLine.Length);


     }
     
     public string readSocket() {                        // function to read data in
         if (!socketReady)
             return "";
         if (theStream.DataAvailable)
             return theReader.ReadLine();
 
         return "NoData";
     }


And this is the MSP code :

Code: Select all

 
         
         //send msp with payload
         private List<Byte> requestMSP(int msp, byte[] payload)
         {
             if (msp < 0)
             {
                 return null;
             }
             List<Byte> bf = new List<Byte>();
             foreach (byte c in MSP_HEADER.ToCharArray())
             {
                 bf.Add(c);
             }
             
             byte checksum = 0;
             byte pl_size = (byte)((payload != null ? (int)(payload.Length) : 0) & 0xFF);
             bf.Add(pl_size);
             checksum ^= (byte)(pl_size & 0xFF);
             
             bf.Add((byte)(msp & 0xFF));
             checksum ^= (byte)(msp & 0xFF);
             
             if (payload != null)
             {
                 foreach (byte b in payload)
                 {
                     bf.Add((byte)(b & 0xFF));
                     checksum ^= (byte)(b & 0xFF);
                 }
             }
             bf.Add(checksum);
             return (bf);
         }
         
         void sendRequestMSP(List<Byte> msp)
         {
             byte[] arr = new byte[msp.Count];
             int i = 0;
             foreach (byte b in msp)
             {
                 arr[i++] = b;
             }
             client.writeSocket(BitConverter.ToString(arr)); // send the complete byte sequence in one go
             string output=BitConverter.ToString(arr);
             Debug.Log (output);
         }


i've tried many possible solution the socket looks correct in the debug messages but i guess the hex values is converted in wrong way before sending, and i don't know if i can control the speed of transmition some how, the same as in the serial port baudrate !!
Thanks in advance

Re: Multiwii Cross Platform App development

Posted: Mon Mar 21, 2016 10:16 am
by gregd72002
For checksum you start with size
xor with id
xor with all data bits

https://github.com/rpicopter/mw-service ... /msg.c#L22

Re: Multiwii Cross Platform App development

Posted: Mon Mar 21, 2016 5:32 pm
by crow
gregd72002 wrote:For checksum you start with size
xor with id
xor with all data bits

https://github.com/rpicopter/mw-service ... /msg.c#L22





Thanks Man i appreciate it, your code seems very helpful, is there any way that i can run it on windows

Re: Multiwii Cross Platform App development

Posted: Mon Mar 21, 2016 6:03 pm
by gregd72002
It shouldn't be that difficult to port it to windows.

You will most likely need to port uart.c and shm.c.
uart.c should be straightforward
shm.c you will need to come up with an alternative, i.e CreateFileMapping, MapViewOfFile, etc

Re: Multiwii Cross Platform App development

Posted: Tue Mar 22, 2016 1:59 am
by crow
gregd72002 wrote:It shouldn't be that difficult to port it to windows.

You will most likely need to port uart.c and shm.c.
uart.c should be straightforward
shm.c you will need to come up with an alternative, i.e CreateFileMapping, MapViewOfFile, etc





Thanks i'll try out

Re: Multiwii IOS/Android GCS development

Posted: Mon Jun 13, 2016 8:17 am
by crow
crow wrote:Hello,

i'm currently developing a cross platform application to control MWC via wifi for my Final year project, but i already hit the wall, i can't find out how to create a checksum, im using socket test and type the message directly to test it before starting with the code
lets say i want to send an

MSP_IDENT:
$M<[0][100][crc?]
36 77 60 49 48 48 [Checksum?]

_________
Solved and implimented using C# but,
________________________
Now im having a diffrent problem i've been searching for few days but i can't find the solution, after converting values and assembling the socket and send it i couldn't get any answer from the arduino considering that when i send it via a socket test android app i.e write the socket manually exp:(24 4d 3c 00 64 64) in Hex, i get an answer, i think it has somethink with the speed of transmission, this is my code:

Code: Select all

  public void setupSocket() {                            // Socket setup here
         try {               
             mySocket = new TcpClient(Host, Port);
             theStream = mySocket.GetStream();
             theWriter = new StreamWriter(theStream);
             theReader = new StreamReader(theStream);
             socketReady = true;
             cnx.Play ();                                //voice assistant "connected"
         }
         catch (Exception e) {
             Debug.Log("Socket error:" + e);                // catch any exceptions
             lostcnx.Play ();                                    //Disconnected voice assistant
         }
     }
     
     public void writeSocket(string theLine) {            // function to write data out
         if (!socketReady)
             return;
         string tmpString = theLine;
         
         theWriter.WriteLine(tmpString);
         theWriter.Flush();
 
                           /************i've tried also*************/
                            //tmpString = System.Convert.ToByte ("244d3c006464");
                           //String nx="24 4d 3c 00 64 64";
                           //writer(theLine, 0, theLine.Length);


     }
     
     public string readSocket() {                        // function to read data in
         if (!socketReady)
             return "";
         if (theStream.DataAvailable)
             return theReader.ReadLine();
 
         return "NoData";
     }


And this is the MSP code :

Code: Select all

 
         
         //send msp with payload
         private List<Byte> requestMSP(int msp, byte[] payload)
         {
             if (msp < 0)
             {
                 return null;
             }
             List<Byte> bf = new List<Byte>();
             foreach (byte c in MSP_HEADER.ToCharArray())
             {
                 bf.Add(c);
             }
             
             byte checksum = 0;
             byte pl_size = (byte)((payload != null ? (int)(payload.Length) : 0) & 0xFF);
             bf.Add(pl_size);
             checksum ^= (byte)(pl_size & 0xFF);
             
             bf.Add((byte)(msp & 0xFF));
             checksum ^= (byte)(msp & 0xFF);
             
             if (payload != null)
             {
                 foreach (byte b in payload)
                 {
                     bf.Add((byte)(b & 0xFF));
                     checksum ^= (byte)(b & 0xFF);
                 }
             }
             bf.Add(checksum);
             return (bf);
         }
         
         void sendRequestMSP(List<Byte> msp)
         {
             byte[] arr = new byte[msp.Count];
             int i = 0;
             foreach (byte b in msp)
             {
                 arr[i++] = b;
             }
             client.writeSocket(BitConverter.ToString(arr)); // send the complete byte sequence in one go
             string output=BitConverter.ToString(arr);
             Debug.Log (output);
         }


i've tried many possible solution the socket looks correct in the debug messages but i guess the hex values is converted in wrong way before sending, and i don't know if i can control the speed of transmition some how, the same as in the serial port baudrate !!
Thanks in advance

Re: Multiwii IOS/Android GCS development

Posted: Thu Jun 16, 2016 12:17 pm
by gregd72002
why are you using writeline and not simply write? Also are you sure you have setup the correct baud rate, etc? what's the output of bitconverter.toString?

Re: Multiwii IOS/Android GCS development

Posted: Fri Jun 17, 2016 1:22 am
by crow
gregd72002 wrote:why are you using writeline and not simply write? Also are you sure you have setup the correct baud rate, etc? what's the output of bitconverter.toString?



actualy i don't know the diffrence im new to networking, about the baud rate i thaught as part of the connection setup, the network source performs measurement to estimate the initial link bandwidth between client and server in addition i find that the baud rate could only set to the serial communication using COM ports i don't know how to do it over wifi but i guess that is the main problem. if i can make it more clear i have used an android app for sockettest and by writing the cmd manually [24-4D-3C-00-64-64] i get a responce from the FC but when i send it from my code i get nothing, another thing is i test the connection of my code using a separate wifi module and the connection seems correct, the output of the bitconverter is like this:
bitconverter.toString[36-77-60-0-100-100] ==> 24-4D-3C-00-64-64

i'll do some additional test to see if i can come up with somethink but i'll appreciate any help

Re: Multiwii IOS/Android GCS development

Posted: Fri Jun 17, 2016 2:17 pm
by gregd72002
you might also consider reporting number of bytes written. This would be good check to verify what's being sent out

Re: Multiwii IOS/Android GCS development

Posted: Sun Jun 19, 2016 12:41 am
by crow
gregd72002 wrote:you might also consider reporting number of bytes written. This would be good check to verify what's being sent out

i have been into another kind of problem so im going to resolve it first, the motor doesn't seems that they generate enough thrust so it couldn't even hover this is a picture of what i've done :
Image