Пример #1
0
        private bool process_message()
        {
            Console.WriteLine("packet: " + gsof_msg.packettype.ToString("X") + " len: " + gsof_msg.length + " status: " +
                              gsof_msg.status);

            if (gsof_msg.packettype == 0x57) // RAWDATA
            {
                uint8_t record_type    = gsof_msg.data[0];
                uint8_t page_total     = (byte)(gsof_msg.data[1] & 0xf);
                uint8_t page_number    = (byte)((gsof_msg.data[1] >> 4) & 0xf);
                uint8_t reply_number   = (byte)gsof_msg.data[2];
                uint8_t recordintflags = gsof_msg.data[3];

                bool consise = (recordintflags & 0x1) > 0;

                Console.WriteLine(DateTime.Now.Second + " record type: " + record_type + " page_no " + page_number + "/" + page_total + " consise " + consise);

                if (record_type == 7)
                {
                    double p40 = Math.Pow(2, 40);
                    double p39 = Math.Pow(2, 39);
                    double p11 = Math.Pow(2, 11);
                    double p12 = Math.Pow(2, 12);
                    double p14 = Math.Pow(2, 14);
                    double p21 = Math.Pow(2, 21);
                    double p26 = Math.Pow(2, 26);
                    double p17 = Math.Pow(2, 17);
                    double p4  = Math.Pow(2, 4);

                    var test2 = (rt27_7_29)gsof_msg.data.ByteArrayToStructureBigEndian <rt27_7_29>(4);

                    long lat = byte2long(test2.Lat);
                    long lng = byte2long(test2.Lng);

                    Console.WriteLine("{0} {1} {2} {3} {4} {5} ", lat / p40, lng / p39, test2.Alt / p12,
                                      (test2.veln / p21), (test2.vele / p21), (test2.velu / p21),
                                      test2.rx_clock_offset / p26, test2.rx_clock_drift / p17, test2.hdop / p4);
                }
                else if (record_type == 1)
                {
                    var test2 = (rt27_1_11)gsof_msg.data.ByteArrayToStructureBigEndian <rt27_1_11>(4);

                    Console.WriteLine("{0} {1} {2}", ToDeg(test2.Latitude * Math.PI), ToDeg(test2.Longitude * Math.PI), test2.Altitude);
                }
                else if (record_type == 2)
                {
                    var test2 = (rt27_2_19)gsof_msg.data.ByteArrayToStructureBigEndian <rt27_2_19>(4);

                    Console.WriteLine("Event {0} {1} {2} {3}", test2.Source, test2.Port, test2.Number, test2.TOW);
                }
                else if (record_type == 6) // there is no documentation on this
                {
                    if (page_number == 1)
                    {
                        obsdata.Initialize();
                        Array.ConstrainedCopy(gsof_msg.data, 0, obsdata, 0, gsof_msg.length);
                    }
                    else
                    {
                        Array.ConstrainedCopy(gsof_msg.data, 4, obsdata, 248 + (page_number - 2) * 244, gsof_msg.length - 4);
                    }


                    if (page_number == page_total)
                    {
                        var m_epochHeader =
                            (rt27_6_27_epochHeader)
                            obsdata.ByteArrayToStructureBigEndian <rt27_6_27_epochHeader>(4);

                        var head_len = m_epochHeader.blockLength;

                        var m_sysOffsets = new rt27_6_27_sysOffsets();
                        var obj          = m_sysOffsets as object;
                        MavlinkUtil.ByteArrayToStructureEndian(obsdata, ref obj, (4 + head_len));
                        m_sysOffsets = (rt27_6_27_sysOffsets)obj;

                        var sysoffset_lemn = m_sysOffsets.blockLength;

                        var m_measurement = new List <rt27_6_27_measurement>();
                        var SVs           = m_epochHeader.nSVs;

                        var offset = 4 + head_len + sysoffset_lemn;

                        for (int index = 0; index < SVs; ++index)
                        {
                            var measheader = new rt27_6_27_measurementHeader();
                            obj = measheader as object;
                            MavlinkUtil.ByteArrayToStructureEndian(obsdata, ref obj, offset);
                            measheader = (rt27_6_27_measurementHeader)obj;
                            var meashead_len = measheader.blockLength;
                            offset += meashead_len;

                            string type = "";
                            switch (measheader.svType)
                            {
                            case 0:
                                type = "Gps";
                                break;

                            case 1:
                                type = "Sbas";
                                break;

                            case 2:
                                type = "Glonass";
                                break;

                            case 3:
                                type = "Galileo";
                                break;

                            case 4:
                                type = "QZSS";
                                break;

                            case 7:
                                type = "beidou";
                                break;
                            }

                            Console.WriteLine("prn {0} type {1} el {2} az {3} blocks {4}", measheader.prn, type, (double)(sbyte)measheader.elevation, (double)measheader.azimuth / Math.Pow(2.0, -1.0), measheader.nBlocks);

                            for (int a = 0; a < measheader.nBlocks; a++)
                            {
                                var measblock = new rt27_6_27_measurementBlock();
                                obj = measblock as object;
                                MavlinkUtil.ByteArrayToStructureEndian(obsdata, ref obj, offset);
                                measblock = (rt27_6_27_measurementBlock)obj;

                                if (a == 0)
                                {
                                    Console.WriteLine("{0} {1}", measblock.pseudorange / Math.Pow(2.0, 7.0), byte2long(measblock.phase) / Math.Pow(2.0, 15.0));
                                }
                                else
                                {
                                }

                                var measblock_len = measblock.blockLength;
                                offset += measblock_len;

                                m_measurement.Add(new rt27_6_27_measurement()
                                {
                                    block = measblock, header = measheader
                                });
                            }
                        }
                    }
                }
            }

            if (gsof_msg.packettype == 0x40) // GSOF
            {
                uint8_t trans_number = gsof_msg.data[0];
                uint8_t pageidx      = gsof_msg.data[1];
                uint8_t maxpageidx   = gsof_msg.data[2];

                //http://www.trimble.com/OEM_ReceiverHelp/V4.81/en/default.html
                //http://www.trimble.com/EC_ReceiverHelp/V4.19/en/GSOFmessages_Overview.htm
                Console.WriteLine("GSOF page: " + pageidx + " of " + maxpageidx);

                // want 2 8 9 38

                for (uint a = 3; a < gsof_msg.length; a++)
                {
                    uint8_t output_type = gsof_msg.data[a];
                    a++;
                    uint8_t output_length = gsof_msg.data[a];
                    a++;
                    Console.WriteLine("GSOF type: " + output_type + " len: " + output_length);

                    if (output_type == 2) // position
                    {
                        state.location.lat = (int32_t)(ToDeg(SwapDouble(gsof_msg.data, a)) * 1e7);
                        state.location.lng = (int32_t)(ToDeg(SwapDouble(gsof_msg.data, a + 8)) * 1e7);
                        state.location.alt = (int32_t)(SwapDouble(gsof_msg.data, a + 16) * 1e2);

                        state.last_gps_time_ms = state.time_week_ms;
                    }
                    else if (output_type == 8) // velocity
                    {
                        uint8_t vflag = gsof_msg.data[a];
                        if ((vflag & 1) == 1)
                        {
                            state.ground_speed  = SwapFloat(gsof_msg.data, a + 1);
                            state.ground_course = (float)(ToDeg(SwapFloat(gsof_msg.data, a + 5)));
                            fill_3d_velocity();
                            state.velocity.z             = -SwapFloat(gsof_msg.data, a + 9);
                            state.have_vertical_velocity = true;
                        }
                    }
                    else if (output_type == 9) //dop
                    {
                        state.hdop = (uint16_t)(SwapFloat(gsof_msg.data, a + 4) * 100);
                    }
                    else if (output_type == 12) // position sigma
                    {
                        state.horizontal_accuracy = (SwapFloat(gsof_msg.data, a + 4) + SwapFloat(gsof_msg.data, a + 8)) /
                                                    2;
                        state.vertical_accuracy        = SwapFloat(gsof_msg.data, a + 16);
                        state.have_horizontal_accuracy = true;
                        state.have_vertical_accuracy   = true;
                    }
                    else if (output_type == 1) // pos time
                    {
                        state.time_week_ms = SwapUint32(gsof_msg.data, a);
                        state.time_week    = SwapUint16(gsof_msg.data, a + 4);
                        state.num_sats     = gsof_msg.data[a + 6];
                        uint8_t posf1 = gsof_msg.data[a + 7];
                        uint8_t posf2 = gsof_msg.data[a + 8];

                        Console.WriteLine("POSTIME: " + posf1 + " " + posf2);

                        if ((posf1 & 1) == 1)
                        {
                            state.status = AP_GPS.GPS_OK_FIX_3D;
                            if ((posf2 & 1) == 1)
                            {
                                state.status = AP_GPS.GPS_OK_FIX_3D_DGPS;
                                if ((posf2 & 4) == 4)
                                {
                                    state.status = AP_GPS.GPS_OK_FIX_3D_RTK;
                                }
                            }
                        }
                        else
                        {
                            state.status = AP_GPS.NO_FIX;
                        }
                    }

                    a += output_length - 1u;
                }


                Type        t  = state.GetType(); //where obj is object whose properties you need.
                FieldInfo[] pi = t.GetFields();
                foreach (var p in pi)
                {
                    System.Console.WriteLine(p.Name + "    " + p.GetValue(state).ToString());
                }

                return(true);
            }

            return(false);
        }
Пример #2
0
        private bool process_message()
        {
            Console.WriteLine("packet: " + gsof_msg.packettype.ToString("X") + " len: " + gsof_msg.length + " status: " +
                              gsof_msg.status);

            if (gsof_msg.packettype == 0x57) // RAWDATA 
            {
                uint8_t record_type = gsof_msg.data[0];
                uint8_t page_total = (byte)(gsof_msg.data[1] & 0xf);
                uint8_t page_number = (byte)((gsof_msg.data[1] >> 4) & 0xf);
                uint8_t reply_number =(byte) gsof_msg.data[2];
                uint8_t recordintflags = gsof_msg.data[3];

                bool consise = (recordintflags & 0x1) > 0;

                Console.WriteLine(DateTime.Now.Second + " record type: " + record_type + " page_no " + page_number + "/" + page_total + " consise " + consise);

                if (record_type == 7)
                {
                    double p40 = Math.Pow(2, 40);
                    double p39 = Math.Pow(2, 39);
                    double p11 = Math.Pow(2, 11);
                    double p12 = Math.Pow(2, 12);
                    double p14 = Math.Pow(2, 14);
                    double p21 = Math.Pow(2, 21);
                    double p26 = Math.Pow(2, 26);
                    double p17 = Math.Pow(2, 17);
                    double p4 = Math.Pow(2, 4);

                    var test2 = (rt27_7_29) gsof_msg.data.ByteArrayToStructureBigEndian<rt27_7_29>(4);

                    long lat = byte2long(test2.Lat);
                    long lng = byte2long(test2.Lng);

                    Console.WriteLine("{0} {1} {2} {3} {4} {5} ", lat/p40, lng/p39, test2.Alt/p12,
                        (test2.veln/p21), (test2.vele/p21), (test2.velu/p21),
                        test2.rx_clock_offset/p26, test2.rx_clock_drift/p17, test2.hdop/p4);
                }
                else if (record_type == 1)
                {
                    var test2 = (rt27_1_11)gsof_msg.data.ByteArrayToStructureBigEndian<rt27_1_11>(4);

                    Console.WriteLine("{0} {1} {2}", ToDeg(test2.Latitude*Math.PI), ToDeg(test2.Longitude*Math.PI), test2.Altitude);
                }
                else if (record_type == 2)
                {
                    var test2 = (rt27_2_19)gsof_msg.data.ByteArrayToStructureBigEndian<rt27_2_19>(4);

                    Console.WriteLine("Event {0} {1} {2} {3}", test2.Source, test2.Port, test2.Number, test2.TOW);
                }
                else if (record_type == 6) // there is no documentation on this
                {
                    if (page_number == 1)
                    {
                        obsdata.Initialize();
                        Array.ConstrainedCopy(gsof_msg.data, 0, obsdata, 0, gsof_msg.length);
                    }
                    else
                    {
                        Array.ConstrainedCopy(gsof_msg.data, 4, obsdata, 248 + (page_number - 2) * 244, gsof_msg.length - 4);
                    }
                    

                    if (page_number == page_total)
                    {
                        var m_epochHeader =
                            (rt27_6_27_epochHeader)
                                obsdata.ByteArrayToStructureBigEndian<rt27_6_27_epochHeader>(4);

                        var head_len = m_epochHeader.blockLength;

                        var m_sysOffsets = new rt27_6_27_sysOffsets();
                        var obj = m_sysOffsets as object;
                        MavlinkUtil.ByteArrayToStructureEndian(obsdata, ref obj, (4 + head_len));
                        m_sysOffsets = (rt27_6_27_sysOffsets) obj;

                        var sysoffset_lemn = m_sysOffsets.blockLength;

                        var m_measurement = new List<rt27_6_27_measurement>();
                        var SVs = m_epochHeader.nSVs;

                        var offset = 4 + head_len + sysoffset_lemn;

                        for (int index = 0; index < SVs; ++index)
                        {
                            var measheader = new rt27_6_27_measurementHeader();
                            obj = measheader as object;
                            MavlinkUtil.ByteArrayToStructureEndian(obsdata, ref obj, offset);
                            measheader = (rt27_6_27_measurementHeader)obj;
                            var meashead_len = measheader.blockLength;
                            offset += meashead_len;

                            string type = "";
                            switch (measheader.svType)
                            {
                                case 0:
                                    type = "Gps";
                                    break;
                                case 1:
                                    type = "Sbas";
                                    break;
                                case 2:
                                    type = "Glonass";
                                    break;
                                case 3:
                                    type = "Galileo";
                                    break;
                                case 4:
                                    type = "QZSS";
                                    break;
                                case 7:
                                    type = "beidou";
                                    break;
                            }

                            Console.WriteLine("prn {0} type {1} el {2} az {3} blocks {4}", measheader.prn, type, (double)(sbyte)measheader.elevation, (double)measheader.azimuth / Math.Pow(2.0, -1.0), measheader.nBlocks);

                            for (int a = 0; a < measheader.nBlocks;a++)
                            {
                                var measblock = new rt27_6_27_measurementBlock();
                                obj = measblock as object;
                                MavlinkUtil.ByteArrayToStructureEndian(obsdata, ref obj, offset);
                                measblock = (rt27_6_27_measurementBlock)obj;

                                if (a == 0)
                                {
                                    Console.WriteLine("{0} {1}", measblock.pseudorange / Math.Pow(2.0, 7.0), byte2long(measblock.phase) / Math.Pow(2.0, 15.0));
                                }
                                else
                                {
                                }

                                var measblock_len = measblock.blockLength;
                                offset += measblock_len;

                                m_measurement.Add(new rt27_6_27_measurement() { block = measblock, header = measheader });
                            }
                        }
                    }
                }
            }

            if (gsof_msg.packettype == 0x40) // GSOF
            {
                uint8_t trans_number = gsof_msg.data[0];
                uint8_t pageidx = gsof_msg.data[1];
                uint8_t maxpageidx = gsof_msg.data[2];

                //http://www.trimble.com/OEM_ReceiverHelp/V4.81/en/default.html
                //http://www.trimble.com/EC_ReceiverHelp/V4.19/en/GSOFmessages_Overview.htm
                Console.WriteLine("GSOF page: " + pageidx + " of " + maxpageidx);

                // want 2 8 9 38

                for (uint a = 3; a < gsof_msg.length; a++)
                {
                    uint8_t output_type = gsof_msg.data[a];
                    a++;
                    uint8_t output_length = gsof_msg.data[a];
                    a++;
                    Console.WriteLine("GSOF type: " + output_type + " len: " + output_length);

                    if (output_type == 2) // position
                    {
                        state.location.lat = (int32_t) (ToDeg(SwapDouble(gsof_msg.data, a))*1e7);
                        state.location.lng = (int32_t) (ToDeg(SwapDouble(gsof_msg.data, a + 8))*1e7);
                        state.location.alt = (int32_t) (SwapDouble(gsof_msg.data, a + 16)*1e2);

                        state.last_gps_time_ms = state.time_week_ms;
                    }
                    else if (output_type == 8) // velocity
                    {
                        uint8_t vflag = gsof_msg.data[a];
                        if ((vflag & 1) == 1)
                        {
                            state.ground_speed = SwapFloat(gsof_msg.data, a + 1);
                            state.ground_course = (float)(ToDeg(SwapFloat(gsof_msg.data, a + 5)));
                            fill_3d_velocity();
                            state.velocity.z = -SwapFloat(gsof_msg.data, a + 9);
                            state.have_vertical_velocity = true;
                        }
                    }
                    else if (output_type == 9) //dop
                    {
                        state.hdop = (uint16_t) (SwapFloat(gsof_msg.data, a + 4)*100);
                    }
                    else if (output_type == 12) // position sigma
                    {
                        state.horizontal_accuracy = (SwapFloat(gsof_msg.data, a + 4) + SwapFloat(gsof_msg.data, a + 8))/
                                                    2;
                        state.vertical_accuracy = SwapFloat(gsof_msg.data, a + 16);
                        state.have_horizontal_accuracy = true;
                        state.have_vertical_accuracy = true;
                    }
                    else if (output_type == 1) // pos time
                    {
                        state.time_week_ms = SwapUint32(gsof_msg.data, a);
                        state.time_week = SwapUint16(gsof_msg.data, a + 4);
                        state.num_sats = gsof_msg.data[a + 6];
                        uint8_t posf1 = gsof_msg.data[a + 7];
                        uint8_t posf2 = gsof_msg.data[a + 8];

                        Console.WriteLine("POSTIME: " + posf1 + " " + posf2);

                        if ((posf1 & 1) == 1)
                        {
                            state.status = AP_GPS.GPS_OK_FIX_3D;
                            if ((posf2 & 1) == 1)
                            {
                                state.status = AP_GPS.GPS_OK_FIX_3D_DGPS;
                                if ((posf2 & 4) == 4)
                                {
                                    state.status = AP_GPS.GPS_OK_FIX_3D_RTK;
                                }
                            }
                        }
                        else
                        {
                            state.status = AP_GPS.NO_FIX;
                        }
                    }

                    a += output_length - 1u;
                }


                Type t = state.GetType(); //where obj is object whose properties you need.
                FieldInfo[] pi = t.GetFields();
                foreach (var p in pi)
                {
                    System.Console.WriteLine(p.Name + "    " + p.GetValue(state).ToString());
                }

                return true;
            }

            return false;
        }