//private void tmrScanningSession_TimerCallback(object state) //{ // try // { // //_serialPort.DataReceived -= new SerialDataReceivedEventHandler(Read); // //Manually stop the timer... // tmrScanningSessionTimer.Change(Timeout.Infinite, Timeout.Infinite); // scanner.sessionInProgress = false; // } // catch (Exception ex) // { // //if (log.IsErrorEnabled) log.Info("Error in tmrPrintLog_TimerCallback.. " + ex.Message.ToString()); // } // finally // { // //if (log.IsInfoEnabled) log.Info("tmrPrinttLog_TimerCallback execution finished.."); // } //} private void Write(DS457 scanner, short reqLen) { short ctr; try { scanner._serialPort.RtsEnable = true; scanner._serialPort.Write(scanner.request, 0, reqLen); for (ctr = 0; ctr < scanner.request.Length; ctr++) { scanner.reply[ctr] = 0; } scanner.statusCode = (int)DecoderStatus.NoError; } catch (TimeoutException tex) { //this.statusCode = (int)DecoderStatus.Error; using (FileStream stream = new FileStream(@"SymbolDS457.log", FileMode.Append, FileAccess.Write)) { StreamWriter writer = new StreamWriter(stream); writer.WriteLine(string.Format(@"Datetime {0} -- Error in Write. Message - {1}|| Decoder - {2} .", DateTime.Now, tex.Message, scanner._serialPort.PortName)); writer.Flush(); writer.Close(); } } catch (Exception ex) { scanner.statusCode = (int)DecoderStatus.Error; scanner.statusDesc = "Exception - " + ex.Message; using (FileStream stream = new FileStream(@"SymbolDS457.log", FileMode.Append, FileAccess.Write)) { StreamWriter writer = new StreamWriter(stream); writer.WriteLine(string.Format(@"Datetime {0} -- Error in Write. Message - {1}|| Decoder - {2} .", DateTime.Now, ex.Message, scanner._serialPort.PortName)); writer.Flush(); writer.Close(); } } }
private byte Scan_Enable(DS457 scanner) { scanner.request[0] = 0x04; //Length of message not including Checksum. scanner.request[1] = 0xE9; //OPCODE - SCAN_ENABLE scanner.request[2] = 0x04; //Message Source - Host scanner.request[3] = 0x00; // Status byte[] checksum = CalculateChecksum(scanner, 4); scanner.request[4] = checksum[0]; scanner.request[5] = checksum[1]; return (SendReceive(scanner, (byte)DecoderCommands.SCAN_ENABLE, 6)); }
private byte Stop_Session(DS457 scanner) { scanner.request[0] = 0x04; //Length of message not including Checksum. scanner.request[1] = 0xE5; //OPCODE - STOP_SESSION scanner.request[2] = 0x04; //Message Source - Host scanner.request[3] = 0x00; // Status byte[] checksum = CalculateChecksum(scanner, 4); scanner.request[4] = checksum[0]; scanner.request[5] = checksum[1]; return (SendReceive(scanner, (byte)DecoderCommands.STOP_SESSION, 6)); }
private byte Param_Send(DS457 scanner, byte paramNum, byte paramValue) { scanner.request[0] = 0x07; //Length of message not including Checksum. scanner.request[1] = 0xC6; //OPCODE - PARAM_SEND scanner.request[2] = 0x04; //Message Source - Host scanner.request[3] = 0x00; // Status scanner.request[4] = 0xFF; // Beep Code - No beep. scanner.request[5] = paramNum; scanner.request[6] = paramValue; byte[] checksum = CalculateChecksum(scanner, 7); scanner.request[7] = checksum[0]; scanner.request[8] = checksum[1]; return (SendReceive(scanner, (byte)DecoderCommands.PARAM_SEND, 9)); }
private byte Request_Revision(DS457 scanner) { scanner.request[0] = 0x04; // Length of message not including Checksum. scanner.request[1] = 0xA3; // OPCODE - REQUEST_REVISION scanner.request[2] = 0x04; // Message Source - Host scanner.request[3] = 0x00; // Status byte[] checksum = CalculateChecksum(scanner, 4); scanner.request[4] = checksum[0]; scanner.request[5] = checksum[1]; return (SendReceive(scanner, (byte)DecoderCommands.REQUEST_REVISION, 6)); }
private bool InterpretResponse(DS457 scanner) { bool flag = false; using (FileStream stream = new FileStream(@"SymbolDS457.log", FileMode.Append, FileAccess.Write)) { StreamWriter writer = new StreamWriter(stream); writer.WriteLine(string.Format(@"Datetime {0} -- InterpretResponse for Request - {1}.---- Response - {2}", DateTime.Now, scanner.request[1], scanner.reply[1])); writer.Flush(); writer.Close(); } switch (scanner.reply[1]) { case 0xD1: Console.WriteLine("Command execution Failed."); // Check for the cause if cause is Checksum Failure then Resend. if (scanner.reply[4] == 0x01) { flag = true; } break; //case 0x00: // flag = true; // break; } return flag; }
private void Open(DS457 scanner) { try { //_serialPort.DataReceived += new SerialDataReceivedEventHandler(Read); //_serialPort.ErrorReceived += new SerialErrorReceivedEventHandler(OpError); scanner._serialPort.Open(); } catch (TimeoutException tex) { scanner.stateCode = (int)DecoderState.OFFLINE; scanner.statusCode = (int)DecoderStatus.Error; scanner.statusDesc = tex.Message + tex.InnerException; } catch (Exception ex) { scanner.stateCode = (int)DecoderState.OFFLINE; scanner.statusCode = (int)DecoderStatus.Error; scanner.statusDesc = ex.Message + ex.InnerException; } finally { scanner.stateCode = (int)DecoderState.ONLINE; } }
private void Init(bool reconnect) { if (!simulateDevice) { multiVend = Convert.ToInt16(string.IsNullOrWhiteSpace(ConfigurationManager.AppSettings["MULTIVENDMACHINE"]) ? "1" : ConfigurationManager.AppSettings["MULTIVENDMACHINE"]); for (short counter = 0; counter < multiVend; counter++) { bool loopFlag = true; DS457 scanner; // Create a new SerialPort object with default settings. scanner = new DS457(); scanner._serialPort = new SerialPort(); // Allow the user to set the appropriate properties. scanner._serialPort.PortName = string.IsNullOrWhiteSpace(ConfigurationManager.AppSettings["DECODERCOMPORT" + counter.ToString()]) ? "com" + (++counter).ToString() : ConfigurationManager.AppSettings["DECODERCOMPORT" + counter.ToString()]; scanner._serialPort.BaudRate = int.Parse(string.IsNullOrWhiteSpace(ConfigurationManager.AppSettings["DECODERBAUDRATE"]) ? "9600" : ConfigurationManager.AppSettings["DECODERBAUDRATE"]); scanner._serialPort.Parity = (Parity)Enum.Parse(typeof(Parity), string.IsNullOrWhiteSpace(ConfigurationManager.AppSettings["DECODERPARITY"]) ? "None" : ConfigurationManager.AppSettings["DECODERPARITY"]); scanner._serialPort.DataBits = int.Parse(string.IsNullOrWhiteSpace(ConfigurationManager.AppSettings["DECODERDATABITS"]) ? "8" : ConfigurationManager.AppSettings["DECODERDATABITS"]); scanner._serialPort.StopBits = (StopBits)Enum.Parse(typeof(StopBits), string.IsNullOrWhiteSpace(ConfigurationManager.AppSettings["DECODERSTOPBITS"]) ? "1" : ConfigurationManager.AppSettings["DECODERSTOPBITS"]); scanner._serialPort.Handshake = (Handshake)Enum.Parse(typeof(Handshake), string.IsNullOrWhiteSpace(ConfigurationManager.AppSettings["DECODERHANDSHAKE"]) ? "None" : ConfigurationManager.AppSettings["DECODERHANDSHAKE"]); scanner._serialPort.WriteTimeout = int.Parse(string.IsNullOrWhiteSpace(ConfigurationManager.AppSettings["DECODERWRITETIMEOUT"]) ? "3" : ConfigurationManager.AppSettings["DECODERWRITETIMEOUT"]) * 1000; scanner._serialPort.ReadTimeout = int.Parse(string.IsNullOrWhiteSpace(ConfigurationManager.AppSettings["DECODERREADTIMEOUT"]) ? "5" : ConfigurationManager.AppSettings["DECODERREADTIMEOUT"]) * 1000; scanner.stateCode = (int)DecoderState.ONLINE; scanner.statusCode = (int)DecoderStatus.Initializing; scanner.statusDesc = "Initialization sequence happening."; //tmrScanningSessionTimer = new System.Threading.Timer(new //TimerCallback(this.tmrScanningSession_TimerCallback), //null, System.Threading.Timeout.Infinite, 10 * 1000); short loopCounter = 0; while (loopFlag) { Open(scanner); // Decode DataPacket Format // Param #EEh // Param Value Send Raw Decode Data 0x00 // Param Value Send Packeted Decode Data 0x01 // PARAM_SEND if (Param_Send(scanner, 0xEE, 0x01) == 1) { // Trigger Mode // Param #8Ah // Param Value Level 0x00 // Param Value Presentation Mode 0x07 // Param Value Host 0x08 // Param Value Software Trigger Only Mode 0x0F // PARAM_SEND loopCounter = 0; if (Param_Send(scanner, 0x8A, 0x08) == 1) { // Enable Scanning //if (Scan_Enable() == 1) //{ using (FileStream stream = new FileStream(@"SymbolDS457.log", FileMode.Append, FileAccess.Write)) { StreamWriter writer = new StreamWriter(stream); writer.WriteLine(string.Format(@"Datetime {0} -- Scanner mapped to {1} is initiallized successfully.", DateTime.Now, scanner._serialPort.PortName)); writer.Flush(); writer.Close(); } scanner.id = counter; scanner.statusCode = (int)DecoderStatus.NoError; scanner.statusDesc = "Decoder Initialized Successfully."; scanners.Add(scanner); loopFlag = false; //} //else // this.statusCode = (int)DecoderStatus.Error; } else { scanner.statusCode = (int)DecoderStatus.Error; scanner.statusDesc = "Invalid Checksum error received."; using (FileStream stream = new FileStream(@"SymbolDS457.log", FileMode.Append, FileAccess.Write)) { StreamWriter writer = new StreamWriter(stream); writer.WriteLine(string.Format(@"Datetime {0} -- Setting TriggerMode for scanner - {1} || state - {2} || status - {3} || Desc - {4}.", DateTime.Now, scanner._serialPort.PortName, scanner.stateCode, scanner.statusCode, scanner.statusDesc)); writer.Flush(); writer.Close(); } scanner._serialPort.Close(); loopCounter++; Thread.Sleep(2000); } } else { scanner.statusCode = (int)DecoderStatus.Error; scanner.statusDesc = "Invalid Checksum error received."; using (FileStream stream = new FileStream(@"SymbolDS457.log", FileMode.Append, FileAccess.Write)) { StreamWriter writer = new StreamWriter(stream); writer.WriteLine(string.Format(@"Datetime {0} -- Setting DataPAcket Fromat for scanner - {1} || state - {2} || status - {3} || Desc - {4}.", DateTime.Now, scanner._serialPort.PortName, scanner.stateCode, scanner.statusCode, scanner.statusDesc)); writer.Flush(); writer.Close(); } scanner._serialPort.Close(); loopCounter++; Thread.Sleep(2000); } if (loopCounter == 3) loopFlag = false; } } } else { this.stateCode = (int)DecoderState.ONLINE; this.statusCode = (int)DecoderStatus.NoError; this.statusDesc = "Decoder Initialized Successfully."; } }
private byte Cmd_Nak(DS457 scanner) { scanner.request[0] = 0x05; //Length of message not including Checksum. scanner.request[1] = 0xD1; //OPCODE - START_SESSION scanner.request[2] = 0x04; //Message Source - Host scanner.request[3] = 0x00; //Status scanner.request[4] = 0x01; //Cause byte[] checksum = CalculateChecksum(scanner, 5); scanner.request[5] = checksum[0]; scanner.request[6] = checksum[1]; return (SendReceive(scanner, (byte)DecoderCommands.CMD_NAK, 7)); }
private byte[] CalculateChecksum(DS457 scanner, short reqLen) { int counter = 0; int sum = 0; while (counter < reqLen) { sum += scanner.request[counter]; counter++; } // Calculate twos complement of the sum as per SSI protocol requirements. sum = ~sum + (int)1; byte[] checksum = new byte[2]; checksum[0] = (byte)(sum >> 8); checksum[1] = (byte)(sum & 0xFF); return checksum; }
public byte SendReceive(DS457 scanner, byte command, short reqLen) { int ctr, iter = 0; bool loopFlag = true; try { while (loopFlag) { iter++; if (iter == 4) break; if (iter > 1) { scanner.request[3] = 1; byte[] checksum = CalculateChecksum(scanner, (short)(reqLen - 2)); scanner.request[reqLen - 2] = checksum[0]; scanner.request[reqLen - 1] = checksum[1]; } using (FileStream stream = new FileStream(@"SymbolDS457.log", FileMode.Append, FileAccess.Write)) { StreamWriter writer = new StreamWriter(stream); writer.WriteLine(string.Format(@"Datetime {0} -- Before Issuing Command {1} for Decoder - {2}.", DateTime.Now, scanner.request[1], scanner._serialPort.PortName)); writer.Flush(); writer.Close(); } Write(scanner, reqLen); loopFlag = false; switch (command) { case (byte)DecoderCommands.REQUEST_REVISION: // REPLY_REVISION expected from the Decoder. // If Write is successful then only issue Read. Read(scanner, null, null); // If Read is successful then proceed further. break; case (byte)DecoderCommands.SCAN_ENABLE: // CMD_ACK/CMD_NAK expected from the decoder. Read(scanner, null, null); //if(reply[1] == 0xD0) // Notify App of the Enable Scanning Event. if ((InterpretResponse(scanner)) && (iter < 4)) loopFlag = true; /*************/ // Publish the event indicating scanning has been enabled. if (loopFlag) { Action handler = ScanEnabledEvent; if (handler != null) { using (FileStream stream = new FileStream(@"SymbolDS457.log", FileMode.Append, FileAccess.Write)) { StreamWriter writer = new StreamWriter(stream); writer.WriteLine(string.Format(@"Datetime {0} -- Publishing ScanEnabledEvent.", DateTime.Now)); writer.Flush(); writer.Close(); } handler(); } } break; case (byte)DecoderCommands.START_SESSION: // CMD_ACK/CMD_NAK expected from the decoder. Read(scanner, null, null); using (FileStream stream = new FileStream(@"SymbolDS457.log", FileMode.Append, FileAccess.Write)) { StreamWriter writer = new StreamWriter(stream); writer.WriteLine(string.Format(@"Datetime {0} -- StartSession {1}{2}{3}{4}{5}{6}.", DateTime.Now, scanner.reply[0], scanner.reply[1], scanner.reply[2], scanner.reply[3], scanner.reply[4], scanner.reply[5])); writer.Flush(); writer.Close(); } //if (reply[1] == 0x00) // Notify App of the Start Scanning Event. if ((InterpretResponse(scanner)) && (iter < 4)) loopFlag = true; /************ if(loopFlag) Publish the event indicating scanning session has been started. ************/ if (!loopFlag) { using (FileStream stream = new FileStream(@"SymbolDS457.log", FileMode.Append, FileAccess.Write)) { StreamWriter writer = new StreamWriter(stream); writer.WriteLine(string.Format(@"Datetime {0} -- Before Issuing Read for Decode Event for Decoder {1}.", DateTime.Now, scanner._serialPort.PortName)); writer.Flush(); writer.Close(); } loopFlag = false; Action handler = TriggerPulledEvent; if (handler != null) { using (FileStream stream = new FileStream(@"SymbolDS457.log", FileMode.Append, FileAccess.Write)) { StreamWriter writer = new StreamWriter(stream); writer.WriteLine(string.Format(@"Datetime {0} -- Publishing TriggerPulledEvent.", DateTime.Now)); writer.Flush(); writer.Close(); } handler(); } Read(scanner, null, null); //Action handler = ScanEnabledEvent; } //Thread.Sleep(1000); break; case (byte)DecoderCommands.STOP_SESSION: // CMD_ACK/CMD_NAK expected from the decoder. Read(scanner, null, null); //if(reply[1] == 0xD0) // Notify App of the Stop Scanning Event. if ((InterpretResponse(scanner)) && (iter < 4)) loopFlag = true; if (loopFlag) Thread.Sleep(1000); /************ if(loopFlag) Publish the event indicating scanning session has been stopped. ************/ if (!loopFlag) { //Action handler = ScanEnabledEvent; Action handler = TriggerReleasedEvent; if (handler != null) { using (FileStream stream = new FileStream(@"SymbolDS457.log", FileMode.Append, FileAccess.Write)) { StreamWriter writer = new StreamWriter(stream); writer.WriteLine(string.Format(@"Datetime {0} -- Publishing TriggerReleasedEvent.", DateTime.Now)); writer.Flush(); writer.Close(); } handler(); } } break; case (byte)DecoderCommands.CMD_ACK: // No Reply expected from the decoder. break; case (byte)DecoderCommands.CMD_NAK: // No Reply expected from the decoder. break; case (byte)DecoderCommands.SCAN_DISABLE: // CMD_ACK/CMD_NAK expected from the decoder. Read(scanner, null, null); //if(reply[1] == 0xD0) // Notify App of the Disable Scanning Event. if ((InterpretResponse(scanner)) && (iter < 3)) loopFlag = true; break; case (byte)DecoderCommands.PARAM_SEND: // CMD_ACK/CMD_NAK expected from the decoder. Read(scanner, null, null); //if(reply[1] == 0xD0) // Notify App of the Disable Scanning Event. //Thread.Sleep(2000); if ((InterpretResponse(scanner)) && (iter < 4)) loopFlag = true; break; case (byte)DecoderCommands.WAKEUP: // No Reply expected from the decoder. break; default: break; } Thread.Sleep(300); } } catch (TimeoutException tex) { scanner.statusCode = (int)DecoderStatus.Error; this.statusDesc = "Exception - " + tex.Message; } catch (Exception ex) { scanner.statusCode = (int)DecoderStatus.Error; scanner.statusDesc = "Exception - " + ex.Message; Console.WriteLine("Exception - " + ex.Message); } finally { // Initialize Request and Response buffers. // JK - Need to find a better way to initializa the buffers in c#. for (ctr = 0; ctr < scanner.request.Length; ctr++) { scanner.request[ctr] = scanner.reply[ctr] = 0; } } if ((loopFlag) && (iter == 4)) { using (FileStream stream = new FileStream(@"SymbolDS457.log", FileMode.Append, FileAccess.Write)) { StreamWriter writer = new StreamWriter(stream); writer.WriteLine(string.Format(@"Datetime {0} -- All three attempts to issue command failed.", DateTime.Now)); writer.Flush(); writer.Close(); } //scanner.statusCode = (int)DecoderStatus.Error; //this.statusDesc = "Command can't be processed successfully"; return 0; } else { scanner.statusCode = (int)DecoderStatus.NoError; //this.statusDesc = "Command processed successfully"; return 1; } }
public void Read(DS457 scanner, object sender, SerialDataReceivedEventArgs e) { //byte[] barcode = new byte[100]; string cardid; bool startOfResponse = true; int replyLength = -1; int replyOffset = 0; if (!scanner.readInProgress) { try { scanner.readInProgress = true; using (FileStream stream = new FileStream(@"SymbolDS457.log", FileMode.Append, FileAccess.Write)) { StreamWriter writer = new StreamWriter(stream); writer.WriteLine(string.Format(@"Datetime {0} -- Before Issuing Read for Command {1} on Decoder - {2}.", DateTime.Now, scanner.request[1], scanner._serialPort.PortName)); writer.Flush(); writer.Close(); } scanner._serialPort.RtsEnable = false; int readLen; while (replyLength != replyOffset) { if (startOfResponse) { readLen = scanner._serialPort.Read(scanner.reply, 0, 1); replyLength = scanner.reply[0] + 2; replyOffset += readLen; startOfResponse = false; using (FileStream stream = new FileStream(@"SymbolDS457.log", FileMode.Append, FileAccess.Write)) { StreamWriter writer = new StreamWriter(stream); writer.WriteLine(string.Format(@"Datetime {0} -- ReadLength - {1} ---- ReplyLength - {2}.---- ReplyOffset - {3} ---- Request - {4}", DateTime.Now, readLen, replyLength, replyOffset, scanner.request[1])); writer.Flush(); writer.Close(); } } else { readLen = scanner._serialPort.Read(scanner.reply, replyOffset, replyLength - replyOffset); replyOffset += readLen; using (FileStream stream = new FileStream(@"SymbolDS457.log", FileMode.Append, FileAccess.Write)) { StreamWriter writer = new StreamWriter(stream); writer.WriteLine(string.Format(@"Datetime {0} -- ReadLength - {1} ---- ReplyLength - {2}.---- ReplyOffset - {3} ---- Request - {4}", DateTime.Now, readLen, replyLength, replyOffset, scanner.request[1])); writer.Flush(); writer.Close(); } } // end of reply reached if (replyOffset == replyLength) { break; //InterpretResponse(replyLength); } } using (FileStream stream = new FileStream(@"SymbolDS457.log", FileMode.Append, FileAccess.Write)) { StreamWriter writer = new StreamWriter(stream); writer.WriteLine(string.Format(@"Datetime {0} -- Response for Request - {1}.---- {2}{3}{4}{5}{6}{7}", DateTime.Now, scanner.request[1], scanner.reply[1], scanner.reply[2], scanner.reply[3], scanner.reply[4], scanner.reply[5], scanner.reply[6])); writer.Flush(); writer.Close(); } // In case of DECODE_DATA the decoder sends unsolicited data. // We need to treat this in a special manner. if (scanner.reply[1] == 0xF3) { cardid = System.Text.Encoding.UTF8.GetString(scanner.reply, 5, scanner.reply[0] - 5); // Publish Decode Event as the card id has been scanned successfully. // Issue CMD_ACK. Cmd_Ack(scanner); Action<string> handler = BarcodeScannedEvent; if (handler != null) { using (FileStream stream = new FileStream(@"SymbolDS457.log", FileMode.Append, FileAccess.Write)) { StreamWriter writer = new StreamWriter(stream); writer.WriteLine(string.Format(@"Datetime {0} -- Publishing BarcodeScannedEvent - Card ID {1}.", DateTime.Now, cardid)); writer.Flush(); writer.Close(); } handler(cardid); } } } catch (TimeoutException tex) { using (FileStream stream = new FileStream(@"SymbolDS457.log", FileMode.Append, FileAccess.Write)) { StreamWriter writer = new StreamWriter(stream); writer.WriteLine(string.Format(@"Datetime {0} -- Error in Read - Message {1}.", DateTime.Now, tex.Message)); writer.Flush(); writer.Close(); } //this.statusCode = (int)DecoderStatus.Error; scanner.statusDesc = "Exception - " + tex.Message; } catch (Exception ex) { scanner.statusCode = (int)DecoderStatus.Error; scanner.statusDesc = "Exception - " + ex.Message; using (FileStream stream = new FileStream(@"SymbolDS457.log", FileMode.Append, FileAccess.Write)) { StreamWriter writer = new StreamWriter(stream); writer.WriteLine(string.Format(@"Datetime {0} -- Error in Read - Message {1}.", DateTime.Now, ex.Message)); writer.Flush(); writer.Close(); } } finally { scanner.readInProgress = false; } } }