コード例 #1
0
        private bool initPort(UartSpeed speed)
        {
            try
            {
                // Let's initialize the port with highest possible bandwidth
                MifareResponse request = sendInitRequest(speed);
                if (request.Response != Response.OK)
                {
                    return(false);
                }

                // Let's find out what hardware we're dealing with
                MifareDeviceResponse deviceModeResponse = sendReadDeviceMode();
                if (deviceModeResponse.Response != Response.OK)
                {
                    return(false);
                }

                Console.WriteLine("Communicating with device name {0}", deviceModeResponse.DeviceName);

                // Turn LED off so we can actively use it to give visual feedback
                //Console.WriteLine (sendLedRequest (LEDColor.ALL_LED_OFF));
                //Console.WriteLine ();

                sendLedRequest(LEDColor.BLUE_ON_RED_OFF);
                Thread.Sleep(500);
                sendLedRequest(LEDColor.ALL_LED_OFF);

                return(true);
            }
            catch (System.TimeoutException exception)
            {
                return(false);
            }
        }
コード例 #2
0
        private MifareDeviceResponse sendReadDeviceMode()
        {
            byte[] readBuffer  = new byte[64];
            int    offset      = 0;
            int    bytesToRead = 0;

            WriteCommand(Command.READ_DEVICE_MODE, NODE_BROADCAST);

            // Naive busy way. Rewrite to consumer stream pull!
            do
            {
                Thread.Sleep(50);
                bytesToRead = port.BytesToRead;
            } while (bytesToRead == 0);

            // TODO: Use callback, make response parser able to read lazily from input stream
            int bytesRead = port.Read(readBuffer, offset, bytesToRead);

            // Evaluate data in buffer

            MifareDeviceResponse response = new MifareDeviceResponse();

            ushort length = readBuffer.Subset(2, 2).ToUInt16();
            //Console.WriteLine ("Length: {0} ( {1})", length, readBuffer.Subset (2, 2).ToHex ());

            ushort nodeID = readBuffer.Subset(4, 2).ToUInt16();

            //Console.WriteLine ("NodeID: {0} ( {1})", nodeID, readBuffer.Subset (4, 2).ToHex ());
            response.NodeId = nodeID;

            ushort commandCode = readBuffer.Subset(6, 2).ToUInt16();

            //Console.WriteLine ("Command: {0} ( {1})", Enum.GetName (typeof(CommandCode), commandCode), readBuffer.Subset (6, 2).ToHex ());
            response.Command = (Command)commandCode;

            byte responseCode = readBuffer[8];

            //Console.WriteLine ("Response Code: {0} ( {1})", Enum.GetName (typeof(Response), responseCode), responseCode.ToHex ());
            response.Response = (Response)responseCode;

            byte[] name = readBuffer.Subset(10, 7 + length);
            response.DeviceName = System.Text.Encoding.ASCII.GetString(name);

            //byte checksum = readBuffer [readBuffer.Length-1];
            byte checksum = readBuffer[4 + length];

            //Console.WriteLine ("XOR: {0} ( {1})", checksum, checksum.ToHex ());

            byte calculatedChecksum = CalcCheckSum(readBuffer, 4, 4 + length);

            //Console.WriteLine ("XOR match: {0} ( {1})", calculatedChecksum, calculatedChecksum.ToHex ());

            validateChecksum(checksum, calculatedChecksum);

            return(response);
        }