// public static List<T> ReadRuns<T>(GarminUnit garmin) // { // return TransferItems<T>(garmin, (ushort) Command.ID.Transfer_Runs, PacketID.Run); // } public static Type GetProtocolType(GarminUnit garmin, string protocol_name) { ushort protocol = garmin.Configuration[protocol_name]; if (protocol_name.StartsWith("protocol")) { ///TODO: figure out if this needs to be implemented } else if (protocol_name.StartsWith("datatype")) { switch (protocol) { case 304: return(typeof(D304_Trk_Point_Type)); break; case 311: return(typeof(D311_Trk_Hdr_Type)); break; case 906: return(typeof(D906_Lap_Type)); break; case 1000: return(typeof(D1000_Run_Type)); break; case 1001: return(typeof(D1001_Lap_Type)); break; case 1002: return(typeof(D1002_Workout_Type)); break; case 1008: return(typeof(D1008_Workout_Type)); break; case 1009: return(typeof(D1009_Run_Type)); break; case 1015: return(typeof(D1015_Lap_Type)); break; } } return(null); }
public static List <T> TransferItems <T>(GarminUnit garmin, ushort command, PacketID pid) { byte[] buffer = BitConverter.GetBytes(command); Packet p = MakeCommandPacket(garmin, (uint)buffer.Length); garmin.Write(p, buffer); return(ReadRecords <T>(garmin, pid)); }
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); }
internal void InitializeAddIns() { AddinManager.Initialize(); AddinManager.Registry.Update(); foreach (IGarminUnit addin in AddinManager.GetExtensionObjects(typeof(IGarminUnit))) { Console.WriteLine("Finding units of type ", addin.Description); foreach (UsbDevice dev in FindDevices(addin.VID, addin.PID)) { GarminUnit unit = new GarminUnit(dev); unit.Init(); GarminUnits.Add(unit); } } }
public void AddRun(GarminUnit garmin, Run run) { var runs = new Runs() { FirstLapIndex = run.FirstLapIndex, LastLapIndex = run.LastLapIndex, SportType = (int) run.SportType, ProgramType = run.ProgramType, MultiSport = (int) run.MultiSport, // QuickWorkout = (int) run.QuickWorkout, // Workout = (int) run.Workout, // VirtualPartner = (int) run.VirtualPartner }; database.Runs.InsertOnSubmit(runs); database.SubmitChanges(); }
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 void AddLap(GarminUnit garmin, Lap lap) { var l = new Laps() { AvgCadence = lap.AvgCadence, AvgHeartRage = lap.AvgHeartRate, Calories = lap.CaloriesBurned, EndLat = lap.End.lat, EndLon = lap.End.lon, GarminUnit = (int) garmin.ID, Index = lap.Index, Intensity = lap.Intensity, MaxHeartRage = lap.MaxHeartRate, MaxSpeed = lap.MaxSpeed, StartLat = lap.Begin.lat, StartLon = lap.Begin.lon, StartTime = lap.StartTime., TotalDist = lap.TotalDistance, TotalTime = lap.TotalTime, TriggerMethod = lap.TriggerMethod }; database.Laps.InsertOnSubmit(l); database.SubmitChanges(); }
public static void AssignProtocols(GarminUnit garmin, application_protocol protocol, List <garmin_datatype> datatypes) { switch (protocol) { case application_protocol.appl_A010: case application_protocol.appl_A011: garmin.SetCapability("protocol.command", (ushort)protocol); break; case application_protocol.appl_A100: garmin.SetCapability("protocol.waypoint.waypoint", (ushort)protocol); garmin.SetCapability("datatype.waypoint.waypoint", (ushort)datatypes[0]); break; case application_protocol.appl_A101: garmin.SetCapability("protocol.waypoint.category", (ushort)protocol); garmin.SetCapability("datatype.waypoint.category", (ushort)datatypes[0]); break; case application_protocol.appl_A200: garmin.SetCapability("protocol.route", (ushort)protocol); garmin.SetCapability("datatype.route.header", (ushort)datatypes[0]); garmin.SetCapability("datatype.route.waypoint", (ushort)datatypes[1]); break; case application_protocol.appl_A201: garmin.SetCapability("protocol.route", (ushort)protocol); garmin.SetCapability("datatype.route.header", (ushort)datatypes[0]); garmin.SetCapability("datatype.route.waypoint", (ushort)datatypes[1]); garmin.SetCapability("datatype.route.link", (ushort)datatypes[1]); break; case application_protocol.appl_A300: garmin.SetCapability("protocol.track", (ushort)protocol); garmin.SetCapability("datatype.track.data", (ushort)datatypes[0]); break; case application_protocol.appl_A301: garmin.SetCapability("protocol.track", (ushort)protocol); garmin.SetCapability("datatype.track.header", (ushort)datatypes[0]); garmin.SetCapability("datatype.track.data", (ushort)datatypes[1]); break; case application_protocol.appl_A400: garmin.SetCapability("protocol.waypoint.proximity", (ushort)protocol); garmin.SetCapability("datatype.waypoint.proximity", (ushort)datatypes[0]); break; case application_protocol.appl_A500: garmin.SetCapability("protocol.almanac", (ushort)protocol); garmin.SetCapability("datatype.almanac", (ushort)datatypes[0]); break; case application_protocol.appl_A600: garmin.SetCapability("protocol.date_time", (ushort)protocol); garmin.SetCapability("datatype.date_time", (ushort)datatypes[0]); break; case application_protocol.appl_A601: // UNDOCUMENTED break; case application_protocol.appl_A650: garmin.SetCapability("protocol.flightbook", (ushort)protocol); garmin.SetCapability("datatype.flightbook", (ushort)datatypes[0]); break; case application_protocol.appl_A700: garmin.SetCapability("protocol.position", (ushort)protocol); garmin.SetCapability("datatype.position", (ushort)datatypes[0]); break; case application_protocol.appl_A800: garmin.SetCapability("protocol.pvt", (ushort)protocol); garmin.SetCapability("datatype.pvt", (ushort)datatypes[0]); break; case application_protocol.appl_A801: // UNDOCUMENTED break; case application_protocol.appl_A902: // UNDOCUMENTED break; case application_protocol.appl_A903: // UNDOCUMENTED break; case application_protocol.appl_A906: garmin.SetCapability("protocol.lap", (ushort)protocol); garmin.SetCapability("datatype.lap", (ushort)datatypes[0]); break; case application_protocol.appl_A1000: garmin.SetCapability("protocol.run", (ushort)protocol); garmin.SetCapability("datatype.run", (ushort)datatypes[0]); break; case application_protocol.appl_A1002: garmin.SetCapability("protocol.workout.workout", (ushort)protocol); garmin.SetCapability("datatype.workout.workout", (ushort)datatypes[0]); break; case application_protocol.appl_A1003: garmin.SetCapability("protocol.workout.occurrence", (ushort)protocol); garmin.SetCapability("datatype.workout.occurrence", (ushort)datatypes[0]); break; case application_protocol.appl_A1004: garmin.SetCapability("protocol.fitness", (ushort)protocol); garmin.SetCapability("datatype.fitness", (ushort)datatypes[0]); break; case application_protocol.appl_A1005: garmin.SetCapability("protocol.workout.limits", (ushort)protocol); garmin.SetCapability("datatype.workout.limits", (ushort)datatypes[0]); break; case application_protocol.appl_A1006: garmin.SetCapability("protocol.course.course", (ushort)protocol); garmin.SetCapability("datatype.course.course", (ushort)datatypes[0]); break; case application_protocol.appl_A1007: garmin.SetCapability("protocol.course.lap", (ushort)protocol); garmin.SetCapability("datatype.course.lap", (ushort)datatypes[0]); break; case application_protocol.appl_A1008: garmin.SetCapability("protocol.course.point", (ushort)protocol); garmin.SetCapability("datatype.course.point", (ushort)datatypes[0]); break; case application_protocol.appl_A1009: garmin.SetCapability("protocol.course.limits", (ushort)protocol); garmin.SetCapability("datatype.course.limits", (ushort)datatypes[0]); break; case application_protocol.appl_A1012: garmin.SetCapability("protocol.course.track", (ushort)protocol); garmin.SetCapability("datatype.course.track.header", (ushort)datatypes[0]); garmin.SetCapability("datatype.course.track.data", (ushort)datatypes[1]); break; default: break; } }
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; } } }
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; } } }
public bool ContainsRun(GarminUnit garmin, Run run) { if ( database.Runs.Count() == 0 ) return false; var runs = from r in database.Runs where r.GarminDevice == (int) garmin.ID where r.FirstLapIndex == (int) run.FirstLapIndex where r.LastLapIndex == (int) run.LastLapIndex select r; return (runs.Count() > 0); }
public bool ContainsLap(GarminUnit garmin, Lap lap) { if ( database.Laps.Count() == 0 ) return false; var laps = from l in database.Laps where l.GarminUnit == (int) garmin.ID where l.Index == (int) lap.Index select l; return (laps.Count() > 0); }
internal void InitializeAddIns() { AddinManager.Initialize(); AddinManager.Registry.Update(); foreach (IGarminUnit addin in AddinManager.GetExtensionObjects(typeof(IGarminUnit))) { Console.WriteLine("Finding units of type ", addin.Description); foreach ( UsbDevice dev in FindDevices(addin.VID, addin.PID)) { GarminUnit unit = new GarminUnit(dev); unit.Init(); GarminUnits.Add(unit); } } }