using System; using System.Collections.Generic; using System.Text; namespace DirectUSB.VirtualPackets { public class ParameterRequestResponse : VirtualPacket { #region Declarations private List _parameters; #endregion #region Constructors / Teardown public ParameterRequestResponse(byte[] data) : base(0x0008, data) { //Interpret the raw data as a list of parameters _parameters = new List(); int count = (data[0] << 8) | data[1]; int index = 2; for (int i = 0; i < count; i++) { short type = (short)((data[index] << 8) | data[index + 1]); bool valid = data[index + 2] == 0 ? true : false; int length; //Apparently if the valid byte is 0x02, there is no data... if (data[index + 2] != 0x00) length = 0; else length = (data[index + 3] << 8) | data[index + 4]; var d = new byte[length]; for (int j = 0; j < d.Length; j++) d[j] = data[index + 5 + j]; //Apparently if the valid byte is 0x02, there is no size bytes... if (data[index + 2] != 0x00) index += 3; else index += 5 + d.Length; Parameters.Parameter p; switch ((Parameters.Parameter.ParameterType)type) { case DirectUSB.Parameters.Parameter.ParameterType.ProductNumber: { p = new Parameters.ProductNumberParameter(type, valid, d); break; } case DirectUSB.Parameters.Parameter.ParameterType.ProductName: { p = new Parameters.ProductNameParameter(type, valid, d); break; } case DirectUSB.Parameters.Parameter.ParameterType.CalculatorID: case DirectUSB.Parameters.Parameter.ParameterType.FullCalculatorID: { p = new Parameters.CalculatorIdParameter(type, valid, d); break; } case DirectUSB.Parameters.Parameter.ParameterType.HardwareVersion: { p = new Parameters.HardwareVersionParameter(type, valid, d); break; } case DirectUSB.Parameters.Parameter.ParameterType.LanguageId: { p = new Parameters.LanguageIdParameter(type, valid, d); break; } case DirectUSB.Parameters.Parameter.ParameterType.SubLanguageId: { p = new Parameters.SubLanguageIdParameter(type, valid, d); break; } case DirectUSB.Parameters.Parameter.ParameterType.DeviceType: { p = new Parameters.DeviceTypeParameter(type, valid, d); break; } case DirectUSB.Parameters.Parameter.ParameterType.BootVersion: { p = new Parameters.BootVersionParameter(type, valid, d); break; } case DirectUSB.Parameters.Parameter.ParameterType.OSLoaded: { p = new Parameters.OSLoadedParameter(type, valid, d); break; } case DirectUSB.Parameters.Parameter.ParameterType.OSVersion: { p = new Parameters.OSVersionParameter(type, valid, d); break; } case DirectUSB.Parameters.Parameter.ParameterType.RAMPresent: { p = new Parameters.RAMPresentParameter(type, valid, d); break; } case DirectUSB.Parameters.Parameter.ParameterType.RAMAvailable: { p = new Parameters.RAMAvailableParameter(type, valid, d); break; } case DirectUSB.Parameters.Parameter.ParameterType.RAMFree: { p = new Parameters.RAMFreeParameter(type, valid, d); break; } case DirectUSB.Parameters.Parameter.ParameterType.FlashROMPresent: { p = new Parameters.FlashROMPresentParameter(type, valid, d); break; } case DirectUSB.Parameters.Parameter.ParameterType.FlashROMAvailable: { p = new Parameters.FlashROMAvailableParameter(type, valid, d); break; } case DirectUSB.Parameters.Parameter.ParameterType.FlashROMFree: { p = new Parameters.FlashROMFreeParameter(type, valid, d); break; } case DirectUSB.Parameters.Parameter.ParameterType.ApplicationPagesAvailable: { p = new Parameters.ApplicationPagesAvailableParameter(type, valid, d); break; } case DirectUSB.Parameters.Parameter.ParameterType.ApplicationPagesFree: { p = new Parameters.ApplicationPagesFreeParameter(type, valid, d); break; } case DirectUSB.Parameters.Parameter.ParameterType.LCDWidth: { p = new Parameters.LCDWidthParameter(type, valid, d); break; } case DirectUSB.Parameters.Parameter.ParameterType.LCDHeight: { p = new Parameters.LCDHeightParameter(type, valid, d); break; } case DirectUSB.Parameters.Parameter.ParameterType.LCDContents: { p = new Parameters.LCDContentsParameter(type, valid, d); break; } case DirectUSB.Parameters.Parameter.ParameterType.ClockOn: { p = new Parameters.ClockOnParameter(type, valid, d); break; } case DirectUSB.Parameters.Parameter.ParameterType.Time: { p = new Parameters.TimeParameter(type, valid, d); break; } case DirectUSB.Parameters.Parameter.ParameterType.DateFormat: { p = new Parameters.DateFormatParameter(type, valid, d); break; } case DirectUSB.Parameters.Parameter.ParameterType.HourMode: { p = new Parameters.HourModeParameter(type, valid, d); break; } case DirectUSB.Parameters.Parameter.ParameterType.BatteriesGood: { p = new Parameters.BatteriesGoodParameter(type, valid, d); break; } case DirectUSB.Parameters.Parameter.ParameterType.AtHomescreen: { p = new Parameters.AtHomescreenParameter(type, valid, d); break; } case DirectUSB.Parameters.Parameter.ParameterType.ScreenSplit: { p = new Parameters.ScreenSplitParameter(type, valid, d); break; } default: { p = new Parameters.Parameter(type, valid, d); break; } } _parameters.Add(p); } } #endregion #region Public Properties public List Parameters { get { return _parameters; } } #endregion } }