예제 #1
0
 // HidUtility asks if a packet should be requested from the device
 // Request a packet if a packet has been successfully sent to the device before
 public void ReceivePacketHandler(object sender, UsbBuffer InBuffer)
 {
     DebugString              = "Start ReceivePacketHandler";
     WaitingForDevice         = true;
     InBuffer.RequestTransfer = WaitingForDevice;
     DebugString              = "End ReceivePacketHandler";
 }
예제 #2
0
        public int BulkTransfer(UsbTransferDirection direction, byte endpoint, UsbBuffer buffer, int timeout)
        {
            int transferred;

            LibUSBNative.ThrowIfError(LibUSBNative.libusb_bulk_transfer(handle, (byte)(endpoint | (byte)direction), buffer.AsPtr(), buffer.ByteLength, &transferred, (uint)timeout));
            return(transferred);
        }
예제 #3
0
 // HidUtility asks if a packet should be sent to the device
 // Prepare the buffer and request a transfer
 public void SendPacketHandler(object sender, UsbBuffer OutBuffer)
 {
     // Fill entire buffer with 0xFF
     OutBuffer.clear();
     if (ToggleLedPending == true)
     {
         // The first byte is the "Report ID" and does not get sent over the USB bus. Always set = 0.
         OutBuffer.buffer[0] = 0;
         // 0x80 is the "Toggle LED" command in the firmware
         OutBuffer.buffer[1] = 0x80;
         ToggleLedPending    = false;
         LastCommand         = 0x80;
     }
     else if (LastCommand == 0x81)
     {
         // The first byte is the "Report ID" and does not get sent over the USB bus.  Always set = 0.
         OutBuffer.buffer[0] = 0x00;
         // READ_POT command (see the firmware source code), gets 10-bit ADC Value
         OutBuffer.buffer[1] = 0x37;
         LastCommand         = 0x37;
     }
     else
     {
         // The first byte is the "Report ID" and does not get sent over the USB bus.  Always set = 0.
         OutBuffer.buffer[0] = 0x00;
         // 0x81 is the "Get Pushbutton State" command in the firmware
         OutBuffer.buffer[1] = 0x81;
         LastCommand         = 0x81;
     }
     // Request that this buffer be sent
     OutBuffer.RequestTransfer = true;
 }
예제 #4
0
 // HidUtility informs us if the requested transfer was successful and provides us with the received packet
 public void PacketReceivedHandler(object sender, UsbBuffer InBuffer)
 {
     //WriteLog(string.Format("PacketReceivedHandler: {0:X2}", InBuffer.buffer[1]), false);
     WaitingForDevice = false;
     if (InBuffer.buffer[1] == 0x37)
     {
         //Need to reformat the data from two unsigned chars into one unsigned int.
         AdcValue = (uint)(InBuffer.buffer[3] << 8) + InBuffer.buffer[2];
     }
     if (InBuffer.buffer[1] == 0x81)
     {
         if (InBuffer.buffer[2] == 0x01)
         {
             PushbuttonPressed = false;
         }
         if (InBuffer.buffer[2] == 0x00)
         {
             PushbuttonPressed = true;
         }
     }
     if (InBuffer.TransferSuccessful)
     {
         ++RxCount;
     }
     else
     {
         ++RxFailedCount;
     }
 }
예제 #5
0
 //Function to parse packet received over USB
 private void ParseCalibration2(ref UsbBuffer InBuffer)
 {
     OnboardTemperatureCalibration   = new Calibration(InBuffer.buffer, 2);
     ExternalTemperature1Calibration = new Calibration(InBuffer.buffer, 14);
     ExternalTemperature2Calibration = new Calibration(InBuffer.buffer, 26);
     //New calibration is now available
     _NewCalibration2Available = true;
 }
예제 #6
0
 //Function to parse packet received over USB
 private void ParseCalibration1(ref UsbBuffer InBuffer)
 {
     InputVoltageCalibration  = new Calibration(InBuffer.buffer, 2);
     OutputVoltageCalibration = new Calibration(InBuffer.buffer, 14);
     InputCurrentCalibration  = new Calibration(InBuffer.buffer, 26);
     OutputCurrentCalibration = new Calibration(InBuffer.buffer, 38);
     //New calibration is now available
     _NewCalibration1Available = true;
 }
예제 #7
0
 // HidUtility informs us if the requested transfer was successful
 // Schedule to request a packet if the transfer was successful
 public void PacketSentHandler(object sender, UsbBuffer OutBuffer)
 {
     if (LastCommand == 0x80)
     {
         WaitingForDevice = false;
     }
     else
     {
         WaitingForDevice = OutBuffer.TransferSuccessful;
     }
     ++TxCount;
 }
예제 #8
0
        // HidUtility asks if a packet should be sent to the device

        // Prepare the buffer and request a transfer
        public void SendPacketHandler(object sender, UsbBuffer OutBuffer)
        {
            DebugString = "Start SendPacketHandler";
            // Fill entire buffer with 0xFF
            OutBuffer.clear();

            // The first byte is the "Report ID" and does not get sent over the USB bus.  Always set = 0.
            OutBuffer.buffer[0] = 0x00;

            //Prepare data to send
            byte NextPacket;

            if (PacketsToRequest.Count >= 1)
            {
                NextPacket = PacketsToRequest[0];
                PacketsToRequest.RemoveAt(0);
            }
            else
            {
                NextPacket = 0x10;
            }
            OutBuffer.buffer[1] = NextPacket;
            PacketsToRequest.Add(NextPacket);

            int position = 2;

            while ((position <= 64) && (PendingCommands.Count > 0))
            {
                List <byte> CommandBytes = PendingCommands[0].GetByteList();

                //Check if entire command fits into current buffer
                if ((64 - position) >= CommandBytes.Count)
                {
                    foreach (byte b in CommandBytes)
                    {
                        OutBuffer.buffer[position] = b;
                        ++position;
                    }
                    PendingCommands.RemoveAt(0);
                }
                else
                {
                    position += CommandBytes.Count;
                    break;
                }
            }

            //Request the packet to be sent over the bus
            OutBuffer.RequestTransfer = true;
            DebugString = "End SendPacketHandler";
        }
예제 #9
0
 //Function to parse packet received over USB
 private void ParseDisplay2(ref UsbBuffer InBuffer)
 {
     for (int line = 2; line < 4; ++line)
     {
         Display[line] = "";
         for (int c = 0; c < 20; ++c)
         {
             char character = (char)InBuffer.buffer[2 + 20 * (line - 2) + c];
             Display[line] += character.ToString();
         }
     }
     //New display2 data is now available
     _NewDisplay2Available = true;
 }
예제 #10
0
        //Function to parse status packet received over USB
        private void ParseStatus(ref UsbBuffer InBuffer)
        {
            FirmwareMajor = InBuffer.buffer[4];
            FirmwareMinor = InBuffer.buffer[5];
            FirmwareFix   = InBuffer.buffer[6];

            DeviceStatus_SubTimeSlot              = InBuffer.buffer[7];
            DeviceStatus_TimeSlot                 = InBuffer.buffer[8];
            DeviceStatus_Done                     = InBuffer.buffer[9];
            DeviceStatus_LeftEncoderCount         = (sbyte)InBuffer.buffer[10];
            DeviceStatus_LeftEncoderButton        = (sbyte)InBuffer.buffer[11];
            DeviceStatus_RightEncoderCount        = (sbyte)InBuffer.buffer[12];
            DeviceStatus_RightEncoderButton       = (sbyte)InBuffer.buffer[13];
            DeviceStatus_CurrentPositionInSteps   = BitConverter.ToUInt32(InBuffer.buffer, 14);
            DeviceStatus_CurrentPositionInDegrees = BitConverter.ToUInt16(InBuffer.buffer, 18);
            DeviceStatus_DisplayState             = InBuffer.buffer[22];
            DeviceStatus_BeepCount                = InBuffer.buffer[23];
            DeviceStatus_InternalTemperature      = BitConverter.ToInt16(InBuffer.buffer, 24);
            DeviceStatus_ExternalTemperature      = BitConverter.ToInt16(InBuffer.buffer, 26);
            DeviceStatus_FanOn                    = InBuffer.buffer[28];
            DeviceStatus_BrakeOn                  = InBuffer.buffer[29];
            DeviceStatus_Busy                     = InBuffer.buffer[30];
            DeviceStatus_ManualSpeed              = BitConverter.ToUInt16(InBuffer.buffer, 31);
            DeviceStatus_AbsolutePosition         = BitConverter.ToInt16(InBuffer.buffer, 33);

            //42-45:    uint32_t full_circle_in_steps
            //46:       uint8_t inverse_direction
            //47-48:    uint16_t overshoot_in_steps
            //49-50:    uint16_t overshoot_cost_in_steps
            //51-52:    uint16_t minimum_speed
            //53-54:    uint16_t maximum_speed
            //55-56:    uint16_t initial_speed_arc
            //57-58:    uint16_t maximum_speed_arc
            //59-60:    uint16_t initial_speed_manual
            //61-62:    uint16_t maximum_speed_manual
            //63:       uint8_t beep_duration
            DeviceConfig_PositionDisplay180 = (byte)InBuffer.buffer[35];

            DeviceConfig_FullCircleInSteps    = BitConverter.ToUInt32(InBuffer.buffer, 43);
            DeviceConfig_InverseDirection     = InBuffer.buffer[45];
            DeviceConfig_OvershootInSteps     = BitConverter.ToUInt16(InBuffer.buffer, 48);
            DeviceConfig_OvershootCostInSteps = BitConverter.ToUInt16(InBuffer.buffer, 50);
            DeviceConfig_MinimumSpeed         = BitConverter.ToUInt16(InBuffer.buffer, 52);
            DeviceConfig_MaximumSpeed         = BitConverter.ToUInt16(InBuffer.buffer, 54);
            DeviceConfig_InitialSpeedArc      = BitConverter.ToUInt16(InBuffer.buffer, 56);
            DeviceConfig_MaximumSpeedArc      = BitConverter.ToUInt16(InBuffer.buffer, 58);
            DeviceConfig_InitialSpeedManual   = BitConverter.ToUInt16(InBuffer.buffer, 60);
            DeviceConfig_MaximumSpeedManual   = BitConverter.ToUInt16(InBuffer.buffer, 62);
            DeviceConfig_BeepDuration         = InBuffer.buffer[49];
        }
예제 #11
0
 // HidUtility informs us if the requested transfer was successful
 // Schedule to request a packet if the transfer was successful
 public void PacketSentHandler(object sender, UsbBuffer OutBuffer)
 {
     DebugString      = "Start PacketSentHandler";
     WaitingForDevice = OutBuffer.TransferSuccessful;
     if (OutBuffer.TransferSuccessful)
     {
         ++TxCount;
     }
     else
     {
         ++TxFailedCount;
     }
     DebugString = "End PacketSentHandler";
 }
예제 #12
0
        // HidUtility informs us if the requested transfer was successful and provides us with the received packet
        public void PacketReceivedHandler(object sender, UsbBuffer InBuffer)
        {
            DebugString      = String.Format("Start PacketReceivedHandler ({0:X})", InBuffer.buffer[1]);
            WaitingForDevice = false;

            //Parse received data
            switch (InBuffer.buffer[1])
            {
            case 0x10:
                ParseStatus(ref InBuffer);
                break;

            case 0x11:
            case 0x12:
                ParseDisplay(ref InBuffer);
                break;

            case 0x13:
                //mode-specific details

                //This is the last package. We now have a consistent snapshot
                _NewDataAvailable = true;
                break;

            default:
                //We have received a packet of unknown content
                DebugString    = String.Format("Unknown packet received: {0:X}", InBuffer.buffer[1]);
                NewDebugString = true;
                break;
            }

            //Some statistics
            if (InBuffer.TransferSuccessful)
            {
                ++RxCount;
            }
            else
            {
                ++RxFailedCount;
            }
            DebugString = "End PacketReceivedHandler";
        }
예제 #13
0
 // HidUtility informs us if the requested transfer was successful and provides us with the received packet
 public void PacketReceivedHandler(object sender, UsbBuffer InBuffer)
 {
     WaitingForDevice = false;
     if (InBuffer.buffer[1] == 0x37)
     {
         AdcValue = (uint)(InBuffer.buffer[3] << 8) + InBuffer.buffer[2];
     }
     if (InBuffer.buffer[1] == 0x81)
     {
         if (InBuffer.buffer[2] == 0x01)
         {
             PushbuttonPressed = false;
         }
         if (InBuffer.buffer[2] == 0x00)
         {
             PushbuttonPressed = true;
         }
     }
     ++RxCount;
 }
예제 #14
0
        // HidUtility informs us if the requested transfer was successful and provides us with the received packet
        public void PacketReceivedHandler(object sender, UsbBuffer InBuffer)
        {
            DebugString      = "Start PacketReceivedHandler";
            WaitingForDevice = false;

            //Parse received data
            switch (InBuffer.buffer[1])
            {
            case 0x10:
                ParseStatusData(ref InBuffer);
                break;

            case 0x11:
                ParseDisplay1(ref InBuffer);
                break;

            case 0x12:
                ParseDisplay2(ref InBuffer);
                break;

            case 0x13:
                ParseCalibration1(ref InBuffer);
                break;

            case 0x14:
                ParseCalibration2(ref InBuffer);
                break;
            }
            ;

            //Some statistics
            if (InBuffer.TransferSuccessful)
            {
                ++RxCount;
            }
            else
            {
                ++RxFailedCount;
            }
            DebugString = "End PacketReceivedHandler";
        }
예제 #15
0
        private void ParseDisplay(ref UsbBuffer InBuffer)
        {
            string Replace(byte b)
            {
                switch (b)
                {
                case 0x00:
                    return("|");

                case 0x01:
                    return("°");

                case 0x02:
                    return("ä");

                default:
                    return("" + ((char)b));
                }
            }

            int first_line = 0;

            if (InBuffer.buffer[1] == 0x12)
            {
                first_line = 2;
            }

            DisplayContent[first_line]     = "";
            DisplayContent[first_line + 1] = "";

            for (int i = 0; i < 20; ++i)
            {
                DisplayContent[first_line]     += Replace(InBuffer.buffer[4 + i]);
                DisplayContent[first_line + 1] += Replace(InBuffer.buffer[24 + i]);
            }
        }
예제 #16
0
        public int ControlTransferWrite(byte fieldRequest, ushort fieldValue, ushort fieldIndex, UsbBuffer buffer, uint timeout)
        {
            byte flags = LIBUSB_ENDPOINT_OUT | LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE;

            return(ControlTransfer(flags, fieldRequest, fieldValue, fieldIndex, buffer, timeout));
        }
예제 #17
0
        private int ControlTransfer(byte flags, byte fieldRequest, ushort fieldValue, ushort fieldIndex, UsbBuffer buffer, uint timeout)
        {
            //Apply
            int code;

            if (buffer != null)
            {
                code = LibUSBNative.libusb_control_transfer(handle, flags, fieldRequest, fieldValue, fieldIndex, buffer.AsPtr(), (ushort)buffer.ByteLength, timeout);
            }
            else
            {
                code = LibUSBNative.libusb_control_transfer(handle, flags, fieldRequest, fieldValue, fieldIndex, null, 0, timeout);
            }

            //Valiate
            if (code < 0)
            {
                throw new Exception("Unknown USB transfer write error.");
            }

            return(code);
        }
예제 #18
0
        // HidUtility asks if a packet should be requested from the device
        // Request a packet if a packet has been successfully sent to the device before
        public void ReceivePacketHandler(object sender, UsbBuffer InBuffer)
        {
            InBuffer.RequestTransfer = WaitingForDevice;
            //WriteLog(string.Format("ReceivePacketHandler: {0}", WaitingForDevice), false);

        }
예제 #19
0
        //Function to parse packet received over USB
        private void ParseStatusData(ref UsbBuffer InBuffer)
        {
            //Input values are mainly encoded as Int16
            Int16 tmp;

            tmp                  = (Int16)((InBuffer.buffer[3] << 8) + InBuffer.buffer[2]);
            InputVoltage         = (double)tmp / 1000.0;
            tmp                  = (Int16)((InBuffer.buffer[5] << 8) + InBuffer.buffer[4]);
            OutputVoltage        = (double)tmp / 1000.0;
            tmp                  = (Int16)((InBuffer.buffer[7] << 8) + InBuffer.buffer[6]);
            InputCurrent         = (double)tmp / 1000.0;
            tmp                  = (Int16)((InBuffer.buffer[9] << 8) + InBuffer.buffer[8]);
            OutputCurrent        = (double)tmp / 1000.0;
            tmp                  = (Int16)((InBuffer.buffer[11] << 8) + InBuffer.buffer[10]);
            TemperatureOnboard   = (double)tmp / 100.0;
            tmp                  = (Int16)((InBuffer.buffer[13] << 8) + InBuffer.buffer[12]);
            TemperatureExternal1 = (double)tmp / 100.0;
            tmp                  = (Int16)((InBuffer.buffer[15] << 8) + InBuffer.buffer[14]);
            TemperatureExternal2 = (double)tmp / 100.0;
            InputPower           = InputVoltage * InputCurrent;
            OutputPower          = OutputVoltage * OutputCurrent;
            Loss                 = InputPower - OutputPower;
            Efficiency           = OutputPower / InputPower;
            PowerOutput1         = ((InBuffer.buffer[16] & 1) == 1);
            PowerOutput2         = ((InBuffer.buffer[16] & 2) == 2);
            PowerOutput3         = ((InBuffer.buffer[16] & 4) == 4);
            PowerOutput4         = ((InBuffer.buffer[16] & 8) == 8);
            PowerOutputUsb       = ((InBuffer.buffer[16] & 16) == 16);
            FanOutput            = ((InBuffer.buffer[16] & 32) == 32);
            FanOutputManual      = ((InBuffer.buffer[16] & 64) == 64);
            DisplayMode          = InBuffer.buffer[17];
            uint Year   = 2000 + BcdToUint(InBuffer.buffer[18]);
            uint Month  = BcdToUint(InBuffer.buffer[19]);
            uint Day    = BcdToUint(InBuffer.buffer[20]);
            uint Hour   = BcdToUint(InBuffer.buffer[21]);
            uint Minute = BcdToUint(InBuffer.buffer[22]);
            uint Second = BcdToUint(InBuffer.buffer[23]);

            SystemTime            = new DateTime((int)Year, (int)Month, (int)Day, (int)Hour, (int)Minute, (int)Second);
            BuckMode              = InBuffer.buffer[24];
            BuckDutyCycle         = InBuffer.buffer[25];
            BuckRemoteEnable      = ((InBuffer.buffer[26] & 1) == 1);
            BuckRemoteOn          = ((InBuffer.buffer[26] & 2) == 2);
            BuckRemoteSynchronous = ((InBuffer.buffer[26] & 4) == 4);
            BuckRemoteDutycycle   = InBuffer.buffer[27];
            tmp = (Int16)((InBuffer.buffer[29] << 8) + InBuffer.buffer[28]);
            TemperatureOnboardAdc = (uint)tmp;
            tmp = (Int16)((InBuffer.buffer[31] << 8) + InBuffer.buffer[30]);
            TemperatureExternal1Adc = (uint)tmp;
            tmp = (Int16)((InBuffer.buffer[33] << 8) + InBuffer.buffer[32]);
            TemperatureExternal2Adc = (uint)tmp;
            tmp = (Int16)((InBuffer.buffer[35] << 8) + InBuffer.buffer[34]);
            InputVoltageAdc[(TimeSlot >> 4) & 0x03] = (uint)tmp;
            tmp = (Int16)((InBuffer.buffer[37] << 8) + InBuffer.buffer[36]);
            OutputVoltageAdc[(TimeSlot >> 4) & 0x03] = (uint)tmp;
            tmp = (Int16)((InBuffer.buffer[39] << 8) + InBuffer.buffer[38]);
            InputCurrentAdc[(TimeSlot >> 4) & 0x03] = (uint)tmp;
            tmp = (Int16)((InBuffer.buffer[41] << 8) + InBuffer.buffer[40]);
            OutputCurrentAdc[(TimeSlot >> 4) & 0x03] = (uint)tmp;
            DisplayStatus = InBuffer.buffer[42];
            TimeSlot      = InBuffer.buffer[43];
            //New status data is now available
            _NewStatusAvailable = true;
        }
예제 #20
0
 // HidUtility asks if a packet should be requested from the device
 // Request a packet if a packet has been successfully sent to the device before
 public void ReceivePacketHandler(object sender, UsbBuffer InBuffer)
 {
     InBuffer.RequestTransfer = WaitingForDevice;
 }