using System; /// /// Ноавя версия ПИВ 1.23 /// namespace PIV { public static class CONST { public static Byte START = 0x3A; public const Byte STARTTOBON = 0x3C; public const Byte STARTTOBON0322 = 0x3F; public const Byte STARTTOBON0323 = 0x3E; public enum ADDR : UInt16 { addrBVM = 0x0001, addrOES = 0x0002, addrBON = 0x0004, addrPU = 0x0008, addrPR = 0x0020 }; public enum CODE : Byte { msgNOTHING_TO_SEND = 0x01, msgRECEIVE_DATA = 0x03, msgSEND_DATA = 0x05, msgCONDITION_EQUIPMENT = 0x06, msgIN_ORDER = 0x07, msgOUT_ORDER = 0x08 }; public static Byte[] auchCRCHi = new Byte[] { 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 }; public static Byte[] auchCRCLo = new Byte[] { 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3, 0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26, 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5, 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C, 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80, 0x40 }; public static UInt16 CRC16(ref Byte[] d, UInt16 len) { Byte crc_hi = 0xFF; Byte crc_lo = 0xFF; Byte j = 0; do { Byte i = (Byte)(crc_hi ^ d[j++]); crc_hi = (Byte)(crc_lo ^ (Byte)auchCRCHi[i]); crc_lo = (Byte)(auchCRCLo[i]); } while (--len != 0); return (UInt16)((crc_hi << 8) | crc_lo); } } public static class TOBON { private static Byte _infoword = 0; private static Byte _i_vstr_kontr = 0; private static Byte _i_neispr_bon = 0; private static Byte _i_vystavka = 0; private static Byte _i_gotovnost = 0; private static Byte _i_ots_massiv_NV = 0; private static Byte _i_rejim_nav = 0; private static UInt16 _dostovernost = 0; private static UInt16 _d_kren = 0; private static UInt16 _d_tangaj = 0; private static UInt16 _d_kurs = 0; private static UInt16 _d_usX = 0; private static UInt16 _d_usY = 0; private static UInt16 _d_usZ = 0; private static UInt16 _d_uskX = 0; private static UInt16 _d_uskY = 0; private static UInt16 _d_uskZ = 0; private static Byte _rejim_SNS = 0; private static Byte _rejim_2D = 0; private static Byte _rejim_3dfix = 0; private static Byte _rejim_RTK = 0; private static UInt16 _kod_oshibki = 0; private static UInt16 _ko_nedop_dvij = 0; private static UInt16 _ko_sboy = 0; private static UInt16 _ko_ots_dannyh_sns = 0; private static UInt16 _ko_ots_dannyh_bch = 0; private static UInt16 _ko_prev_dop_gyro = 0; private static UInt16 _ko_prev_dop = 0; public static Byte Start = CONST.STARTTOBON; public static Byte InfoWord { get { _infoword = (Byte)(_i_vstr_kontr); _infoword |= (Byte)(_i_neispr_bon << 1); _infoword |= (Byte)(_i_vystavka << 2); _infoword |= (Byte)(_i_gotovnost << 3); _infoword |= (Byte)(_i_ots_massiv_NV << 4); _infoword |= (Byte)(_i_rejim_nav << 5); return _infoword; } set { _infoword = value; _i_vstr_kontr = (Byte)(value & 0x01); _i_neispr_bon = (Byte)((value & 0x02) >> 1); _i_vystavka = (Byte)((value & 0x04) >> 2); _i_gotovnost = (Byte)((value & 0x08) >> 3); _i_ots_massiv_NV = (Byte)((value & 0x10) >> 4); _i_rejim_nav = (Byte)((value & 0x20) >> 5); } } public static Byte vstr_kontr { get => _i_vstr_kontr; set => _i_vstr_kontr = value; } public static Byte neispr_bon { get => _i_neispr_bon; set => _i_neispr_bon = value; } public static Byte vystavka { get => _i_vystavka; set => _i_vystavka = value; } public static Byte gotovnost { get => _i_gotovnost; set => _i_gotovnost = value; } public static Byte ots_massiv_NV { get => _i_ots_massiv_NV; set => _i_ots_massiv_NV = value; } public static Byte rejim_nav { get => _i_rejim_nav; set => _i_rejim_nav = value; } public static UInt16 Dostovernost { get { _dostovernost = (UInt16)(_d_kren); _dostovernost |= (UInt16)(_d_tangaj << 1); _dostovernost |= (UInt16)(_d_kurs << 2); _dostovernost |= (UInt16)(_d_usX << 3); _dostovernost |= (UInt16)(_d_usY << 4); _dostovernost |= (UInt16)(_d_usZ << 5); _dostovernost |= (UInt16)(_d_uskX << 6); _dostovernost |= (UInt16)(_d_uskY << 7); _dostovernost |= (UInt16)(_d_uskZ << 8); return _dostovernost; } set { _dostovernost = value; _d_kren = (UInt16)(value & 0x01); _d_tangaj = (UInt16)((value & 0x0002) >> 1); _d_kurs = (UInt16)((value & 0x0004) >> 2); _d_usX = (UInt16)((value & 0x0008) >> 3); _d_usY = (UInt16)((value & 0x0010) >> 4); _d_usZ = (UInt16)((value & 0x0020) >> 5); _d_uskX = (UInt16)((value & 0x0040) >> 6); _d_uskY = (UInt16)((value & 0x0080) >> 7); _d_uskZ = (UInt16)((value & 0x0100) >> 8); } } public static UInt16 d_kren { get => _d_kren; set => _d_kren = value; } public static UInt16 d_tangaj { get => _d_tangaj; set => _d_tangaj = value; } public static UInt16 d_kurs { get => _d_kurs; set => _d_kurs = value; } public static UInt16 d_usX { get => _d_usX; set => _d_usX = value; } public static UInt16 d_usY { get => _d_usY; set => _d_usY = value; } public static UInt16 d_usZ { get => _d_usZ; set => _d_usZ = value; } public static UInt16 d_uskX { get => _d_uskX; set => _d_uskX = value; } public static UInt16 d_uskY { get => _d_uskY; set => _d_uskY = value; } public static UInt16 d_uskZ { get => _d_uskZ; set => _d_uskZ = value; } public static Int16 Kren; public static Int16 Tangaj; public static Int16 Kurs; public static Int16 Vost_sk; public static Int16 Sev_sk; public static Int16 Vert_sk; public static UInt16 Modul_sk; public static Int32 Shirota; public static Int32 Dolgota; public static Int32 Vysota; public static Int16 UsX; public static Int16 UsY; public static Int16 UsZ; public static Int16 UskX; public static Int16 UskY; public static Int16 UskZ; public static UInt32 Time_GPS; public static Int32 Shirota_GPS; public static Int32 Dolgota_GPS; public static Int32 Vysota_GPS; public static UInt16 Put_ugol_GPS; public static Byte Sputnik_GPS; public static Byte Rejim_SNS { get { _rejim_SNS = _rejim_2D; _rejim_SNS |= (Byte)(_rejim_3dfix << 1); _rejim_SNS |= (Byte)(_rejim_RTK << 2); return _rejim_SNS; } set { _rejim_SNS = value; _rejim_2D = (Byte)(value & 0x01); _rejim_3dfix = (Byte)((value & 0x02) >> 1); _rejim_RTK = (Byte)((value & 0x04) >> 2); } } public static Byte rejim_2D { get => _rejim_2D; set => _rejim_2D = value; } public static Byte rejim_3dfix { get => _rejim_3dfix; set => _rejim_3dfix = value; } public static Byte rejim_RTK { get => _rejim_RTK; set => _rejim_RTK = value; } public static UInt16 Kod_Oshibki { get { _kod_oshibki = (UInt16)(_ko_nedop_dvij << 2); _kod_oshibki |= (UInt16)(_ko_sboy << 3); _kod_oshibki |= (UInt16)(_ko_ots_dannyh_sns << 4); _kod_oshibki |= (UInt16)(_ko_ots_dannyh_bch << 5); _kod_oshibki |= (UInt16)(_ko_prev_dop_gyro << 6); _kod_oshibki |= (UInt16)(_ko_prev_dop << 7); return _kod_oshibki; } set { _kod_oshibki = value; _ko_nedop_dvij = (UInt16)((value & 0x0004) >> 2); _ko_sboy = (UInt16)((value & 0x0008) >> 3); _ko_ots_dannyh_sns = (UInt16)((value & 0x0010) >> 4); _ko_ots_dannyh_bch = (UInt16)((value & 0x0020) >> 5); _ko_prev_dop_gyro = (UInt16)((value & 0x0040) >> 6); _ko_prev_dop = (UInt16)((value & 0x0080) >> 7); } } public static UInt16 ko_nedop_dvij { get => _ko_nedop_dvij; set => _ko_nedop_dvij = value; } public static UInt16 ko_sboy { get => _ko_sboy; set => _ko_sboy = value; } public static UInt16 ko_ots_dannyh_sns { get => _ko_ots_dannyh_sns; set => _ko_ots_dannyh_sns = value; } public static UInt16 ko_ots_dannyh_bch { get => _ko_ots_dannyh_bch; set => _ko_ots_dannyh_bch = value; } public static UInt16 ko_prev_dop_gyro { get => _ko_prev_dop_gyro; set => _ko_prev_dop_gyro = value; } public static UInt16 ko_prev_dop { get => _ko_prev_dop; set => _ko_prev_dop = value; } public static Byte[] Data = new Byte[64]; public static void MakeData() { Array.Copy(BitConverter.GetBytes(Start), 0, Data, 0, 1); Array.Copy(BitConverter.GetBytes(InfoWord), 0, Data, 1, 1); Array.Copy(BitConverter.GetBytes(Dostovernost), 0, Data, 2, 2); Array.Copy(BitConverter.GetBytes(Kren), 0, Data, 4, 2); Array.Copy(BitConverter.GetBytes(Tangaj), 0, Data, 6, 2); Array.Copy(BitConverter.GetBytes(Kurs), 0, Data, 8, 2); Array.Copy(BitConverter.GetBytes(Vost_sk), 0, Data, 10, 2); Array.Copy(BitConverter.GetBytes(Sev_sk), 0, Data, 12, 2); Array.Copy(BitConverter.GetBytes(Vert_sk), 0, Data, 14, 2); Array.Copy(BitConverter.GetBytes(Modul_sk), 0, Data, 16, 2); Array.Copy(BitConverter.GetBytes(Shirota), 0, Data, 18, 4); Array.Copy(BitConverter.GetBytes(Dolgota), 0, Data, 22, 4); Array.Copy(BitConverter.GetBytes(Vysota), 0, Data, 26, 4); Array.Copy(BitConverter.GetBytes(UsX), 0, Data, 30, 2); Array.Copy(BitConverter.GetBytes(UsY), 0, Data, 32, 2); Array.Copy(BitConverter.GetBytes(UsZ), 0, Data, 34, 2); Array.Copy(BitConverter.GetBytes(UskX), 0, Data, 36, 2); Array.Copy(BitConverter.GetBytes(UskY), 0, Data, 38, 2); Array.Copy(BitConverter.GetBytes(UskZ), 0, Data, 40, 2); Array.Copy(BitConverter.GetBytes(Time_GPS), 0, Data, 42, 4); Array.Copy(BitConverter.GetBytes(Shirota_GPS), 0, Data, 46, 4); Array.Copy(BitConverter.GetBytes(Dolgota_GPS), 0, Data, 50, 4); Array.Copy(BitConverter.GetBytes(Vysota_GPS), 0, Data, 54, 4); Array.Copy(BitConverter.GetBytes(Put_ugol_GPS), 0, Data, 58, 2); Array.Copy(BitConverter.GetBytes(Sputnik_GPS), 0, Data, 60, 1); Array.Copy(BitConverter.GetBytes(Rejim_SNS), 0, Data, 61, 1); Array.Copy(BitConverter.GetBytes(Kod_Oshibki), 0, Data, 62, 2); } public static void GetData() { /* Start = Data[0]; Address = (UInt16)(Data[2] << 8 | Data[1]); Code = Data[3]; Lenght = BitConverter.ToUInt16(Data, 4); Id_Pack = BitConverter.ToUInt16(Data, 6); Schetchik = BitConverter.ToUInt32(Data, 8); InfoWord = Data[12]; Time_Sys = BitConverter.ToUInt32(Data, 13); Time_Nav = BitConverter.ToUInt32(Data, 27); Dostovernost = BitConverter.ToUInt16(Data, 21); Kren = BitConverter.ToInt16(Data, 23); Tangaj = BitConverter.ToInt16(Data, 25); Kurs = BitConverter.ToInt16(Data, 27); Vost_sk = BitConverter.ToInt16(Data, 29); Sev_sk = BitConverter.ToInt16(Data, 31); Vert_sk = BitConverter.ToInt16(Data, 33); Modul_sk = BitConverter.ToUInt16(Data, 35); Shirota = BitConverter.ToInt32(Data, 37); Dolgota = BitConverter.ToInt32(Data, 41); Vysota = BitConverter.ToInt32(Data, 45); UsX = BitConverter.ToInt16(Data, 49); UsY = BitConverter.ToInt16(Data, 51); UsZ = BitConverter.ToInt16(Data, 53); UskX = BitConverter.ToInt16(Data, 55); UskY = BitConverter.ToInt16(Data, 57); UskZ = BitConverter.ToInt16(Data, 59); Time_GPS = BitConverter.ToUInt32(Data, 61); Shirota_GPS = BitConverter.ToInt32(Data, 65); Dolgota_GPS = BitConverter.ToInt32(Data, 69); Vysota_GPS = BitConverter.ToInt32(Data, 73); Put_ugol_GPS = BitConverter.ToUInt16(Data, 77); Sputnik_GPS = Data[79]; Rejim_SNS = Data[80]; Kod_Oshibki = BitConverter.ToUInt16(Data, 81); CRC16 = BitConverter.ToUInt16(Data, 83); */ } public static void ClearData() { for (int i = 0; i < Data.Length; i++) Data[i] = 0; } } /// /// Новый класс пакет 0322 в БОН /// public static class TOBON0322 { private const UInt16 _len_pack = 74; private static UInt16 _len_data = _len_pack - 8; private static UInt16 _len_crc = _len_pack - 2; private static UInt16 _num_pack = 2; private static UInt16 _dir_pack = 2; private static UInt16 _addr_pack = 3; private static UInt16 _id_pack = 0x0322; private static UInt32 _schetchik; private static UInt16 _infoword = 0; private static UInt16 _i_vstr_kontr = 0; private static UInt16 _i_neispr_bon = 0; private static UInt16 _i_vystavka = 0; private static UInt16 _i_gotovnost = 0; private static UInt16 _i_ots_massiv_NV = 0; private static UInt16 _i_rejim_nav = 0; private static UInt16 _i_korr_nosit = 0; private static UInt16 _i_korr_sns = 0; private static UInt32 _time_sys; private static UInt32 _time_nav; private static UInt16 _dostovernost = 0; private static UInt16 _d_kren_tangaj = 0; private static UInt16 _d_kurs = 0; private static UInt16 _d_ugl_sk = 0; private static UInt16 _d_lin_usk = 0; private static UInt16 _d_in_coord = 0; private static UInt16 _d_baro = 0; private static UInt16 _d_inerc_sk = 0; private static UInt16 _d_vrem_rabot = 0; private static Int16 _kren; private static Int16 _tangaj; private static Int16 _kurs; private static Int16 _vost_sk; private static Int16 _sev_sk; private static Int16 _vert_sk; private static UInt16 _modul_sk; private static Int32 _shirota; private static Int32 _dolgota; private static Int32 _vysota; private static Int32 _vysota_baro; private static Int16 _usx; private static Int16 _usy; private static Int16 _usz; private static Int16 _uskx; private static Int16 _usky; private static Int16 _uskz; private static UInt16 _kod_oshibki; private static UInt16 _ko_nedop_dvij; private static UInt16 _ko_sboy; private static UInt16 _ko_ots_dannyh_sns; private static UInt16 _ko_ots_dannyh_bch; private static UInt16 _ko_prev_dop_gyro; private static UInt16 _ko_prev_dop_axel; private static Int32 _vremya_ustar; private static UInt16 _CRC16; public static Byte Start = CONST.STARTTOBON0322; public static UInt16 Address = (UInt16)CONST.ADDR.addrBVM | (UInt16)CONST.ADDR.addrOES | (UInt16)CONST.ADDR.addrPR | (UInt16)CONST.ADDR.addrPU; public static Byte Code = (Byte)CONST.CODE.msgRECEIVE_DATA; public static UInt16 Lenght { get => _len_data; set => _len_data = value; } /// /// Идентификатор пакета /// public static UInt16 Id_Pack { get { _id_pack = (ushort)(_addr_pack << 8); _id_pack |= (ushort)(_dir_pack << 4); _id_pack |= (ushort)_num_pack; return _id_pack; } set { _id_pack = value; _num_pack = (Byte)(value & 0x000F); _dir_pack = (Byte)((value & 0x00F0) >> 4); _addr_pack = (Byte)((value & 0xFF00) >> 8); } } public static UInt16 num_pack { get => _num_pack; set => _num_pack = value; } public static UInt16 dir_pack1 { get => _dir_pack; set => _dir_pack = value; } public static UInt16 addr_pack { get => _addr_pack; set => _addr_pack = value; } /// /// Счетчик /// public static UInt32 Schetchik { get => _schetchik; set => _schetchik = value; } /// /// Слово информационное /// public static UInt16 InfoWord { get { _infoword = (UInt16)(_i_vstr_kontr << 0); _infoword |= (UInt16)(_i_neispr_bon << 1); _infoword |= (UInt16)(_i_vystavka << 2); _infoword |= (UInt16)(_i_gotovnost << 3); _infoword |= (UInt16)(_i_ots_massiv_NV << 4); _infoword |= (UInt16)(_i_rejim_nav << 5); _infoword |= (UInt16)(_i_korr_nosit << 6); _infoword |= (UInt16)(_i_korr_sns << 7); return _infoword; } set { _infoword = value; _i_vstr_kontr = (UInt16)(value & 0x01 >> 0); _i_neispr_bon = (UInt16)((value & 0x02) >> 1); _i_vystavka = (UInt16)((value & 0x04) >> 2); _i_gotovnost = (UInt16)((value & 0x08) >> 3); _i_ots_massiv_NV = (UInt16)((value & 0x10) >> 4); _i_rejim_nav = (UInt16)((value & 0x20) >> 5); _i_korr_nosit = (UInt16)((value & 0x40) >> 6); _i_korr_sns = (UInt16)((value & 0x80) >> 7); } } public static UInt16 I_vstr_kontr { get => _i_vstr_kontr; set => _i_vstr_kontr = value; } public static UInt16 I_neispr_bon { get => _i_neispr_bon; set => _i_neispr_bon = value; } public static UInt16 I_vystavka { get => _i_vystavka; set => _i_vystavka = value; } public static UInt16 I_gotovnost { get => _i_gotovnost; set => _i_gotovnost = value; } public static UInt16 I_ots_massiv_NV { get => _i_ots_massiv_NV; set => _i_ots_massiv_NV = value; } public static UInt16 I_rejim_nav { get => _i_rejim_nav; set => _i_rejim_nav = value; } public static UInt16 I_korr_nosit { get => _i_korr_nosit; set => _i_korr_nosit = value; } public static UInt16 I_korr_sns { get => _i_korr_sns; set => _i_korr_sns = value; } /// /// Время с подачи питания /// public static UInt32 Time_Sys { get => _time_sys; set => _time_sys = value; } /// /// Время в режме навигация /// public static UInt32 Time_Nav { get => _time_nav; set => _time_nav = value; } /// /// Достоверность данных /// public static UInt16 Dostovernost { get { _dostovernost = (UInt16)(_d_kren_tangaj); _dostovernost |= (UInt16)(_d_kurs << 1); _dostovernost |= (UInt16)(_d_ugl_sk << 2); _dostovernost |= (UInt16)(_d_lin_usk << 3); _dostovernost |= (UInt16)(_d_in_coord << 4); _dostovernost |= (UInt16)(_d_baro << 5); _dostovernost |= (UInt16)(_d_inerc_sk << 6); _dostovernost |= (UInt16)(_d_vrem_rabot << 7); return _dostovernost; } set { _dostovernost = value; _d_kren_tangaj = (UInt16)((value & 0x0001) >> 0); _d_kurs = (UInt16)((value & 0x0002) >> 1); _d_ugl_sk = (UInt16)((value & 0x0004) >> 2); _d_lin_usk = (UInt16)((value & 0x0008) >> 3); _d_in_coord = (UInt16)((value & 0x0010) >> 4); _d_baro = (UInt16)((value & 0x0020) >> 5); _d_inerc_sk = (UInt16)((value & 0x0040) >> 6); _d_vrem_rabot = (UInt16)((value & 0x0080) >> 7); } } public static UInt16 D_kren_tangaj { get => _d_kren_tangaj; set => _d_kren_tangaj = value; } public static UInt16 D_kurs { get => _d_kurs; set => _d_kurs = value; } public static UInt16 D_ugl_sk { get => _d_ugl_sk; set => _d_ugl_sk = value; } public static UInt16 D_lin_usk { get => _d_lin_usk; set => _d_lin_usk = value; } public static UInt16 D_in_coord { get => _d_in_coord; set => _d_in_coord = value; } public static UInt16 D_baro { get => _d_baro; set => _d_baro = value; } public static UInt16 D_inerc_sk { get => _d_inerc_sk; set => _d_inerc_sk = value; } public static UInt16 D_vrem_rabot { get => _d_vrem_rabot; set => _d_vrem_rabot = value; } public static Int16 Kren { get => _kren; set => _kren = value; } public static Int16 Tangaj { get => _tangaj; set => _tangaj = value; } public static Int16 Kurs { get => _kurs; set => _kurs = value; } public static Int16 Vost_sk { get => _vost_sk; set => _vost_sk = value; } public static Int16 Sev_sk { get => _sev_sk; set => _sev_sk = value; } public static Int16 Vert_sk { get => _vert_sk; set => _vert_sk = value; } public static UInt16 Modul_sk { get => _modul_sk; set => _modul_sk = value; } public static Int32 Shirota { get => _shirota; set => _shirota = value; } public static Int32 Dolgota { get => _dolgota; set => _dolgota = value; } public static Int32 Vysota { get => _vysota; set => _vysota = value; } public static Int32 Vysota_baro { get => _vysota_baro; set => _vysota_baro = value; } public static Int16 UsX { get => _usx; set => _usx = value; } public static Int16 UsY { get => _usy; set => _usy = value; } public static Int16 UsZ { get => _usz; set => _usz = value; } public static Int16 UskX { get => _uskx; set => _uskx = value; } public static Int16 UskY { get => _usky; set => _usky = value; } public static Int16 UskZ { get => _uskz; set => _uskz = value; } /// /// Код ошибки БИНС /// public static UInt16 Kod_Oshibki { get { _kod_oshibki = (UInt16)(_ko_nedop_dvij << 2); _kod_oshibki |= (UInt16)(_ko_sboy << 3); _kod_oshibki |= (UInt16)(_ko_ots_dannyh_sns << 4); _kod_oshibki |= (UInt16)(_ko_ots_dannyh_bch << 5); _kod_oshibki |= (UInt16)(_ko_prev_dop_gyro << 6); _kod_oshibki |= (UInt16)(_ko_prev_dop_axel << 7); return _kod_oshibki; } set { _kod_oshibki = value; _ko_nedop_dvij = (UInt16)((value & 0x0004) >> 2); _ko_sboy = (UInt16)((value & 0x0008) >> 3); _ko_ots_dannyh_sns = (UInt16)((value & 0x0010) >> 4); _ko_ots_dannyh_bch = (UInt16)((value & 0x0020) >> 5); _ko_prev_dop_gyro = (UInt16)((value & 0x0040) >> 6); _ko_prev_dop_axel = (UInt16)((value & 0x0080) >> 7); } } public static UInt16 Ko_nedop_dvij { get => _ko_nedop_dvij; set => _ko_nedop_dvij = value; } public static UInt16 Ko_sboy { get => _ko_sboy; set => _ko_sboy = value; } public static UInt16 Ko_ots_dannyh_sns { get => _ko_ots_dannyh_sns; set => _ko_ots_dannyh_sns = value; } public static UInt16 Ko_ots_dannyh_bch { get => _ko_ots_dannyh_bch; set => _ko_ots_dannyh_bch = value; } public static UInt16 Ko_prev_dop_gyro { get => _ko_prev_dop_gyro; set => _ko_prev_dop_gyro = value; } public static UInt16 Ko_prev_dop_axel { get => _ko_prev_dop_axel; set => _ko_prev_dop_axel = value; } /// /// Время устаревания информации от комплекса /// public static Int32 Vremya_ustar { get => _vremya_ustar; set => _vremya_ustar = value; } public static UInt16 CRC16; public static Byte[] Data = new Byte[_len_pack]; /// /// Функция формирования массива с пакетом /// public static void MakeData() { Array.Copy(BitConverter.GetBytes(Start), 0, Data, 0, 1); Array.Copy(BitConverter.GetBytes(Address), 0, Data, 1, 2); Array.Copy(BitConverter.GetBytes(Code), 0, Data, 3, 1); Array.Copy(BitConverter.GetBytes(Lenght), 0, Data, 4, 2); Array.Copy(BitConverter.GetBytes(Id_Pack), 0, Data, 6, 2); Array.Copy(BitConverter.GetBytes(Schetchik), 0, Data, 8, 4); Array.Copy(BitConverter.GetBytes(InfoWord), 0, Data, 12, 2); Array.Copy(BitConverter.GetBytes(Time_Sys), 0, Data, 14, 4); Array.Copy(BitConverter.GetBytes(Time_Nav), 0, Data, 18, 4); Array.Copy(BitConverter.GetBytes(Dostovernost), 0, Data, 22, 2); Array.Copy(BitConverter.GetBytes(Kren), 0, Data, 24, 2); Array.Copy(BitConverter.GetBytes(Tangaj), 0, Data, 26, 2); Array.Copy(BitConverter.GetBytes(Kurs), 0, Data, 28, 2); Array.Copy(BitConverter.GetBytes(Vost_sk), 0, Data, 30, 2); Array.Copy(BitConverter.GetBytes(Sev_sk), 0, Data, 32, 2); Array.Copy(BitConverter.GetBytes(Vert_sk), 0, Data, 34, 2); Array.Copy(BitConverter.GetBytes(Modul_sk), 0, Data, 36, 2); Array.Copy(BitConverter.GetBytes(Shirota), 0, Data, 38, 4); Array.Copy(BitConverter.GetBytes(Dolgota), 0, Data, 42, 4); Array.Copy(BitConverter.GetBytes(Vysota), 0, Data, 46, 4); Array.Copy(BitConverter.GetBytes(Vysota_baro), 0, Data, 50, 4); Array.Copy(BitConverter.GetBytes(UsX), 0, Data, 54, 2); Array.Copy(BitConverter.GetBytes(UsY), 0, Data, 56, 2); Array.Copy(BitConverter.GetBytes(UsZ), 0, Data, 58, 2); Array.Copy(BitConverter.GetBytes(UskX), 0, Data, 60, 2); Array.Copy(BitConverter.GetBytes(UskY), 0, Data, 62, 2); Array.Copy(BitConverter.GetBytes(UskZ), 0, Data, 64, 2); Array.Copy(BitConverter.GetBytes(Kod_Oshibki), 0, Data, 66, 2); Array.Copy(BitConverter.GetBytes(Vremya_ustar), 0, Data, 68, 4); UInt16 _crc16 = CONST.CRC16(ref Data, _len_crc); Array.Copy(BitConverter.GetBytes(_crc16), 0, Data, _len_crc, 2); } /// /// Функция извлечения данных из массива /// public static void GetData() { } public static void ClearData() { for (int i = 0; i < Data.Length; i++) Data[i] = 0; } } /// /// Новый класс пакет 0323 в БОН /// public static class TOBON0323 { private const UInt16 _len_pack = 50; private static UInt16 _len_data = _len_pack - 8; private static UInt16 _len_crc = _len_pack - 2; private static Byte _num_pack = 3; private static Byte _dir_pack = 2; private static Byte _addr_pack = 3; private static UInt16 _id_pack = 0x0323; private static UInt32 _schetchik; private static UInt16 _rejim_SNS = 0; private static UInt16 _rejim_2D = 0; private static UInt16 _rejim_3dfix = 0; private static UInt16 _rejim_RTK = 0; private static UInt32 _time_sys; private static UInt32 _time_nav; private static UInt16 _dostovernost = 0; private static UInt16 _d_coord = 0; private static UInt16 _d_vysota = 0; private static UInt16 _d_skorost = 0; private static UInt16 _d_vremya = 0; private static UInt16 _d_gf_sputnik = 0; private static UInt32 _time_sns; private static Int32 _shirota_sns; private static Int32 _dolgota_sns; private static Int32 _vysota_sns; private static UInt16 _put_ugol_sns; private static UInt16 _sputnik_sns; private static Int32 _vremya_ustar; private static UInt16 _CRC16; public static Byte Start = CONST.STARTTOBON0323; public static UInt16 Address = (UInt16)CONST.ADDR.addrBVM | (UInt16)CONST.ADDR.addrOES | (UInt16)CONST.ADDR.addrPR | (UInt16)CONST.ADDR.addrPU; public static Byte Code = (Byte)CONST.CODE.msgRECEIVE_DATA; public static UInt16 Lenght { get => _len_data; set => _len_data = value; } public static UInt16 Id_Pack { get { _id_pack = (ushort)(_addr_pack << 8); _id_pack |= (ushort)(_dir_pack << 4); _id_pack |= (ushort)_num_pack; return _id_pack; } set { _id_pack = value; _num_pack = (Byte)(value & 0x000F); _dir_pack = (Byte)((value & 0x00F0) >> 4); _addr_pack = (Byte)((value & 0xFF00) >> 8); } } public static Byte num_pack { get => _num_pack; set => _num_pack = value; } public static Byte dir_pack1 { get => _dir_pack; set => _dir_pack = value; } public static Byte addr_pack { get => _addr_pack; set => _addr_pack = value; } public static UInt32 Schetchik { get => _schetchik; set => _schetchik = value; } public static UInt16 Rejim_SNS { get { _rejim_SNS = (UInt16)_rejim_2D; _rejim_SNS |= (UInt16)(_rejim_3dfix << 1); _rejim_SNS |= (UInt16)(_rejim_RTK << 2); return _rejim_SNS; } set { _rejim_SNS = (UInt16)(value); _rejim_2D = (UInt16)(value & 0x01); _rejim_3dfix = (UInt16)((value & 0x02) >> 1); _rejim_RTK = (UInt16)((value & 0x04) >> 2); } } public static UInt16 rejim_2D { get => _rejim_2D; set => _rejim_2D = value; } public static UInt16 rejim_3dfix { get => _rejim_3dfix; set => _rejim_3dfix = value; } public static UInt16 rejim_RTK { get => _rejim_RTK; set => _rejim_RTK = value; } /// /// Время с подачи питания /// public static UInt32 Time_Sys { get => _time_sys; set => _time_sys = value; } /// /// Время в режме навигация /// public static UInt32 Time_Nav { get => _time_nav; set => _time_nav = value; } public static UInt16 Dostovernost { get { _dostovernost = (UInt16)(_d_coord); _dostovernost |= (UInt16)(_d_vysota << 1); _dostovernost |= (UInt16)(_d_skorost << 2); _dostovernost |= (UInt16)(_d_vremya << 3); _dostovernost |= (UInt16)(_d_gf_sputnik << 4); return _dostovernost; } set { _dostovernost = value; _d_coord = (UInt16)(value & 0x0001); _d_vysota = (UInt16)((value & 0x0002) >> 1); _d_skorost = (UInt16)((value & 0x0004) >> 2); _d_vremya = (UInt16)((value & 0x0008) >> 3); _d_gf_sputnik = (UInt16)((value & 0x0010) >> 4); } } public static UInt16 D_coord { get => _d_coord; set => _d_coord = value; } public static UInt16 D_vysota { get => _d_vysota; set => _d_vysota = value; } public static UInt16 D_skorost { get => _d_skorost; set => _d_skorost = value; } public static UInt16 D_vremya { get => _d_vremya; set => _d_vremya = value; } public static UInt16 D_gf_sputnik { get => _d_gf_sputnik; set => _d_gf_sputnik = value; } public static UInt32 Time_sns { get => _time_sns; set => _time_sns = value; } public static Int32 Shirota_sns { get => _shirota_sns; set => _shirota_sns = value; } public static Int32 Dolgota_sns { get => _dolgota_sns; set => _dolgota_sns = value; } public static Int32 Vysota_sns { get => _vysota_sns; set => _vysota_sns = value; } public static UInt16 Put_ugol_sns { get => _put_ugol_sns; set => _put_ugol_sns = value; } public static UInt16 Sputnik_sns { get => _sputnik_sns; set => _sputnik_sns = value; } public static Int32 Vremya_ustar { get => _vremya_ustar; set => _vremya_ustar = value; } public static UInt16 CRC16; public static Byte[] Data = new Byte[_len_pack]; /// /// Функция формирования массива с пакетом /// public static void MakeData() { Array.Copy(BitConverter.GetBytes(Start), 0, Data, 0, 1); Array.Copy(BitConverter.GetBytes(Address), 0, Data, 1, 2); Array.Copy(BitConverter.GetBytes(Code), 0, Data, 3, 1); Array.Copy(BitConverter.GetBytes(Lenght), 0, Data, 4, 2); Array.Copy(BitConverter.GetBytes(Id_Pack), 0, Data, 6, 2); Array.Copy(BitConverter.GetBytes(Schetchik), 0, Data, 8, 4); Array.Copy(BitConverter.GetBytes(Rejim_SNS), 0, Data, 12, 2); Array.Copy(BitConverter.GetBytes(Time_Sys), 0, Data, 14, 4); Array.Copy(BitConverter.GetBytes(Time_Nav), 0, Data, 18, 4); Array.Copy(BitConverter.GetBytes(Dostovernost), 0, Data, 22, 2); Array.Copy(BitConverter.GetBytes(Time_sns), 0, Data, 24, 4); Array.Copy(BitConverter.GetBytes(Shirota_sns), 0, Data, 28, 4); Array.Copy(BitConverter.GetBytes(Dolgota_sns), 0, Data, 32, 4); Array.Copy(BitConverter.GetBytes(Vysota_sns), 0, Data, 36, 4); Array.Copy(BitConverter.GetBytes(Put_ugol_sns), 0, Data, 40, 2); Array.Copy(BitConverter.GetBytes(Sputnik_sns), 0, Data, 42, 2); Array.Copy(BitConverter.GetBytes(Vremya_ustar), 0, Data, 44, 2); UInt16 _crc16 = CONST.CRC16(ref Data, _len_crc); Array.Copy(BitConverter.GetBytes(_crc16), 0, Data, _len_crc, 2); } /// /// Функция извлечения данных из массива /// public static void GetData() { Start = Data[0]; Address = (UInt16)(Data[2] << 8 | Data[1]); Code = Data[3]; Lenght = BitConverter.ToUInt16(Data, 4); Id_Pack = BitConverter.ToUInt16(Data, 6); Schetchik = BitConverter.ToUInt32(Data, 8); Rejim_SNS = BitConverter.ToUInt16(Data, 12); Time_Sys = BitConverter.ToUInt32(Data, 14); Time_Nav = BitConverter.ToUInt32(Data, 18); Dostovernost = BitConverter.ToUInt16(Data, 22); Time_sns = BitConverter.ToUInt32(Data, 24); Shirota_sns = BitConverter.ToInt32(Data, 28); Dolgota_sns = BitConverter.ToInt32(Data, 32); Vysota_sns = BitConverter.ToInt32(Data, 36); Put_ugol_sns = BitConverter.ToUInt16(Data, 40); Sputnik_sns = BitConverter.ToUInt16(Data, 42); Vremya_ustar = BitConverter.ToInt32(Data, 44); CRC16 = BitConverter.ToUInt16(Data, 48); } public static void ClearData() { for (int i = 0; i < Data.Length; i++) Data[i] = 0; } } public static class OES2BVM { private const UInt16 _len_pack = 32; private static UInt16 _len_data = _len_pack - 8; private static UInt16 _len_crc = _len_pack - 2; private static Byte _num_pack = 1; private static Byte _dir_pack = 2; private static Byte _addr_pack = 2; private static UInt16 _id_pack = 0x0221; private static UInt16 _rejim = 0; private static UInt16 _r_ioes = 0; private static UInt16 _r_zahvat = 0; private static UInt16 _r_rejimoes = 0; private static UInt16 _r_sostoes = 0; private static UInt16 _r_vsktk = 0; private static UInt16 _r_rks = 0; private static UInt16 _r_eizo_recv = 0; private static UInt16 _r_eizo = 0; public static Byte Start = CONST.START; public static UInt16 Address = (UInt16)CONST.ADDR.addrBVM | (UInt16)CONST.ADDR.addrPU | (UInt16)CONST.ADDR.addrPR; public static Byte Code = (Byte)CONST.CODE.msgRECEIVE_DATA; public static UInt16 Lenght = 24; public static UInt16 Id_Pack { get { _id_pack = (ushort)(_addr_pack << 8); _id_pack |= (ushort)(_dir_pack << 4); _id_pack |= (ushort)_num_pack; return _id_pack; } set { _id_pack = value; _num_pack = (Byte)(value & 0x000F); _dir_pack = (Byte)((value & 0x00F0) >> 4); _addr_pack = (Byte)((value & 0xFF00) >> 8); } } public static Byte num_pack { get => _num_pack; set => _num_pack = value; } public static Byte dir_pack { get => _dir_pack; set => _dir_pack = value; } public static Byte addr_pack { get => _addr_pack; set => _addr_pack = value; } public static UInt32 Schetchik; public static UInt16 Rejim { get { _rejim = (UInt16)(_r_ioes << 0); _rejim |= (UInt16)(_r_zahvat << 1); _rejim |= (UInt16)(_r_rejimoes << 2); _rejim |= (UInt16)(_r_sostoes << 4); _rejim |= (UInt16)(_r_vsktk << 6); _rejim |= (UInt16)(_r_rks << 7); _rejim |= (UInt16)(_r_eizo_recv << 8); _rejim |= (UInt16)(_r_eizo << 9); return _rejim; } set { _rejim = value; _r_ioes = (UInt16)((value & 0x0001) >> 0); _r_zahvat = (UInt16)((value & 0x0002) >> 1); _r_rejimoes = (UInt16)((value & 0x000C) >> 2); _r_sostoes = (UInt16)((value & 0x0030) >> 4); _r_vsktk = (UInt16)((value & 0x0040) >> 6); _r_rks = (UInt16)((value & 0x0080) >> 7); _r_eizo_recv = (UInt16)((value & 0x0100) >> 8); _r_eizo = (UInt16)((value & 0x0200) >> 9); } } public static UInt16 r_ioes { get => _r_ioes; set => _r_ioes = value; } public static UInt16 r_zahvat { get => _r_zahvat; set => _r_zahvat = value; } public static UInt16 r_rejimoes { get => _r_rejimoes; set => _r_rejimoes = value; } public static UInt16 r_sostoes { get => _r_sostoes; set => _r_sostoes = value; } public static UInt16 r_vsktk { get => _r_vsktk; set => _r_vsktk = value; } public static UInt16 r_rks { get => _r_rks; set => _r_rks = value; } public static UInt16 r_eizo_recv { get => _r_eizo_recv; set => _r_eizo_recv = value; } public static UInt16 r_eizo { get => _r_eizo; set => _r_eizo = value; } public static String RejimOES { get { switch (_r_rejimoes) { case 0: return "Ожидание"; case 1: return "Обзор"; case 2: return " АС "; default: return "Ожидание"; } } } public static String SostOES { get { switch (_r_sostoes) { case 0: return "Подготовка"; case 1: return "Работа"; case 2: return "Технология"; case 3: return "Отказ"; default: return "Подготовка"; } } } public static float AZ; public static float UM; public static float usAZ; public static float usUM; public static UInt16 CRC16; public static Byte[] Data = new Byte[_len_pack]; public static void MakeData() { Array.Copy(BitConverter.GetBytes(Start), 0, Data, 0, 1); Array.Copy(BitConverter.GetBytes(Address), 0, Data, 1, 2); Array.Copy(BitConverter.GetBytes(Code), 0, Data, 3, 1); Array.Copy(BitConverter.GetBytes(Lenght), 0, Data, 4, 2); Array.Copy(BitConverter.GetBytes(Id_Pack), 0, Data, 6, 2); Array.Copy(BitConverter.GetBytes(Schetchik), 0, Data, 8, 4); Array.Copy(BitConverter.GetBytes(Rejim), 0, Data, 12, 2); Array.Copy(BitConverter.GetBytes(AZ), 0, Data, 14, 4); Array.Copy(BitConverter.GetBytes(UM), 0, Data, 18, 4); Array.Copy(BitConverter.GetBytes(usAZ), 0, Data, 22, 4); Array.Copy(BitConverter.GetBytes(usUM), 0, Data, 26, 4); UInt16 _crc16 = CONST.CRC16(ref Data, _len_crc); Array.Copy(BitConverter.GetBytes(_crc16), 0, Data, _len_crc, 2); } public static void GetData() { Start = Data[0]; Address = (UInt16)(Data[2] << 8 | Data[1]); Code = Data[3]; Lenght = BitConverter.ToUInt16(Data, 4); Id_Pack = BitConverter.ToUInt16(Data, 6); Schetchik = BitConverter.ToUInt32(Data, 8); Rejim = BitConverter.ToUInt16(Data, 12); AZ = BitConverter.ToSingle(Data, 14); UM = BitConverter.ToSingle(Data, 18); usAZ = BitConverter.ToSingle(Data, 22); usUM = BitConverter.ToSingle(Data, 26); CRC16 = BitConverter.ToUInt16(Data, 30); } public static void ClearData() { for (int i = 0; i < Data.Length; i++) Data[i] = 0; } } public static class BVM2OES { private const UInt16 _len_pack = 60; private static UInt16 _len_data = _len_pack - 8; private static UInt16 _len_crc = _len_pack - 2; private static Byte _num_pack = 1; private static Byte _dir_pack = 1; private static Byte _addr_pack = 2; private static UInt16 _id_pack = 0x0211; private static UInt16 _rejim = 0; private static UInt16 _r_crc = 0; private static UInt16 _r_rejimoes = 0; private static UInt16 _r_tk = 0; private static UInt16 _r_rks = 0; private static UInt16 _r_eizo = 0; public static Byte Start = CONST.START; public static UInt16 Address = (UInt16)CONST.ADDR.addrOES; public static Byte Code = (Byte)CONST.CODE.msgRECEIVE_DATA; public static UInt16 Lenght = 34; public static UInt16 Id_Pack { get { if (_id_pack != 0) { return _id_pack; } _id_pack = (ushort)(_addr_pack << 8); _id_pack |= (ushort)(_dir_pack << 4); _id_pack |= (ushort)_num_pack; return _id_pack; } set { _id_pack = value; _num_pack = (Byte)(value & 0x000F); _dir_pack = (Byte)((value & 0x00F0) >> 4); _addr_pack = (Byte)((value & 0xFF00) >> 8); } } public static Byte num_pack { get => _num_pack; set { _num_pack = value; } } public static Byte dir_pack { get => _dir_pack; set { _dir_pack = value; } } public static Byte addr_pack { get => _addr_pack; set { _addr_pack = value; } } public static UInt32 Schetchik; public static UInt16 Rejim { get { _rejim = 0; _rejim |= (UInt16)(_r_crc << 0); _rejim |= (UInt16)(_r_rejimoes << 1); _rejim |= (UInt16)(_r_tk << 3); _rejim |= (UInt16)(_r_rks << 4); _rejim |= (UInt16)(_r_eizo << 5); return _rejim; } set { _rejim = value; _r_crc = (UInt16)((value & 0x0001) >> 0); _r_rejimoes = (UInt16)((value & 0x0006) >> 1); _r_tk = (UInt16)((value & 0x0008) >> 3); _r_rks = (UInt16)((value & 0x0010) >> 4); _r_eizo = (UInt16)((value & 0x0020) >> 5); } } public static UInt16 r_crc { get => _r_crc; set => _r_crc = value; } public static UInt16 r_rejimoes { get => _r_rejimoes; set => _r_rejimoes = value; } public static UInt16 r_tk { get => _r_tk; set => _r_tk = value; } public static UInt16 r_rks { get => _r_rks; set => _r_rks = value; } public static UInt16 r_eizo { get => _r_eizo; set => _r_eizo = value; } public static String RejimOES { get { switch (_r_rejimoes) { case 0: return "Ожидание"; case 1: return "Обзор"; case 2: return "АС"; default: return "Ожидание"; } } } public static float ustAZ; // Установочные поправки по АЗ public static float ustUM; // Установочные поправки по УМ public static UInt16 X; // Координата центра цели по горизонтали в растре public static UInt16 Y; // Координата центра цели по вертикали в растре public static Byte lx; // Размер цели по горизонтали в растре эталонного изображения public static Byte ly; // Размер цели по вертикали в растре эталонного изображения public static float AZ; // Сигнал управления центром визирования ОЭС public static float UM; // Сигнал управления центром визирования ОЭС public static Int16 Xrks; // Скорректированная координата центра цели по горизонтали public static Int16 Yrks; // Скорректированная координата центра цели по вертикали /// /// новый ПИВ 1.23 /// public static Int32 Shirota; // Широта БЛА public static Int32 Dolgota; // Долгота БЛА public static Int32 Vysota; // Высота БЛА public static Int16 Kren; // Крен БЛА public static Int16 Tangaj; // Тангаж БЛА public static Int16 Kurs; // Курс БЛА public static UInt16 CRC16; public static Byte[] Data = new Byte[_len_pack]; public static void MakeData() { Array.Copy(BitConverter.GetBytes(Start), 0, Data, 0, 1); Array.Copy(BitConverter.GetBytes(Address), 0, Data, 1, 2); Array.Copy(BitConverter.GetBytes(Code), 0, Data, 3, 1); Array.Copy(BitConverter.GetBytes(Lenght), 0, Data, 4, 2); Array.Copy(BitConverter.GetBytes(Id_Pack), 0, Data, 6, 2); Array.Copy(BitConverter.GetBytes(Schetchik), 0, Data, 8, 4); Array.Copy(BitConverter.GetBytes(Rejim), 0, Data, 12, 2); Array.Copy(BitConverter.GetBytes(ustAZ), 0, Data, 14, 4); Array.Copy(BitConverter.GetBytes(ustUM), 0, Data, 18, 4); Array.Copy(BitConverter.GetBytes(X), 0, Data, 22, 2); Array.Copy(BitConverter.GetBytes(Y), 0, Data, 24, 2); Array.Copy(BitConverter.GetBytes(lx), 0, Data, 26, 1); Array.Copy(BitConverter.GetBytes(ly), 0, Data, 27, 1); Array.Copy(BitConverter.GetBytes(AZ), 0, Data, 28, 4); Array.Copy(BitConverter.GetBytes(UM), 0, Data, 32, 4); Array.Copy(BitConverter.GetBytes(Xrks), 0, Data, 36, 2); Array.Copy(BitConverter.GetBytes(Yrks), 0, Data, 38, 2); /// /// новый ПИВ 1.23 /// Array.Copy(BitConverter.GetBytes(Shirota), 0, Data, 40, 4); Array.Copy(BitConverter.GetBytes(Dolgota), 0, Data, 44, 4); Array.Copy(BitConverter.GetBytes(Vysota), 0, Data, 48, 4); Array.Copy(BitConverter.GetBytes(Kren), 0, Data, 52, 2); Array.Copy(BitConverter.GetBytes(Tangaj), 0, Data, 54, 2); Array.Copy(BitConverter.GetBytes(Kurs), 0, Data, 56, 2); UInt16 _crc16 = CONST.CRC16(ref Data, _len_crc); Array.Copy(BitConverter.GetBytes(_crc16), 0, Data, _len_crc, 2); } public static void GetData() { Start = Data[0]; Address = (UInt16)(Data[2] << 8 | Data[1]); Code = Data[3]; Lenght = BitConverter.ToUInt16(Data, 4); Id_Pack = BitConverter.ToUInt16(Data, 6); Schetchik = BitConverter.ToUInt32(Data, 8); Rejim = BitConverter.ToUInt16(Data, 12); ustAZ = BitConverter.ToSingle(Data, 14); ustUM = BitConverter.ToSingle(Data, 18); X = BitConverter.ToUInt16(Data, 22); Y = BitConverter.ToUInt16(Data, 24); lx = Data[26]; ly = Data[27]; AZ = BitConverter.ToSingle(Data, 28); UM = BitConverter.ToSingle(Data, 32); Xrks = BitConverter.ToInt16(Data, 36); Yrks = BitConverter.ToInt16(Data, 38); /// /// новый ПИВ 1.23 /// Shirota = BitConverter.ToInt32(Data, 40); Dolgota = BitConverter.ToInt32(Data, 44); Vysota = BitConverter.ToInt32(Data, 48); Kren = BitConverter.ToInt16(Data, 52); Tangaj = BitConverter.ToInt16(Data, 54); Kurs = BitConverter.ToInt16(Data, 56); CRC16 = BitConverter.ToUInt16(Data, 58); } public static void ClearData() { for (int i = 0; i < Data.Length; i++) Data[i] = 0; } } public static class BON2BVM { private static Byte _num_pack = 1; private static Byte _dir_pack = 2; private static Byte _addr_pack = 3; private static UInt16 _id_pack = 0x0321; private static Byte _infoword = 0; private static Byte _i_vstr_kontr = 0; private static Byte _i_neispr_bon = 0; private static Byte _i_vystavka = 0; private static Byte _i_gotovnost = 0; private static Byte _i_ots_massiv_NV = 0; private static Byte _i_rejim_nav = 0; private static UInt16 _dostovernost = 0; private static UInt16 _d_kren = 0; private static UInt16 _d_tangaj = 0; private static UInt16 _d_kurs = 0; private static UInt16 _d_usX = 0; private static UInt16 _d_usY = 0; private static UInt16 _d_usZ = 0; private static UInt16 _d_uskX = 0; private static UInt16 _d_uskY = 0; private static UInt16 _d_uskZ = 0; private static Byte _rejim_SNS = 0; private static Byte _rejim_2D = 0; private static Byte _rejim_3dfix = 0; private static Byte _rejim_RTK = 0; private static UInt16 _kod_oshibki; private static UInt16 _ko_nedop_dvij; private static UInt16 _ko_sboy; private static UInt16 _ko_ots_dannyh_sns; private static UInt16 _ko_ots_dannyh_bch; private static UInt16 _ko_prev_dop_gyro; private static UInt16 _ko_prev_dop; public static Byte Start = CONST.START; public static UInt16 Address = (UInt16)CONST.ADDR.addrBVM | (UInt16)CONST.ADDR.addrOES; public static Byte Code = (Byte)CONST.CODE.msgRECEIVE_DATA; public static UInt16 Lenght = 77; public static UInt16 Id_Pack { get { _id_pack = (ushort)(_addr_pack << 8); _id_pack |= (ushort)(_dir_pack << 4); _id_pack |= (ushort)_num_pack; return _id_pack; } set { _id_pack = value; _num_pack = (Byte)(value & 0x000F); _dir_pack = (Byte)((value & 0x00F0) >> 4); _addr_pack = (Byte)((value & 0xFF00) >> 8); } } public static Byte num_pack { get => _num_pack; set => _num_pack = value; } public static Byte dir_pack1 { get => _dir_pack; set => _dir_pack = value; } public static Byte addr_pack { get => _addr_pack; set => _addr_pack = value; } public static UInt32 Schetchik; public static Byte InfoWord { get { _infoword = (Byte)(_i_vstr_kontr); _infoword |= (Byte)(_i_neispr_bon << 1); _infoword |= (Byte)(_i_vystavka << 2); _infoword |= (Byte)(_i_gotovnost << 3); _infoword |= (Byte)(_i_ots_massiv_NV << 4); _infoword |= (Byte)(_i_rejim_nav << 5); return _infoword; } set { _infoword = value; _i_vstr_kontr = (Byte)(value & 0x01); _i_neispr_bon = (Byte)((value & 0x02) >> 1); _i_vystavka = (Byte)((value & 0x04) >> 2); _i_gotovnost = (Byte)((value & 0x08) >> 3); _i_ots_massiv_NV = (Byte)((value & 0x10) >> 4); _i_rejim_nav = (Byte)((value & 0x20) >> 5); } } public static Byte vstr_kontr { get => _i_vstr_kontr; set => _i_vstr_kontr = value; } public static Byte neispr_bon { get => _i_neispr_bon; set => _i_neispr_bon = value; } public static Byte vystavka { get => _i_vystavka; set => _i_vystavka = value; } public static Byte gotovnost { get => _i_gotovnost; set => _i_gotovnost = value; } public static Byte ots_massiv_NV { get => _i_ots_massiv_NV; set => _i_ots_massiv_NV = value; } public static Byte rejim_nav { get => _i_rejim_nav; set => _i_rejim_nav = value; } public static UInt32 Time_Sys; public static UInt32 Time_Nav; public static UInt16 Dostovernost { get { _dostovernost = (UInt16)(_d_kren); _dostovernost |= (UInt16)(_d_tangaj << 1); _dostovernost |= (UInt16)(_d_kurs << 2); _dostovernost |= (UInt16)(_d_usX << 3); _dostovernost |= (UInt16)(_d_usY << 4); _dostovernost |= (UInt16)(_d_usZ << 5); _dostovernost |= (UInt16)(_d_uskX << 6); _dostovernost |= (UInt16)(_d_uskY << 7); _dostovernost |= (UInt16)(_d_uskZ << 8); return _dostovernost; } set { _dostovernost = value; _d_kren = (UInt16)(value & 0x01); _d_tangaj = (UInt16)((value & 0x0002) >> 1); _d_kurs = (UInt16)((value & 0x0004) >> 2); _d_usX = (UInt16)((value & 0x0008) >> 3); _d_usY = (UInt16)((value & 0x0010) >> 4); _d_usZ = (UInt16)((value & 0x0020) >> 5); _d_uskX = (UInt16)((value & 0x0040) >> 6); _d_uskY = (UInt16)((value & 0x0080) >> 7); _d_uskZ = (UInt16)((value & 0x0100) >> 8); } } public static UInt16 d_kren { get => _d_kren; set => _d_kren = value; } public static UInt16 d_tangaj { get => _d_tangaj; set => _d_tangaj = value; } public static UInt16 d_kurs { get => _d_kurs; set => _d_kurs = value; } public static UInt16 d_usX { get => _d_usX; set => _d_usX = value; } public static UInt16 d_usY { get => _d_usY; set => _d_usY = value; } public static UInt16 d_usZ { get => _d_usZ; set => _d_usZ = value; } public static UInt16 d_uskX { get => _d_uskX; set => _d_uskX = value; } public static UInt16 d_uskY { get => _d_uskY; set => _d_uskY = value; } public static UInt16 d_uskZ { get => _d_uskZ; set => _d_uskZ = value; } public static Int16 Kren; public static Int16 Tangaj; public static Int16 Kurs; public static Int16 Vost_sk; public static Int16 Sev_sk; public static Int16 Vert_sk; public static UInt16 Modul_sk; public static Int32 Shirota; public static Int32 Dolgota; public static Int32 Vysota; public static Int16 UsX; public static Int16 UsY; public static Int16 UsZ; public static Int16 UskX; public static Int16 UskY; public static Int16 UskZ; public static UInt32 Time_GPS; public static Int32 Shirota_GPS; public static Int32 Dolgota_GPS; public static Int32 Vysota_GPS; public static UInt16 Put_ugol_GPS; public static Byte Sputnik_GPS; public static Byte Rejim_SNS { get { _rejim_SNS = _rejim_2D; _rejim_SNS |= (Byte)(_rejim_3dfix << 1); _rejim_SNS |= (Byte)(_rejim_RTK << 2); return _rejim_SNS; } set { _rejim_SNS = value; _rejim_2D = (Byte)(value & 0x01); _rejim_3dfix = (Byte)((value & 0x02) >> 1); _rejim_RTK = (Byte)((value & 0x04) >> 2); } } public static Byte rejim_2D { get => _rejim_2D; set => _rejim_2D = value; } public static Byte rejim_3dfix { get => _rejim_3dfix; set => _rejim_3dfix = value; } public static Byte rejim_RTK { get => _rejim_RTK; set => _rejim_RTK = value; } public static UInt16 Kod_Oshibki { get { _kod_oshibki = (UInt16)(_ko_nedop_dvij << 2); _kod_oshibki |= (UInt16)(_ko_sboy << 3); _kod_oshibki |= (UInt16)(_ko_ots_dannyh_sns << 4); _kod_oshibki |= (UInt16)(_ko_ots_dannyh_bch << 5); _kod_oshibki |= (UInt16)(_ko_prev_dop_gyro << 6); _kod_oshibki |= (UInt16)(_ko_prev_dop << 7); return _kod_oshibki; } set { _kod_oshibki = value; _ko_nedop_dvij = (UInt16)((value & 0x0004) >> 2); _ko_sboy = (UInt16)((value & 0x0008) >> 3); _ko_ots_dannyh_sns = (UInt16)((value & 0x0010) >> 4); _ko_ots_dannyh_bch = (UInt16)((value & 0x0020) >> 5); _ko_prev_dop_gyro = (UInt16)((value & 0x0040) >> 6); _ko_prev_dop = (UInt16)((value & 0x0080) >> 7); } } public static UInt16 ko_nedop_dvij { get => _ko_nedop_dvij; set => _ko_nedop_dvij = value; } public static UInt16 ko_sboy { get => _ko_sboy; set => _ko_sboy = value; } public static UInt16 ko_ots_dannyh_sns { get => _ko_ots_dannyh_sns; set => _ko_ots_dannyh_sns = value; } public static UInt16 ko_ots_dannyh_bch { get => _ko_ots_dannyh_bch; set => _ko_ots_dannyh_bch = value; } public static UInt16 ko_prev_dop_gyro { get => _ko_prev_dop_gyro; set => _ko_prev_dop_gyro = value; } public static UInt16 ko_prev_dop { get => _ko_prev_dop; set => _ko_prev_dop = value; } public static UInt16 CRC16; public static Byte[] Data = new Byte[85]; public static void MakeData() { Array.Copy(BitConverter.GetBytes(Start), 0, Data, 0, 1); Array.Copy(BitConverter.GetBytes(Address), 0, Data, 1, 2); Array.Copy(BitConverter.GetBytes(Code), 0, Data, 3, 1); Array.Copy(BitConverter.GetBytes(Lenght), 0, Data, 4, 2); Array.Copy(BitConverter.GetBytes(Id_Pack), 0, Data, 6, 2); Array.Copy(BitConverter.GetBytes(Schetchik), 0, Data, 8, 4); Array.Copy(BitConverter.GetBytes(InfoWord), 0, Data, 12, 1); Array.Copy(BitConverter.GetBytes(Time_Sys), 0, Data, 13, 4); Array.Copy(BitConverter.GetBytes(Time_Nav), 0, Data, 17, 4); Array.Copy(BitConverter.GetBytes(Dostovernost), 0, Data, 21, 2); Array.Copy(BitConverter.GetBytes(Kren), 0, Data, 23, 2); Array.Copy(BitConverter.GetBytes(Tangaj), 0, Data, 25, 2); Array.Copy(BitConverter.GetBytes(Kurs), 0, Data, 27, 2); Array.Copy(BitConverter.GetBytes(Vost_sk), 0, Data, 29, 2); Array.Copy(BitConverter.GetBytes(Sev_sk), 0, Data, 31, 2); Array.Copy(BitConverter.GetBytes(Vert_sk), 0, Data, 33, 2); Array.Copy(BitConverter.GetBytes(Modul_sk), 0, Data, 35, 2); Array.Copy(BitConverter.GetBytes(Shirota), 0, Data, 37, 4); Array.Copy(BitConverter.GetBytes(Dolgota), 0, Data, 41, 4); Array.Copy(BitConverter.GetBytes(Vysota), 0, Data, 45, 4); Array.Copy(BitConverter.GetBytes(UsX), 0, Data, 49, 2); Array.Copy(BitConverter.GetBytes(UsY), 0, Data, 51, 2); Array.Copy(BitConverter.GetBytes(UsZ), 0, Data, 53, 2); Array.Copy(BitConverter.GetBytes(UskX), 0, Data, 55, 2); Array.Copy(BitConverter.GetBytes(UskY), 0, Data, 57, 2); Array.Copy(BitConverter.GetBytes(UskZ), 0, Data, 59, 2); Array.Copy(BitConverter.GetBytes(Time_GPS), 0, Data, 61, 4); Array.Copy(BitConverter.GetBytes(Shirota_GPS), 0, Data, 65, 4); Array.Copy(BitConverter.GetBytes(Dolgota_GPS), 0, Data, 69, 4); Array.Copy(BitConverter.GetBytes(Vysota_GPS), 0, Data, 73, 4); Array.Copy(BitConverter.GetBytes(Put_ugol_GPS), 0, Data, 77, 2); Array.Copy(BitConverter.GetBytes(Sputnik_GPS), 0, Data, 79, 1); Array.Copy(BitConverter.GetBytes(Rejim_SNS), 0, Data, 80, 1); Array.Copy(BitConverter.GetBytes(Kod_Oshibki), 0, Data, 81, 2); UInt16 _crc16 = CONST.CRC16(ref Data, 83); Array.Copy(BitConverter.GetBytes(_crc16), 0, Data, 83, 2); } public static void GetData() { Start = Data[0]; Address = (UInt16)(Data[2] << 8 | Data[1]); Code = Data[3]; Lenght = BitConverter.ToUInt16(Data, 4); Id_Pack = BitConverter.ToUInt16(Data, 6); Schetchik = BitConverter.ToUInt32(Data, 8); InfoWord = Data[12]; Time_Sys = BitConverter.ToUInt32(Data, 13); Time_Nav = BitConverter.ToUInt32(Data, 17); Dostovernost = BitConverter.ToUInt16(Data, 21); Kren = BitConverter.ToInt16(Data, 23); Tangaj = BitConverter.ToInt16(Data, 25); Kurs = BitConverter.ToInt16(Data, 27); Vost_sk = BitConverter.ToInt16(Data, 29); Sev_sk = BitConverter.ToInt16(Data, 31); Vert_sk = BitConverter.ToInt16(Data, 33); Modul_sk = BitConverter.ToUInt16(Data, 35); Shirota = BitConverter.ToInt32(Data, 37); Dolgota = BitConverter.ToInt32(Data, 41); Vysota = BitConverter.ToInt32(Data, 45); UsX = BitConverter.ToInt16(Data, 49); UsY = BitConverter.ToInt16(Data, 51); UsZ = BitConverter.ToInt16(Data, 53); UskX = BitConverter.ToInt16(Data, 55); UskY = BitConverter.ToInt16(Data, 57); UskZ = BitConverter.ToInt16(Data, 59); Time_GPS = BitConverter.ToUInt32(Data, 61); Shirota_GPS = BitConverter.ToInt32(Data, 65); Dolgota_GPS = BitConverter.ToInt32(Data, 69); Vysota_GPS = BitConverter.ToInt32(Data, 73); Put_ugol_GPS = BitConverter.ToUInt16(Data, 77); Sputnik_GPS = Data[79]; Rejim_SNS = Data[80]; Kod_Oshibki = BitConverter.ToUInt16(Data, 81); CRC16 = BitConverter.ToUInt16(Data, 83); } public static void ClearData() { for (int i = 0; i < Data.Length; i++) Data[i] = 0; } } /// /// Новый класс пакет обмена данных ИНС от БОН /// public static class BONINS2BVM { private const UInt16 _len_pack = 74; private static UInt16 _len_data = _len_pack - 8; private static UInt16 _len_crc = _len_pack - 2; private static Byte _num_pack = 2; private static Byte _dir_pack = 2; private static Byte _addr_pack = 3; private static UInt16 _id_pack = 0x0322; private static UInt32 _schetchik; private static UInt16 _infoword = 0; private static UInt16 _i_vstr_kontr = 0; private static UInt16 _i_neispr_bon = 0; private static UInt16 _i_vystavka = 0; private static UInt16 _i_gotovnost = 0; private static UInt16 _i_ots_massiv_NV = 0; private static UInt16 _i_rejim_nav = 0; private static UInt16 _i_korr_nosit = 0; private static UInt16 _i_korr_sns = 0; private static UInt32 _time_sys; private static UInt32 _time_nav; private static UInt16 _dostovernost = 0; private static UInt16 _d_kren_tangaj = 0; private static UInt16 _d_kurs = 0; private static UInt16 _d_ugl_sk = 0; private static UInt16 _d_lin_usk = 0; private static UInt16 _d_in_coord = 0; private static UInt16 _d_baro = 0; private static UInt16 _d_inerc_sk = 0; private static UInt16 _d_vrem_rabot = 0; private static Int16 _kren; private static Int16 _tangaj; private static Int16 _kurs; private static Int16 _vost_sk; private static Int16 _sev_sk; private static Int16 _vert_sk; private static UInt16 _modul_sk; private static Int32 _shirota; private static Int32 _dolgota; private static Int32 _vysota; private static Int32 _vysota_baro; private static Int16 _usx; private static Int16 _usy; private static Int16 _usz; private static Int16 _uskx; private static Int16 _usky; private static Int16 _uskz; private static UInt16 _kod_oshibki; private static UInt16 _ko_nedop_dvij; private static UInt16 _ko_sboy; private static UInt16 _ko_ots_dannyh_sns; private static UInt16 _ko_ots_dannyh_bch; private static UInt16 _ko_prev_dop_gyro; private static UInt16 _ko_prev_dop; private static Int32 _vremya_ustar; private static UInt16 _CRC16; public static Byte Start = CONST.START; public static UInt16 Address = (UInt16)CONST.ADDR.addrBVM | (UInt16)CONST.ADDR.addrOES | (UInt16)CONST.ADDR.addrPR | (UInt16)CONST.ADDR.addrPU; public static Byte Code = (Byte)CONST.CODE.msgRECEIVE_DATA; public static UInt16 Lenght { get => _len_data; set => _len_data = value; } /// /// Идентификатор пакета /// public static UInt16 Id_Pack { get { _id_pack = (ushort)(_addr_pack << 8); _id_pack |= (ushort)(_dir_pack << 4); _id_pack |= (ushort)_num_pack; return _id_pack; } set { _id_pack = value; _num_pack = (Byte)(value & 0x000F); _dir_pack = (Byte)((value & 0x00F0) >> 4); _addr_pack = (Byte)((value & 0xFF00) >> 8); } } public static Byte num_pack { get => _num_pack; set => _num_pack = value; } public static Byte dir_pack1 { get => _dir_pack; set => _dir_pack = value; } public static Byte addr_pack { get => _addr_pack; set => _addr_pack = value; } /// /// Счетчик /// public static UInt32 Schetchik { get => _schetchik; set => _schetchik = value; } /// /// Слово информационное /// public static UInt16 InfoWord { get { _infoword = (UInt16)(_i_vstr_kontr << 0); _infoword |= (UInt16)(_i_neispr_bon << 1); _infoword |= (UInt16)(_i_vystavka << 2); _infoword |= (UInt16)(_i_gotovnost << 3); _infoword |= (UInt16)(_i_ots_massiv_NV << 4); _infoword |= (UInt16)(_i_rejim_nav << 5); _infoword |= (UInt16)(_i_korr_nosit << 6); _infoword |= (UInt16)(_i_korr_sns << 7); return _infoword; } set { _infoword = value; _i_vstr_kontr = (UInt16)(value & 0x01 >> 0); _i_neispr_bon = (UInt16)((value & 0x02) >> 1); _i_vystavka = (UInt16)((value & 0x04) >> 2); _i_gotovnost = (UInt16)((value & 0x08) >> 3); _i_ots_massiv_NV = (UInt16)((value & 0x10) >> 4); _i_rejim_nav = (UInt16)((value & 0x20) >> 5); _i_korr_nosit = (UInt16)((value & 0x40) >> 6); _i_korr_sns = (UInt16)((value & 0x80) >> 7); } } public static UInt16 I_vstr_kontr { get => _i_vstr_kontr; set => _i_vstr_kontr = value; } public static UInt16 I_neispr_bon { get => _i_neispr_bon; set => _i_neispr_bon = value; } public static UInt16 I_vystavka { get => _i_vystavka; set => _i_vystavka = value; } public static UInt16 I_gotovnost { get => _i_gotovnost; set => _i_gotovnost = value; } public static UInt16 I_ots_massiv_NV { get => _i_ots_massiv_NV; set => _i_ots_massiv_NV = value; } public static UInt16 I_rejim_nav { get => _i_rejim_nav; set => _i_rejim_nav = value; } public static UInt16 I_korr_nosit { get => _i_korr_nosit; set => _i_korr_nosit = value; } public static UInt16 I_korr_sns { get => _i_korr_sns; set => _i_korr_sns = value; } /// /// Время с подачи питания /// public static UInt32 Time_Sys { get => _time_sys; set => _time_sys = value; } /// /// Время в режме навигация /// public static UInt32 Time_Nav { get => _time_nav; set => _time_nav = value; } /// /// Достоверность данных /// public static UInt16 Dostovernost { get { _dostovernost = (UInt16)(_d_kren_tangaj); _dostovernost |= (UInt16)(_d_kurs << 1); _dostovernost |= (UInt16)(_d_ugl_sk << 2); _dostovernost |= (UInt16)(_d_lin_usk << 3); _dostovernost |= (UInt16)(_d_in_coord << 4); _dostovernost |= (UInt16)(_d_baro << 5); _dostovernost |= (UInt16)(_d_inerc_sk << 6); _dostovernost |= (UInt16)(_d_vrem_rabot << 7); return _dostovernost; } set { _dostovernost = value; _d_kren_tangaj = (UInt16)((value & 0x0001) >> 0); _d_kurs = (UInt16)((value & 0x0002) >> 1); _d_ugl_sk = (UInt16)((value & 0x0004) >> 2); _d_lin_usk = (UInt16)((value & 0x0008) >> 3); _d_in_coord = (UInt16)((value & 0x0010) >> 4); _d_baro = (UInt16)((value & 0x0020) >> 5); _d_inerc_sk = (UInt16)((value & 0x0040) >> 6); _d_vrem_rabot = (UInt16)((value & 0x0080) >> 7); } } public static UInt16 D_kren_tangaj { get => _d_kren_tangaj; set => _d_kren_tangaj = value; } public static UInt16 D_kurs { get => _d_kurs; set => _d_kurs = value; } public static UInt16 D_ugl_sk { get => _d_ugl_sk; set => _d_ugl_sk = value; } public static UInt16 D_lin_usk { get => _d_lin_usk; set => _d_lin_usk = value; } public static UInt16 D_in_coord { get => _d_in_coord; set => _d_in_coord = value; } public static UInt16 D_baro { get => _d_baro; set => _d_baro = value; } public static UInt16 D_inerc_sk { get => _d_inerc_sk; set => _d_inerc_sk = value; } public static UInt16 D_vrem_rabot { get => _d_vrem_rabot; set => _d_vrem_rabot = value; } public static Int16 Kren { get => _kren; set => _kren = value; } public static Int16 Tangaj { get => _tangaj; set => _tangaj = value; } public static Int16 Kurs { get => _kurs; set => _kurs = value; } public static Int16 Vost_sk { get => _vost_sk; set => _vost_sk = value; } public static Int16 Sev_sk { get => _sev_sk; set => _sev_sk = value; } public static Int16 Vert_sk { get => _vert_sk; set => _vert_sk = value; } public static UInt16 Modul_sk { get => _modul_sk; set => _modul_sk = value; } public static Int32 Shirota { get => _shirota; set => _shirota = value; } public static Int32 Dolgota { get => _dolgota; set => _dolgota = value; } public static Int32 Vysota { get => _vysota; set => _vysota = value; } public static Int32 Vysota_baro { get => _vysota_baro; set => _vysota_baro = value; } public static Int16 UsX { get => _usx; set => _usx = value; } public static Int16 UsY { get => _usy; set => _usy = value; } public static Int16 UsZ { get => _usz; set => _usz = value; } public static Int16 UskX { get => _uskx; set => _uskx = value; } public static Int16 UskY { get => _usky; set => _usky = value; } public static Int16 UskZ { get => _uskz; set => _uskz = value; } /// /// Код ошибки БИНС /// public static UInt16 Kod_Oshibki { get { _kod_oshibki = (UInt16)(_ko_nedop_dvij << 2); _kod_oshibki |= (UInt16)(_ko_sboy << 3); _kod_oshibki |= (UInt16)(_ko_ots_dannyh_sns << 4); _kod_oshibki |= (UInt16)(_ko_ots_dannyh_bch << 5); _kod_oshibki |= (UInt16)(_ko_prev_dop_gyro << 6); _kod_oshibki |= (UInt16)(_ko_prev_dop << 7); return _kod_oshibki; } set { _kod_oshibki = value; _ko_nedop_dvij = (UInt16)((value & 0x0004) >> 2); _ko_sboy = (UInt16)((value & 0x0008) >> 3); _ko_ots_dannyh_sns = (UInt16)((value & 0x0010) >> 4); _ko_ots_dannyh_bch = (UInt16)((value & 0x0020) >> 5); _ko_prev_dop_gyro = (UInt16)((value & 0x0040) >> 6); _ko_prev_dop = (UInt16)((value & 0x0080) >> 7); } } public static UInt16 Ko_nedop_dvij { get => _ko_nedop_dvij; set => _ko_nedop_dvij = value; } public static UInt16 Ko_sboy { get => _ko_sboy; set => _ko_sboy = value; } public static UInt16 Ko_ots_dannyh_sns { get => _ko_ots_dannyh_sns; set => _ko_ots_dannyh_sns = value; } public static UInt16 Ko_ots_dannyh_bch { get => _ko_ots_dannyh_bch; set => _ko_ots_dannyh_bch = value; } public static UInt16 Ko_prev_dop_gyro { get => _ko_prev_dop_gyro; set => _ko_prev_dop_gyro = value; } public static UInt16 Ko_prev_dop_axel { get => _ko_prev_dop; set => _ko_prev_dop = value; } /// /// Время устаревания информации от комплекса /// public static Int32 Vremya_ustar { get => _vremya_ustar; set => _vremya_ustar = value; } public static UInt16 CRC16; public static Byte[] Data = new Byte[_len_pack]; public static UInt16 CalcCRC() { return CONST.CRC16(ref Data, _len_crc); } /// /// Функция формирования массива с пакетом /// public static void MakeData() { Array.Copy(BitConverter.GetBytes(Start), 0, Data, 0, 1); Array.Copy(BitConverter.GetBytes(Address), 0, Data, 1, 2); Array.Copy(BitConverter.GetBytes(Code), 0, Data, 3, 1); Array.Copy(BitConverter.GetBytes(Lenght), 0, Data, 4, 2); Array.Copy(BitConverter.GetBytes(Id_Pack), 0, Data, 6, 2); Array.Copy(BitConverter.GetBytes(Schetchik), 0, Data, 8, 4); Array.Copy(BitConverter.GetBytes(InfoWord), 0, Data, 12, 2); Array.Copy(BitConverter.GetBytes(Time_Sys), 0, Data, 14, 4); Array.Copy(BitConverter.GetBytes(Time_Nav), 0, Data, 18, 4); Array.Copy(BitConverter.GetBytes(Dostovernost), 0, Data, 22, 2); Array.Copy(BitConverter.GetBytes(Kren), 0, Data, 24, 2); Array.Copy(BitConverter.GetBytes(Tangaj), 0, Data, 26, 2); Array.Copy(BitConverter.GetBytes(Kurs), 0, Data, 28, 2); Array.Copy(BitConverter.GetBytes(Vost_sk), 0, Data, 30, 2); Array.Copy(BitConverter.GetBytes(Sev_sk), 0, Data, 32, 2); Array.Copy(BitConverter.GetBytes(Vert_sk), 0, Data, 34, 2); Array.Copy(BitConverter.GetBytes(Modul_sk), 0, Data, 36, 2); Array.Copy(BitConverter.GetBytes(Shirota), 0, Data, 38, 4); Array.Copy(BitConverter.GetBytes(Dolgota), 0, Data, 42, 4); Array.Copy(BitConverter.GetBytes(Vysota), 0, Data, 46, 4); Array.Copy(BitConverter.GetBytes(Vysota_baro), 0, Data, 50, 4); Array.Copy(BitConverter.GetBytes(UsX), 0, Data, 54, 2); Array.Copy(BitConverter.GetBytes(UsY), 0, Data, 56, 2); Array.Copy(BitConverter.GetBytes(UsZ), 0, Data, 58, 2); Array.Copy(BitConverter.GetBytes(UskX), 0, Data, 60, 2); Array.Copy(BitConverter.GetBytes(UskY), 0, Data, 62, 2); Array.Copy(BitConverter.GetBytes(UskZ), 0, Data, 64, 2); Array.Copy(BitConverter.GetBytes(Kod_Oshibki), 0, Data, 66, 2); Array.Copy(BitConverter.GetBytes(Vremya_ustar), 0, Data, 68, 4); UInt16 _crc16 = CONST.CRC16(ref Data, _len_crc); Array.Copy(BitConverter.GetBytes(_crc16), 0, Data, _len_crc, 2); } /// /// Функция извлечения данных из массива /// public static void GetData() { Start = Data[0]; Address = (UInt16)(Data[2] << 8 | Data[1]); Code = Data[3]; Lenght = BitConverter.ToUInt16(Data, 4); Id_Pack = BitConverter.ToUInt16(Data, 6); Schetchik = BitConverter.ToUInt32(Data, 8); InfoWord = Data[12]; Time_Sys = BitConverter.ToUInt32(Data, 14); Time_Nav = BitConverter.ToUInt32(Data, 18); Dostovernost = BitConverter.ToUInt16(Data, 22); Kren = BitConverter.ToInt16(Data, 24); Tangaj = BitConverter.ToInt16(Data, 26); Kurs = BitConverter.ToInt16(Data, 28); Vost_sk = BitConverter.ToInt16(Data, 30); Sev_sk = BitConverter.ToInt16(Data, 32); Vert_sk = BitConverter.ToInt16(Data, 34); Modul_sk = BitConverter.ToUInt16(Data, 36); Shirota = BitConverter.ToInt32(Data, 38); Dolgota = BitConverter.ToInt32(Data, 42); Vysota = BitConverter.ToInt32(Data, 46); Vysota_baro = BitConverter.ToInt32(Data, 50); UsX = BitConverter.ToInt16(Data, 54); UsY = BitConverter.ToInt16(Data, 56); UsZ = BitConverter.ToInt16(Data, 58); UskX = BitConverter.ToInt16(Data, 60); UskY = BitConverter.ToInt16(Data, 62); UskZ = BitConverter.ToInt16(Data, 64); Kod_Oshibki = BitConverter.ToUInt16(Data, 66); Vremya_ustar = BitConverter.ToInt32(Data, 68); CRC16 = BitConverter.ToUInt16(Data, 72); } public static void ClearData() { for (int i = 0; i < Data.Length; i++) Data[i] = 0; } } /// /// Новый класс пакет обмена данных СНС от БОН /// public static class BONSNS2BVM { private const UInt16 _len_pack = 50; private static UInt16 _len_data = _len_pack - 8; private static UInt16 _len_crc = _len_pack - 2; private static Byte _num_pack = 3; private static Byte _dir_pack = 2; private static Byte _addr_pack = 3; private static UInt16 _id_pack = 0x0323; private static UInt32 _schetchik; private static UInt16 _rejim_SNS = 0; private static UInt16 _rejim_2D = 0; private static UInt16 _rejim_3dfix = 0; private static UInt16 _rejim_RTK = 0; private static UInt32 _time_sys; private static UInt32 _time_nav; private static UInt16 _dostovernost = 0; private static UInt16 _d_coord = 0; private static UInt16 _d_vysota = 0; private static UInt16 _d_skorost = 0; private static UInt16 _d_vremya = 0; private static UInt16 _d_gf_sputnik = 0; private static UInt32 _time_sns; private static Int32 _shirota_sns; private static Int32 _dolgota_sns; private static Int32 _vysota_sns; private static UInt16 _put_ugol_sns; private static UInt16 _sputnik_sns; private static Int32 _vremya_ustar; private static UInt16 _CRC16; public static Byte Start = CONST.START; public static UInt16 Address = (UInt16)CONST.ADDR.addrBVM | (UInt16)CONST.ADDR.addrOES | (UInt16)CONST.ADDR.addrPR | (UInt16)CONST.ADDR.addrPU; public static Byte Code = (Byte)CONST.CODE.msgRECEIVE_DATA; public static UInt16 Lenght { get => _len_data; set => _len_data = value; } public static UInt16 Id_Pack { get { _id_pack = (ushort)(_addr_pack << 8); _id_pack |= (ushort)(_dir_pack << 4); _id_pack |= (ushort)_num_pack; return _id_pack; } set { _id_pack = value; _num_pack = (Byte)(value & 0x000F); _dir_pack = (Byte)((value & 0x00F0) >> 4); _addr_pack = (Byte)((value & 0xFF00) >> 8); } } public static Byte num_pack { get => _num_pack; set => _num_pack = value; } public static Byte dir_pack1 { get => _dir_pack; set => _dir_pack = value; } public static Byte addr_pack { get => _addr_pack; set => _addr_pack = value; } public static UInt32 Schetchik { get => _schetchik; set => _schetchik = value; } public static UInt16 Rejim_SNS { get { _rejim_SNS = (UInt16)_rejim_2D; _rejim_SNS |= (UInt16)(_rejim_3dfix << 1); _rejim_SNS |= (UInt16)(_rejim_RTK << 2); return _rejim_SNS; } set { _rejim_SNS = (UInt16)(value); _rejim_2D = (UInt16)(value & 0x01); _rejim_3dfix = (UInt16)((value & 0x02) >> 1); _rejim_RTK = (UInt16)((value & 0x04) >> 2); } } public static UInt16 rejim_2D { get => _rejim_2D; set => _rejim_2D = value; } public static UInt16 rejim_3dfix { get => _rejim_3dfix; set => _rejim_3dfix = value; } public static UInt16 rejim_RTK { get => _rejim_RTK; set => _rejim_RTK = value; } /// /// Время с подачи питания /// public static UInt32 Time_Sys { get => _time_sys; set => _time_sys = value; } /// /// Время в режме навигация /// public static UInt32 Time_Nav { get => _time_nav; set => _time_nav = value; } public static UInt16 Dostovernost { get { _dostovernost = (UInt16)(_d_coord); _dostovernost |= (UInt16)(_d_vysota << 1); _dostovernost |= (UInt16)(_d_skorost << 2); _dostovernost |= (UInt16)(_d_vremya << 3); _dostovernost |= (UInt16)(_d_gf_sputnik << 4); return _dostovernost; } set { _dostovernost = value; _d_coord = (UInt16)(value & 0x0001); _d_vysota = (UInt16)((value & 0x0002) >> 1); _d_skorost = (UInt16)((value & 0x0004) >> 2); _d_vremya = (UInt16)((value & 0x0008) >> 3); _d_gf_sputnik = (UInt16)((value & 0x0010) >> 4); } } public static UInt16 D_coord { get => _d_coord; set => _d_coord = value; } public static UInt16 D_vysota { get => _d_vysota; set => _d_vysota = value; } public static UInt16 D_skorost { get => _d_skorost; set => _d_skorost = value; } public static UInt16 D_vremya { get => _d_vremya; set => _d_vremya = value; } public static UInt16 D_gf_sputnik { get => _d_gf_sputnik; set => _d_gf_sputnik = value; } public static UInt32 Time_sns { get => _time_sns; set => _time_sns = value; } public static Int32 Shirota_sns { get => _shirota_sns; set => _shirota_sns = value; } public static Int32 Dolgota_sns { get => _dolgota_sns; set => _dolgota_sns = value; } public static Int32 Vysota_sns { get => _vysota_sns; set => _vysota_sns = value; } public static UInt16 Put_ugol_sns { get => _put_ugol_sns; set => _put_ugol_sns = value; } public static UInt16 Sputnik_sns { get => _sputnik_sns; set => _sputnik_sns = value; } public static Int32 Vremya_ustar { get => _vremya_ustar; set => _vremya_ustar = value; } public static UInt16 CRC16; public static Byte[] Data = new Byte[_len_pack]; public static UInt16 CalcCRC() { return CONST.CRC16(ref Data, _len_crc); } /// /// Функция формирования массива с пакетом /// public static void MakeData() { Array.Copy(BitConverter.GetBytes(Start), 0, Data, 0, 1); Array.Copy(BitConverter.GetBytes(Address), 0, Data, 1, 2); Array.Copy(BitConverter.GetBytes(Code), 0, Data, 3, 1); Array.Copy(BitConverter.GetBytes(Lenght), 0, Data, 4, 2); Array.Copy(BitConverter.GetBytes(Id_Pack), 0, Data, 6, 2); Array.Copy(BitConverter.GetBytes(Schetchik), 0, Data, 8, 4); Array.Copy(BitConverter.GetBytes(Rejim_SNS), 0, Data, 12, 2); Array.Copy(BitConverter.GetBytes(Time_Sys), 0, Data, 14, 4); Array.Copy(BitConverter.GetBytes(Time_Nav), 0, Data, 18, 4); Array.Copy(BitConverter.GetBytes(Dostovernost), 0, Data, 22, 2); Array.Copy(BitConverter.GetBytes(Time_sns), 0, Data, 24, 4); Array.Copy(BitConverter.GetBytes(Shirota_sns), 0, Data, 28, 4); Array.Copy(BitConverter.GetBytes(Dolgota_sns), 0, Data, 32, 4); Array.Copy(BitConverter.GetBytes(Vysota_sns), 0, Data, 36, 4); Array.Copy(BitConverter.GetBytes(Put_ugol_sns), 0, Data, 40, 2); Array.Copy(BitConverter.GetBytes(Sputnik_sns), 0, Data, 42, 2); Array.Copy(BitConverter.GetBytes(Vremya_ustar), 0, Data, 44, 2); UInt16 _crc16 = CONST.CRC16(ref Data, _len_crc); Array.Copy(BitConverter.GetBytes(_crc16), 0, Data, _len_crc, 2); } /// /// Функция извлечения данных из массива /// public static void GetData() { Start = Data[0]; Address = (UInt16)(Data[2] << 8 | Data[1]); Code = Data[3]; Lenght = BitConverter.ToUInt16(Data, 4); Id_Pack = BitConverter.ToUInt16(Data, 6); Schetchik = BitConverter.ToUInt32(Data, 8); Rejim_SNS = BitConverter.ToUInt16(Data, 12); Time_Sys = BitConverter.ToUInt32(Data, 14); Time_Nav = BitConverter.ToUInt32(Data, 18); Dostovernost = BitConverter.ToUInt16(Data, 22); Time_sns = BitConverter.ToUInt32(Data, 24); Shirota_sns = BitConverter.ToInt32(Data, 28); Dolgota_sns = BitConverter.ToInt32(Data, 32); Vysota_sns = BitConverter.ToInt32(Data, 36); Put_ugol_sns = BitConverter.ToUInt16(Data, 40); Sputnik_sns = BitConverter.ToUInt16(Data, 42); Vremya_ustar = BitConverter.ToInt32(Data, 44); CRC16 = BitConverter.ToUInt16(Data, 48); } } /// /// Класс служебных сообщений /// public static class MESS { public static Byte Start = CONST.START; public static UInt16 Address = 0; public static Byte Code = 0; public static UInt16 Lenght = 0; public static UInt16 CRC16; public static Byte[] Data = new Byte[8]; public static UInt16 CalcCRC() { return CONST.CRC16(ref Data, 6); } /// /// Функция формирования массива с пакетом /// public static void MakeData() { Array.Copy(BitConverter.GetBytes(Start), 0, Data, 0, 1); Array.Copy(BitConverter.GetBytes(Address), 0, Data, 1, 2); Array.Copy(BitConverter.GetBytes(Code), 0, Data, 3, 1); Array.Copy(BitConverter.GetBytes(Lenght), 0, Data, 4, 2); UInt16 _crc16 = CONST.CRC16(ref Data, 6); Array.Copy(BitConverter.GetBytes(_crc16), 0, Data, 6, 2); } /// /// Функция извлечения данных из массива /// public static void GetData() { Start = Data[0]; Address = (UInt16)(Data[2] << 8 | Data[1]); Code = Data[3]; Lenght = BitConverter.ToUInt16(Data, 4); CRC16 = BitConverter.ToUInt16(Data, 6); } } /// /// Класс служебных сообщений /// public static class MESS2 { private const UInt16 _len_pack = 10; private static UInt16 _len_data = _len_pack - 8; private static UInt16 _len_crc = _len_pack - 2; private static UInt16 _num_pack = 1; private static UInt16 _dir_pack = 2; private static UInt16 _addr_pack = 3; private static UInt16 _id_pack = 0; public static Byte Start = CONST.START; public static UInt16 Address = 0; public static Byte Code = 0; public static UInt16 Lenght = 2; /// /// Идентификатор пакета /// public static UInt16 Id_Pack { get { _id_pack = (UInt16)(_addr_pack << 8); _id_pack |= (UInt16)(_dir_pack << 4); _id_pack |= (UInt16)_num_pack; return _id_pack; } set { _id_pack = value; _num_pack = (UInt16)(value & 0x000F); _dir_pack = (UInt16)((value & 0x00F0) >> 4); _addr_pack = (UInt16)((value & 0xFF00) >> 8); } } public static UInt16 num_pack { get => _num_pack; set => _num_pack = value; } public static UInt16 dir_pack1 { get => _dir_pack; set => _dir_pack = value; } public static UInt16 addr_pack { get => _addr_pack; set => _addr_pack = value; } public static UInt16 CRC16; public static Byte[] Data = new Byte[_len_pack]; public static UInt16 CalcCRC() { return CONST.CRC16(ref Data, _len_crc); } /// /// Функция формирования массива с пакетом /// public static void MakeData() { Array.Copy(BitConverter.GetBytes(Start), 0, Data, 0, 1); Array.Copy(BitConverter.GetBytes(Address), 0, Data, 1, 2); Array.Copy(BitConverter.GetBytes(Code), 0, Data, 3, 1); Array.Copy(BitConverter.GetBytes(Lenght), 0, Data, 4, 2); Array.Copy(BitConverter.GetBytes(Id_Pack), 0, Data, 6, 2); UInt16 _crc16 = CONST.CRC16(ref Data, _len_crc); Array.Copy(BitConverter.GetBytes(_crc16), 0, Data, _len_crc, 2); } /// /// Функция извлечения данных из массива /// public static void GetData() { Start = Data[0]; Address = (UInt16)(Data[2] << 8 | Data[1]); Code = Data[3]; Lenght = BitConverter.ToUInt16(Data, 4); Id_Pack = BitConverter.ToUInt16(Data, 6); CRC16 = BitConverter.ToUInt16(Data, _len_crc); } public static void ClearData() { for (int i = 0; i < Data.Length; i++) Data[i] = 0; } } /// /// Служебный класс для пересчета угловых координат /// public static class AZUM { /* private static void pix2ang() { //% (x, y) - координаты центра пикселя изображения //% начало O = (0, 0) системы координат изображения находится //% в центре левого верхнего пикселя //% ось OX направлена вправо по возрастанию номеров столбцов //% ось OY направлена вниз по возрастанию номеров строк //% //% w - количество столбцов изображения //% h - количество строк изображения //sAZUM retu; Double w_full = 4072.0; Double h_full = 3064.0; Double focus_meters = 12e-3f; Double pixel_size_meters = 1.55e-6f; Double rad2deg = (180.0 / (Double)Math.PI); Double f = focus_meters / pixel_size_meters; Double xc_full = 0.5f * w_full; Double yc_full = 0.5f * h_full; Double x_full = (_xy.X + 0.5) * w_full / _wh.W; Double y_full = (_xy.Y + 0.5) * h_full / _wh.H; Double x_ohf = x_full - xc_full; Double y_ohf = y_full - yc_full; Double z_ohf = f; Double rho = (Double)Math.Sqrt(x_ohf * x_ohf + z_ohf * z_ohf); _au.A = (Double)Math.Atan2(x_ohf, z_ohf) * rad2deg; _au.U = (Double)(-Math.Atan2(y_ohf, rho) * rad2deg); } private static void ang2pix() { // calc_xy result_; // (x, y) - координаты центра пикселя изображения // начало O = (0, 0) системы координат изображения находится //% в центре левого верхнего пикселя, double //% ось OX направлена вправо по возрастанию номеров столбцов // ось OY направлена вниз по возрастанию номеров строк //% az - азимутальный угол (отсчитывается вправо), градусы, double //% el - угол места (отсчитывается вверх), градусы, double //% w - количество столбцов изображения, double //% h - количество строк изображения, double Double w_full = (Double)(4072); Double h_full = (Double)(3064); Double focus_meters = (Double)(12e-3); Double pixel_size_meters = (Double)(1.55e-6); Double deg2rad = (Double)(Math.PI / 180.0); //% pi = 3.14... //float rad2deg = (180.0f /3.1415926f); Double f = focus_meters / pixel_size_meters; Double xc_full = 0.5 * w_full; Double yc_full = 0.5 * h_full; //_au.A = _au.A * deg2rad; //_au.U = _au.U * deg2rad; //double x_ohf = cos(el) * sin(az); //double z_ohf = cos(el) * cos(az); //double y_ohf = -sin(el); //double x_full = x_ohf / z_ohf * f + xc_full; //double y_full = y_ohf / z_ohf * f + yc_full; Double x_full = xc_full + f * Math.Tan(_au.A * deg2rad); Double y_full = yc_full - f * Math.Tan(_au.U * deg2rad) / Math.Cos(_au.A * deg2rad); _xy.X = x_full * _wh.W / w_full - 0.5; _xy.Y = y_full * _wh.H / h_full - 0.5; } */ public static void pix2ang(ref Double A, ref Double U, Double W, Double H, Double X, Double Y) { //% (x, y) - координаты центра пикселя изображения //% начало O = (0, 0) системы координат изображения находится //% в центре левого верхнего пикселя //% ось OX направлена вправо по возрастанию номеров столбцов //% ось OY направлена вниз по возрастанию номеров строк //% //% w - количество столбцов изображения //% h - количество строк изображения //sAZUM retu; Double w_full = 4072.0; Double h_full = 3064.0; Double focus_meters = 12e-3; Double pixel_size_meters = 1.55e-6; Double rad2deg = (180.0 / (Double)Math.PI); Double f = focus_meters / pixel_size_meters; Double xc_full = 0.5f * w_full; Double yc_full = 0.5f * h_full; Double x_full = (X + 0.5) * w_full / W; Double y_full = (Y + 0.5) * h_full / H; Double x_ohf = x_full - xc_full; Double y_ohf = y_full - yc_full; Double z_ohf = f; Double rho = (Double)Math.Sqrt(x_ohf * x_ohf + z_ohf * z_ohf); A = (Double)Math.Atan2(x_ohf, z_ohf) * rad2deg; U = (Double)(-Math.Atan2(y_ohf, rho) * rad2deg); } public static void pix2ang(ref float A, ref float U, float W, float H, float X, float Y) { //% (x, y) - координаты центра пикселя изображения //% начало O = (0, 0) системы координат изображения находится //% в центре левого верхнего пикселя //% ось OX направлена вправо по возрастанию номеров столбцов //% ось OY направлена вниз по возрастанию номеров строк //% //% w - количество столбцов изображения //% h - количество строк изображения //sAZUM retu; float w_full = (float)4072.0; float h_full = (float)3064.0; float focus_meters = 12e-3F; float pixel_size_meters = 1.55e-6F; float rad2deg = (180.0F / (float)Math.PI); float f = focus_meters / pixel_size_meters; float xc_full = 0.5f * w_full; float yc_full = 0.5f * h_full; float x_full = (float)(X + 0.5) * w_full / W; float y_full = (float)(Y + 0.5) * h_full / H; float x_ohf = x_full - xc_full; float y_ohf = y_full - yc_full; float z_ohf = f; float rho = (float)Math.Sqrt(x_ohf * x_ohf + z_ohf * z_ohf); A = (float)Math.Atan2(x_ohf, z_ohf) * rad2deg; U = (float)(-Math.Atan2(y_ohf, rho) * rad2deg); } public static void ang2pix(ref Double X, ref Double Y, Double W, Double H, Double A, Double U) { // calc_xy result_; // (x, y) - координаты центра пикселя изображения // начало O = (0, 0) системы координат изображения находится //% в центре левого верхнего пикселя, double //% ось OX направлена вправо по возрастанию номеров столбцов // ось OY направлена вниз по возрастанию номеров строк //% az - азимутальный угол (отсчитывается вправо), градусы, double //% el - угол места (отсчитывается вверх), градусы, double //% w - количество столбцов изображения, double //% h - количество строк изображения, double Double w_full = (Double)(4072); Double h_full = (Double)(3064); Double focus_meters = (Double)(12e-3); Double pixel_size_meters = (Double)(1.55e-6); Double deg2rad = (Double)(Math.PI / 180.0); //% pi = 3.14... //float rad2deg = (180.0f /3.1415926f); Double f = focus_meters / pixel_size_meters; Double xc_full = 0.5 * w_full; Double yc_full = 0.5 * h_full; //_au.A = _au.A * deg2rad; //_au.U = _au.U * deg2rad; //double x_ohf = cos(el) * sin(az); //double z_ohf = cos(el) * cos(az); //double y_ohf = -sin(el); //double x_full = x_ohf / z_ohf * f + xc_full; //double y_full = y_ohf / z_ohf * f + yc_full; Double x_full = xc_full + f * Math.Tan(A * deg2rad); Double y_full = yc_full - f * Math.Tan(U * deg2rad) / Math.Cos(A * deg2rad); X = x_full * W / w_full - 0.5; Y = y_full * H / h_full - 0.5; } public static void ang2pix(ref float X, ref float Y, float W, float H, float A, float U) { // calc_xy result_; // (x, y) - координаты центра пикселя изображения // начало O = (0, 0) системы координат изображения находится //% в центре левого верхнего пикселя, double //% ось OX направлена вправо по возрастанию номеров столбцов // ось OY направлена вниз по возрастанию номеров строк //% az - азимутальный угол (отсчитывается вправо), градусы, double //% el - угол места (отсчитывается вверх), градусы, double //% w - количество столбцов изображения, double //% h - количество строк изображения, double float w_full = 4072F; float h_full = 3064F; float focus_meters = 12e-3F; float pixel_size_meters = 1.55e-6F; float deg2rad = (float)(Math.PI / 180.0); //% pi = 3.14... //float rad2deg = (180.0f /3.1415926f); float f = focus_meters / pixel_size_meters; float xc_full = 0.5F * w_full; float yc_full = 0.5F * h_full; //_au.A = _au.A * deg2rad; //_au.U = _au.U * deg2rad; //double x_ohf = cos(el) * sin(az); //double z_ohf = cos(el) * cos(az); //double y_ohf = -sin(el); //double x_full = x_ohf / z_ohf * f + xc_full; //double y_full = y_ohf / z_ohf * f + yc_full; float x_full = xc_full + f * (float)Math.Tan(A * deg2rad); float y_full = yc_full - f * (float)Math.Tan(U * deg2rad) / (float)Math.Cos(A * deg2rad); X = x_full * W / w_full - 0.5F; Y = y_full * H / h_full - 0.5F; } public static Double minmax(Double min, Double max, Double val) { if (val <= min) return min; if (val >= max) return max; return val; } public static float minmax(float min, float max, float val) { if (val <= min) return min; if (val >= max) return max; return val; } public static UInt16 minmax(UInt16 min, UInt16 max, UInt16 val) { if (val <= min) return min; if (val >= max) return max; return val; } public static UInt16 minmaxUS(UInt16 min, UInt16 max, UInt16 val) { if (val <= min) return min; if (val >= max) return max; return val; } } /// /// Класс для разбора заголовка /// public static class HEAD { private static Byte _num_pack = 1; private static Byte _dir_pack = 2; private static Byte _addr_pack = 3; private static UInt16 _id_pack = 0x0321; public static Byte Start = CONST.START; public static UInt16 Address = 0; public static Byte Code = 0; public static UInt16 Lenght = 0; public static UInt16 Id_Pack { get { _id_pack = (ushort)(_addr_pack << 8); _id_pack |= (ushort)(_dir_pack << 4); _id_pack |= (ushort)_num_pack; return _id_pack; } set { _id_pack = value; _num_pack = (Byte)(value & 0x000F); _dir_pack = (Byte)((value & 0x00F0) >> 4); _addr_pack = (Byte)((value & 0xFF00) >> 8); } } public static Byte num_pack { get => _num_pack; } public static Byte dir_pack { get => _dir_pack; } public static Byte addr_pack { get => _addr_pack; } /// /// Функция извлечения данных из массива /// static Byte[] Data = new Byte[8]; public static void GetData(Byte[] arr) { Array.Copy(arr, Data, 8); Start = Data[0]; Address = (UInt16)(Data[2] << 8 | Data[1]); Code = Data[3]; Lenght = BitConverter.ToUInt16(Data, 4); Id_Pack = BitConverter.ToUInt16(Data, 6); } public static void ClearData() { for (int i = 0; i < Data.Length; i++) Data[i] = 0; } } /// /// Новый класс пакет 0322 в БОН /// public static class sTOBON0322 { private const UInt16 _len_pack = 53; // private const UInt16 _len_pack = 49; private static UInt16 _infoword = 0; private static UInt16 _i_vstr_kontr = 0; private static UInt16 _i_neispr_bon = 0; private static UInt16 _i_vystavka = 0; private static UInt16 _i_gotovnost = 0; private static UInt16 _i_ots_massiv_NV = 0; private static UInt16 _i_rejim_nav = 0; private static UInt16 _i_korr_nosit = 0; private static UInt16 _i_korr_sns = 0; private static UInt16 _dostovernost = 0; private static UInt16 _d_kren_tangaj = 0; private static UInt16 _d_kurs = 0; private static UInt16 _d_ugl_sk = 0; private static UInt16 _d_lin_usk = 0; private static UInt16 _d_in_coord = 0; private static UInt16 _d_baro = 0; private static UInt16 _d_inerc_sk = 0; private static UInt16 _d_vrem_rabot = 0; private static Int16 _kren; private static Int16 _tangaj; private static Int16 _kurs; private static Int16 _vost_sk; private static Int16 _sev_sk; private static Int16 _vert_sk; private static UInt16 _modul_sk; private static Int32 _shirota; private static Int32 _dolgota; private static Int32 _vysota; private static Int32 _vysota_baro; private static Int16 _usx; private static Int16 _usy; private static Int16 _usz; private static Int16 _uskx; private static Int16 _usky; private static Int16 _uskz; private static UInt16 _kod_oshibki; private static UInt16 _ko_nedop_dvij; private static UInt16 _ko_sboy; private static UInt16 _ko_ots_dannyh_sns; private static UInt16 _ko_ots_dannyh_bch; private static UInt16 _ko_prev_dop_gyro; private static UInt16 _ko_prev_dop_axel; private static Int32 _vremya_ustar; public static Byte Start = CONST.STARTTOBON0322; /// /// Слово информационное /// public static UInt16 InfoWord { get { _infoword = (UInt16)(_i_vstr_kontr << 0); _infoword |= (UInt16)(_i_neispr_bon << 1); _infoword |= (UInt16)(_i_vystavka << 2); _infoword |= (UInt16)(_i_gotovnost << 3); _infoword |= (UInt16)(_i_ots_massiv_NV << 4); _infoword |= (UInt16)(_i_rejim_nav << 5); _infoword |= (UInt16)(_i_korr_nosit << 6); _infoword |= (UInt16)(_i_korr_sns << 7); return _infoword; } set { _infoword = value; _i_vstr_kontr = (UInt16)(value & 0x01 >> 0); _i_neispr_bon = (UInt16)((value & 0x02) >> 1); _i_vystavka = (UInt16)((value & 0x04) >> 2); _i_gotovnost = (UInt16)((value & 0x08) >> 3); _i_ots_massiv_NV = (UInt16)((value & 0x10) >> 4); _i_rejim_nav = (UInt16)((value & 0x20) >> 5); _i_korr_nosit = (UInt16)((value & 0x40) >> 6); _i_korr_sns = (UInt16)((value & 0x80) >> 7); } } public static UInt16 I_vstr_kontr { get => _i_vstr_kontr; set => _i_vstr_kontr = value; } public static UInt16 I_neispr_bon { get => _i_neispr_bon; set => _i_neispr_bon = value; } public static UInt16 I_vystavka { get => _i_vystavka; set => _i_vystavka = value; } public static UInt16 I_gotovnost { get => _i_gotovnost; set => _i_gotovnost = value; } public static UInt16 I_ots_massiv_NV { get => _i_ots_massiv_NV; set => _i_ots_massiv_NV = value; } public static UInt16 I_rejim_nav { get => _i_rejim_nav; set => _i_rejim_nav = value; } public static UInt16 I_korr_nosit { get => _i_korr_nosit; set => _i_korr_nosit = value; } public static UInt16 I_korr_sns { get => _i_korr_sns; set => _i_korr_sns = value; } /// /// Достоверность данных /// public static UInt16 Dostovernost { get { _dostovernost = (UInt16)(_d_kren_tangaj); _dostovernost |= (UInt16)(_d_kurs << 1); _dostovernost |= (UInt16)(_d_ugl_sk << 2); _dostovernost |= (UInt16)(_d_lin_usk << 3); _dostovernost |= (UInt16)(_d_in_coord << 4); _dostovernost |= (UInt16)(_d_baro << 5); _dostovernost |= (UInt16)(_d_inerc_sk << 6); _dostovernost |= (UInt16)(_d_vrem_rabot << 7); return _dostovernost; } set { _dostovernost = value; _d_kren_tangaj = (UInt16)((value & 0x0001) >> 0); _d_kurs = (UInt16)((value & 0x0002) >> 1); _d_ugl_sk = (UInt16)((value & 0x0004) >> 2); _d_lin_usk = (UInt16)((value & 0x0008) >> 3); _d_in_coord = (UInt16)((value & 0x0010) >> 4); _d_baro = (UInt16)((value & 0x0020) >> 5); _d_inerc_sk = (UInt16)((value & 0x0040) >> 6); _d_vrem_rabot = (UInt16)((value & 0x0080) >> 7); } } public static UInt16 D_kren_tangaj { get => _d_kren_tangaj; set => _d_kren_tangaj = value; } public static UInt16 D_kurs { get => _d_kurs; set => _d_kurs = value; } public static UInt16 D_ugl_sk { get => _d_ugl_sk; set => _d_ugl_sk = value; } public static UInt16 D_lin_usk { get => _d_lin_usk; set => _d_lin_usk = value; } public static UInt16 D_in_coord { get => _d_in_coord; set => _d_in_coord = value; } public static UInt16 D_baro { get => _d_baro; set => _d_baro = value; } public static UInt16 D_inerc_sk { get => _d_inerc_sk; set => _d_inerc_sk = value; } public static UInt16 D_vrem_rabot { get => _d_vrem_rabot; set => _d_vrem_rabot = value; } public static Int16 Kren { get => _kren; set => _kren = value; } public static Int16 Tangaj { get => _tangaj; set => _tangaj = value; } public static Int16 Kurs { get => _kurs; set => _kurs = value; } public static Int16 Vost_sk { get => _vost_sk; set => _vost_sk = value; } public static Int16 Sev_sk { get => _sev_sk; set => _sev_sk = value; } public static Int16 Vert_sk { get => _vert_sk; set => _vert_sk = value; } public static UInt16 Modul_sk { get => _modul_sk; set => _modul_sk = value; } public static Int32 Shirota { get => _shirota; set => _shirota = value; } public static Int32 Dolgota { get => _dolgota; set => _dolgota = value; } public static Int32 Vysota { get => _vysota; set => _vysota = value; } public static Int32 Vysota_baro { get => _vysota_baro; set => _vysota_baro = value; } public static Int16 UsX { get => _usx; set => _usx = value; } public static Int16 UsY { get => _usy; set => _usy = value; } public static Int16 UsZ { get => _usz; set => _usz = value; } public static Int16 UskX { get => _uskx; set => _uskx = value; } public static Int16 UskY { get => _usky; set => _usky = value; } public static Int16 UskZ { get => _uskz; set => _uskz = value; } /// /// Код ошибки БИНС /// public static UInt16 Kod_Oshibki { get { _kod_oshibki = (UInt16)(_ko_nedop_dvij << 2); _kod_oshibki |= (UInt16)(_ko_sboy << 3); _kod_oshibki |= (UInt16)(_ko_ots_dannyh_sns << 4); _kod_oshibki |= (UInt16)(_ko_ots_dannyh_bch << 5); _kod_oshibki |= (UInt16)(_ko_prev_dop_gyro << 6); _kod_oshibki |= (UInt16)(_ko_prev_dop_axel << 7); return _kod_oshibki; } set { _kod_oshibki = value; _ko_nedop_dvij = (UInt16)((value & 0x0004) >> 2); _ko_sboy = (UInt16)((value & 0x0008) >> 3); _ko_ots_dannyh_sns = (UInt16)((value & 0x0010) >> 4); _ko_ots_dannyh_bch = (UInt16)((value & 0x0020) >> 5); _ko_prev_dop_gyro = (UInt16)((value & 0x0040) >> 6); _ko_prev_dop_axel = (UInt16)((value & 0x0080) >> 7); } } public static UInt16 Ko_nedop_dvij { get => _ko_nedop_dvij; set => _ko_nedop_dvij = value; } public static UInt16 Ko_sboy { get => _ko_sboy; set => _ko_sboy = value; } public static UInt16 Ko_ots_dannyh_sns { get => _ko_ots_dannyh_sns; set => _ko_ots_dannyh_sns = value; } public static UInt16 Ko_ots_dannyh_bch { get => _ko_ots_dannyh_bch; set => _ko_ots_dannyh_bch = value; } public static UInt16 Ko_prev_dop_gyro { get => _ko_prev_dop_gyro; set => _ko_prev_dop_gyro = value; } public static UInt16 Ko_prev_dop_axel { get => _ko_prev_dop_axel; set => _ko_prev_dop_axel = value; } /// /// Время устаревания информации от комплекса /// public static Int32 Vremya_ustar { get => _vremya_ustar; set => _vremya_ustar = value; } public static Byte[] Data = new Byte[_len_pack]; /// /// Функция формирования массива с пакетом /// public static void MakeData() { Array.Copy(BitConverter.GetBytes(Start), 0, Data, 0, 1); Array.Copy(BitConverter.GetBytes(InfoWord), 0, Data, 1, 2); Array.Copy(BitConverter.GetBytes(Dostovernost), 0, Data, 3, 2); Array.Copy(BitConverter.GetBytes(Kren), 0, Data, 5, 2); Array.Copy(BitConverter.GetBytes(Tangaj), 0, Data, 7, 2); Array.Copy(BitConverter.GetBytes(Kurs), 0, Data, 9, 2); Array.Copy(BitConverter.GetBytes(Vost_sk), 0, Data, 11, 2); Array.Copy(BitConverter.GetBytes(Sev_sk), 0, Data, 13, 2); Array.Copy(BitConverter.GetBytes(Vert_sk), 0, Data, 15, 2); Array.Copy(BitConverter.GetBytes(Modul_sk), 0, Data, 17, 2); Array.Copy(BitConverter.GetBytes(Shirota), 0, Data, 19, 4); Array.Copy(BitConverter.GetBytes(Dolgota), 0, Data, 23, 4); Array.Copy(BitConverter.GetBytes(Vysota), 0, Data, 27, 4); Array.Copy(BitConverter.GetBytes(Vysota_baro), 0, Data, 31, 4); Array.Copy(BitConverter.GetBytes(UsX), 0, Data, 35, 2); Array.Copy(BitConverter.GetBytes(UsY), 0, Data, 37, 2); Array.Copy(BitConverter.GetBytes(UsZ), 0, Data, 39, 2); Array.Copy(BitConverter.GetBytes(UskX), 0, Data, 41, 2); Array.Copy(BitConverter.GetBytes(UskY), 0, Data, 43, 2); Array.Copy(BitConverter.GetBytes(UskZ), 0, Data, 45, 2); Array.Copy(BitConverter.GetBytes(Kod_Oshibki), 0, Data, 47, 2); Array.Copy(BitConverter.GetBytes(Vremya_ustar), 0, Data, 49, 4); } /// /// Функция извлечения данных из массива /// public static void GetData() { } public static void ClearData() { for (int i = 0; i < Data.Length; i++) Data[i] = 0; } } }