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); } }
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); }