public static uint StartSession(GarminUnit garmin) { Packet p = Packet.CreatePacket(PacketType.USB, (ushort)Protocol.PacketID.StartSession, 0); garmin.Write(p); byte[] buffer; int buffer_size = garmin.Read(out p, out buffer); if (buffer_size == 16) { return(BitConverter.ToUInt32(buffer, 0)); } return(0); }
public static List <T> ReadRecords <T>(GarminUnit garmin, PacketID pid) { List <T> items = new List <T>(); Packet p = Packet.CreatePacket(GSharp.Protocols.PacketType.Application, (ushort)pid, 0); byte[] buffer = new byte[Marshal.SizeOf(typeof(Packet)) + 1024]; ushort expected_items = 0, received_items = 0; bool done = false; if (garmin.Read(out p, out buffer) > 0) { if (p.id == (ushort)PacketID.Records) { expected_items = BitConverter.ToUInt16(buffer, 0); while (!done && garmin.Read(out p, out buffer) > 0) { if (p.id == (ushort)pid) { items.Add(ByteArrayToStructure <T>(buffer)); received_items++; } else if (p.id == (ushort)PacketID.Xfer_Cmplt) { if (received_items != expected_items) { throw new Exception("items received is different from expected items"); } done = true; } else { done = true; } } } } return(items); }
public static Packet MakeCommandPacket(GarminUnit garmin, uint data_length) { return(Packet.CreatePacket(PacketType.Application, (ushort)PacketID.Command_Data, data_length)); }
public static void GetCapability(GarminUnit garmin) { Packet p; bool done = false; p = Packet.CreatePacket(PacketType.Application, (ushort)Protocol.PacketID.ProductRequest, 0); garmin.Write(Protocol.StructureToByteArray <Packet>(p)); byte[] packet_data; while (!done && garmin.Read(out p, out packet_data) > 0) { switch (p.id) { case (ushort)Protocol.PacketID.ProductData: byte[] pdt_array = new byte[4]; Array.Copy(packet_data, pdt_array, 4); int pdt_descr_size = packet_data.Length - 4; byte[] pdt_descr_array = new byte[pdt_descr_size]; Product pdt = Protocol.ByteArrayToStructure <Product>(pdt_array); Array.Copy(packet_data, 4, pdt_descr_array, 0, pdt_descr_size); garmin.SetProductType(pdt, System.Text.ASCIIEncoding.ASCII.GetString(pdt_descr_array)); break; case (ushort)Protocol.PacketID.ExtProductData: var extended_data = System.Text.ASCIIEncoding.ASCII.GetString(packet_data); garmin.SetExtendedDescription(extended_data); break; case (ushort)Protocol.PacketID.ProtocolArray: int size = packet_data.Length / 3; ProtocolDataType[] data_types = new ProtocolDataType[size]; for (int i = 0; i < size; i++) { byte[] temp_buffer = new byte[3]; Array.Copy(packet_data, i * 3, temp_buffer, 0, 3); data_types[i] = ProtocolDataType.GetPacket(temp_buffer); } int j = 0; while (j < size) { switch (data_types[j].Tag) { case Tags.Phys_Prot_Id: garmin.SetCapability("protocol.physical", data_types[j].data); j++; break; case Tags.Link_Prot_Id: garmin.SetCapability("protocol.link", data_types[j].data); j++; break; case Tags.Appl_Prot_Id: application_protocol app = data_types[j].GetApplicationProtocol(); List <garmin_datatype> phys = new List <garmin_datatype>(); for (++j; j < size; j++) { if (data_types[j].Tag != Tags.Data_Type_Id) { Protocol.AssignProtocols(garmin, app, phys); break; } phys.Add(data_types[j].GetDataType()); } break; case Tags.Data_Type_Id: // taken care of in application protocol section break; default: j++; break; } } done = true; break; default: break; } } }