<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="https://wiki.transcends.co/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://wiki.transcends.co/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jmaine</id>
		<title>RifidiWiki - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://wiki.transcends.co/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jmaine"/>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/Special:Contributions/Jmaine"/>
		<updated>2026-04-19T21:36:33Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.23.1</generator>

	<entry>
		<id>https://wiki.transcends.co/index.php/Command_Flow</id>
		<title>Command Flow</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/Command_Flow"/>
				<updated>2008-11-24T00:27:27Z</updated>
		
		<summary type="html">&lt;p&gt;Jmaine: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:developerDoc]][[Category:EmulatorDoc]][[Category:EngineImplementation]]&lt;br /&gt;
&lt;br /&gt;
This page shows how commands go through the components in the engine.  In particular it describes the various transformations that a single message goes through.&lt;br /&gt;
&lt;br /&gt;
[[Image:commandFlow.png|thumb|800px|none|How a command flows through the engine]]&lt;br /&gt;
&lt;br /&gt;
# Commands are sent to the TCP Incomming buffer which is located inside the TCP Socket.  The Stream Reader is a reader-specific class designed to read bytes off of the socket.  It is needed because some types of readers, such as the Alien, use plain text for their commands, so it is easier to use a readLine() method to read from the socket.  Other readers, such as the LLRP reader need to use a readByte() method, because the commands are byte strings.&lt;br /&gt;
#  From there, the command moves to the [[READERNAME_Protocol.java|protocol]].  The Protocol is a reader-specific class that performs two functions:&lt;br /&gt;
## It removes any kind of protocol that the reader uses to communicate, such as HTTP&lt;br /&gt;
## It is possible for a client to send two commands at once.  If this happens, The protocol breaks up multiple commands and places each one on the Incomming Message Buffer to be processed individually.&lt;br /&gt;
#After a Command is placed onto the Incomming Message Buffer, the buffer notifies the command controller to take off the next command from it&lt;br /&gt;
#Next the command goes through the [[READERNAME_CommandFormatter.java|command Formatter]], which transforms the message from a sequence of bytes into a command object that can be executed in a [[READERNAME_CATEGORY_Handler.java|handler method]]&lt;br /&gt;
#The Adapter uses the newly formed command object and the command searcher to look up a handler method name in the [[reader.xml]] file.  After it finds the handler method which should process the command, it invokes the handler method using reflection.&lt;br /&gt;
#The handler method processes the command in some specific way.  For example, if the command is 'get taglist' in an alien reader, it will scan the radio and collect the tag information. The radio will read the reader's [[TagMemory|tag memory]]. The handler method will put any return value into the command object and return back to the adapter.&lt;br /&gt;
#The adapter now passes the command back through the formatter to turn the command object into a response message.&lt;br /&gt;
#The command formatter will place the outgoing message onto the outgoing message buffer&lt;br /&gt;
#The Buffer will pass the message back through the protocol to add back in a protocol if it needs to be done&lt;br /&gt;
#The TCP Outgoing Buffer will send the response back to the clien&lt;/div&gt;</summary>
		<author><name>Jmaine</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/Command_Flow</id>
		<title>Command Flow</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/Command_Flow"/>
				<updated>2008-11-24T00:16:33Z</updated>
		
		<summary type="html">&lt;p&gt;Jmaine: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:developerDoc]][[Category:EmulatorDoc]][[Category:EngineImplementation]]&lt;br /&gt;
&lt;br /&gt;
This page shows how commands go through the components in the engine.  In particular it describes the various transformations that a single message goes through.&lt;br /&gt;
&lt;br /&gt;
[[Image:commandFlow.png|thumb|800px|none|How a command flows through the engine]]&lt;br /&gt;
&lt;br /&gt;
# Commands are sent to the TCP Incomming buffer which is located inside the TCP Socket.  The Stream Reader is a reader-specific class designed to read bytes off of the socket.  It is needed because some types of readers, such as the Alien, use plain text for their commands, so it is easier to use a readLine() method to read from the socket.  Other readers, such as the LLRP reader need to use a readByte() method, because the commands are byte strings.&lt;br /&gt;
#  From there, the command moves to the [[READERNAME_Protocol.java|protocol]].  The Protocol is a reader-specific class that performs two functions:&lt;br /&gt;
## It removes any kind of protocol that the reader uses to communicate, such as HTTP&lt;br /&gt;
## It is possible for a client to send two commands at once.  If this happens, The protocol breaks up multiple commands and places each one on the Incomming Message Buffer to be processed individually.&lt;br /&gt;
#After a Command is placed onto the Incomming Message Buffer, the buffer notifies the command controller to take off the next command from it&lt;br /&gt;
#Next the command goes through the [[READERNAME_CommandFormatter.java|command Formatter]], which transforms the message from a sequence of bytes into a command object that can be executed in a [[READERNAME_CATEGORY_Handler.java|handler method]]&lt;br /&gt;
#The Adapter uses the newly formed command object and the command searcher to look up a handler method name in the [[reader.xml]] file.  After it finds the handler method which should process the command, it invokes the handler method using reflection.&lt;br /&gt;
#The handler method processes the command in some specific way.  For example, if the command is 'get taglist' in an alien reader, it will scan the radio and collect the tag information.  The handler method will put any return value into the command object and return back to the adapter.&lt;br /&gt;
#The adapter now passes the command back through the formatter to turn the command object into a response message.&lt;br /&gt;
#The command formatter will place the outgoing message onto the outgoing message buffer&lt;br /&gt;
#The Buffer will pass the message back through the protocol to add back in a protocol if it needs to be done&lt;br /&gt;
#The TCP Outgoing Buffer will send the response back to the clien&lt;/div&gt;</summary>
		<author><name>Jmaine</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/READERNAME_CATEGORY_Handler.java</id>
		<title>READERNAME CATEGORY Handler.java</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/READERNAME_CATEGORY_Handler.java"/>
				<updated>2008-11-24T00:05:38Z</updated>
		
		<summary type="html">&lt;p&gt;Jmaine: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:developerDoc]][[category:emulatorDoc]]&lt;br /&gt;
The Handler method class is made up of handler methods.  These are special methods designed to take care of one specific reader level command.  For example, when you send a 'get taglist' command to the alien reader, it does the actual work of scanning the radio and getting tags in the taglist command handler.  A handler method class usually has more than one command handler in it, and readers normally have more than one handler method class.  The handler methods can usually be divided up by the type of the command.  For example, in the LLRP reader, the command that deal with ROSpecs are in a different file from the commands dealing with AccessSpecs.&lt;br /&gt;
&lt;br /&gt;
Each Handler method must registered in the [[reader.xml]] file. Please see it for how do it.&lt;br /&gt;
=Command Handler Method=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;public CommandObject commandName(CommandObject arg, AbstractReaderSharedResources asr)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Arguments==&lt;br /&gt;
#arg - The incoming command&lt;br /&gt;
#asr - abstract shared resources&lt;br /&gt;
&lt;br /&gt;
==Return Value==&lt;br /&gt;
A command object where the first object in the commandObject's return value array is the return value of the funtion&lt;br /&gt;
&lt;br /&gt;
==Reference Implementation==&lt;br /&gt;
This is a command handler in the symbol reader.  All this handler method does is return four bytes.  It places the bytes in the first slot in the RetrunValue array in the command object.  This return value will then later be processed into an outgoing message by the formatter.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public CommandObject setSystemParameter(CommandObject arg, AbstractReaderSharedResources asr) {&lt;br /&gt;
    byte[] setSystemParam = { 0x04, 0x06, 0x27, 0x00 };&lt;br /&gt;
    arg.getReturnValue().add(setSystemParam);&lt;br /&gt;
    return arg;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jmaine</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/READERNAME_CATEGORY_Handler.java</id>
		<title>READERNAME CATEGORY Handler.java</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/READERNAME_CATEGORY_Handler.java"/>
				<updated>2008-11-24T00:04:51Z</updated>
		
		<summary type="html">&lt;p&gt;Jmaine: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:developerDoc]][[category:emulatorDoc]]&lt;br /&gt;
The Handler method class is made up of handler methods.  These are special methods designed to take care of one specific reader level command.  For example, when you send a 'get taglist' command to the alien reader, it does the actual work of scanning the radio and getting tags in the taglist command handler.  A handler method class usually has more than one command handler in it, and readers normally have more than one handler method class.  The handler methods can usually be divided up by the type of the command.  For example, in the LLRP reader, the command that deal with ROSpecs are in a different file from the commands dealing with AccessSpecs.&lt;br /&gt;
&lt;br /&gt;
Each Handler method must registered in the [[emulator.xml]] file. Please see it for how do it.&lt;br /&gt;
=Command Handler Method=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;public CommandObject commandName(CommandObject arg, AbstractReaderSharedResources asr)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Arguments==&lt;br /&gt;
#arg - The incoming command&lt;br /&gt;
#asr - abstract shared resources&lt;br /&gt;
&lt;br /&gt;
==Return Value==&lt;br /&gt;
A command object where the first object in the commandObject's return value array is the return value of the funtion&lt;br /&gt;
&lt;br /&gt;
==Reference Implementation==&lt;br /&gt;
This is a command handler in the symbol reader.  All this handler method does is return four bytes.  It places the bytes in the first slot in the RetrunValue array in the command object.  This return value will then later be processed into an outgoing message by the formatter.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public CommandObject setSystemParameter(CommandObject arg, AbstractReaderSharedResources asr) {&lt;br /&gt;
    byte[] setSystemParam = { 0x04, 0x06, 0x27, 0x00 };&lt;br /&gt;
    arg.getReturnValue().add(setSystemParam);&lt;br /&gt;
    return arg;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jmaine</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/Reader.xml</id>
		<title>Reader.xml</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/Reader.xml"/>
				<updated>2008-11-23T23:37:47Z</updated>
		
		<summary type="html">&lt;p&gt;Jmaine: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:developerDoc]][[category:emulatorDoc]]&lt;br /&gt;
Reader.xml is a file that contains the mapping between handler methods and the command names.  It tells the command processor where to find the proper handler method, given a particular command. See [[READERNAME_CATEGORY_Handler.java]] for more information about the command handlers.&lt;br /&gt;
&lt;br /&gt;
=Command=&lt;br /&gt;
&lt;br /&gt;
The command xml tag is the basic tag in the reader.xml file.  It contains the information for the mapping of a single reader command to a single handler method.  For example, it  lets the command processor of the symbol reader know that if it receives a command with the number '22', it should go to the 'readFullField' command handler method to process this command.You will need one of these tags for every command that you want to support in the reader.&lt;br /&gt;
&lt;br /&gt;
==Sub elements==&lt;br /&gt;
# queryName - The queryName is the unique name of the incoming command.  It should be able to be derived from the incoming command messages somehow.  For example, with the symbol and LLRP readers, all commands have numbers associated with them that identify the type of command.  For the alien reader, which is text-based, the commands all have a unique textual name, such as 'taglist', or 'persistTime'.&lt;br /&gt;
# displayName - The display name is used if the properties view is enabled in the IDE.  It is the name that should be used if a certain property is able to be displayed&lt;br /&gt;
# CommandState - This is a classifier for what state the reader should be in to use the command.  It is not all that important, and should be set to interactive for most readers.&lt;br /&gt;
#CommandHandlerDetails - Information about the commandHandler method that will handle this command&lt;br /&gt;
##HandlerClass - the packagae name of the command.  For example, 'org.rifidi.emulator.reader.symbol.commandhandler.BitEncodedCommands'&lt;br /&gt;
##handlerMethod - the method name.  For example, 'readFullField'&lt;br /&gt;
##argumentType - If the command is used like a property, such as it is in the alien reader, this is the type of the property.  Most readers should probably just use 'string'&lt;br /&gt;
#actionTag - should be set to 'IGNORE'&lt;br /&gt;
#category - again, if the property view is enabled, the category this property should be in.  Most readers should use 'NONE'&lt;br /&gt;
#defaultValue - If this command is a property, the default value of it.  Again, most readers other than the Alien do not use this, and it should be set to 'OFF'&lt;br /&gt;
&lt;br /&gt;
==Reference Implementation==&lt;br /&gt;
This is the command tag for the Read full field command in the symbol reader.  The important parts are the queryName, and the commandHandlerDetails.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	&amp;lt;Command&amp;gt;&lt;br /&gt;
		&amp;lt;queryName&amp;gt;22&amp;lt;/queryName&amp;gt;&lt;br /&gt;
		&amp;lt;displayName&amp;gt;READ_FULL_FIELD&amp;lt;/displayName&amp;gt;&lt;br /&gt;
		&amp;lt;commandState&amp;gt;Interactive&amp;lt;/commandState&amp;gt;&lt;br /&gt;
		&amp;lt;commandHandlerDetails&amp;gt;&lt;br /&gt;
			&amp;lt;handlerClass&amp;gt;org.rifidi.emulator.reader.symbol.commandhandler.BitEncodedCommands&amp;lt;/handlerClass&amp;gt;&lt;br /&gt;
			&amp;lt;handlerMethod&amp;gt;readFullField&amp;lt;/handlerMethod&amp;gt;&lt;br /&gt;
			&amp;lt;argumentType&amp;gt;String&amp;lt;/argumentType&amp;gt;&lt;br /&gt;
		&amp;lt;/commandHandlerDetails&amp;gt;&lt;br /&gt;
		&amp;lt;actionTag&amp;gt;IGNORE&amp;lt;/actionTag&amp;gt;&lt;br /&gt;
		&amp;lt;category&amp;gt;NONE&amp;lt;/category&amp;gt;&lt;br /&gt;
		&amp;lt;defaultValue&amp;gt;OFF&amp;lt;/defaultValue&amp;gt;&lt;br /&gt;
	&amp;lt;/Command&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Because the Alien Reader treats all of its commands as properties that have values that can be displayed, it uses the fields that most readers do not need.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	&amp;lt;Command&amp;gt;&lt;br /&gt;
		&amp;lt;queryName&amp;gt;getPersistTime&amp;lt;/queryName&amp;gt;&lt;br /&gt;
		&amp;lt;queryName&amp;gt;setPersistTime&amp;lt;/queryName&amp;gt;&lt;br /&gt;
		&amp;lt;displayName&amp;gt;PersistTime&amp;lt;/displayName&amp;gt;&lt;br /&gt;
		&amp;lt;commandState&amp;gt;Interactive&amp;lt;/commandState&amp;gt;&lt;br /&gt;
		&amp;lt;commandHandlerDetails&amp;gt;&lt;br /&gt;
			&amp;lt;handlerClass&amp;gt;org.rifidi.emulator.reader.alien.commandhandler.AlienTag&amp;lt;/handlerClass&amp;gt;&lt;br /&gt;
			&amp;lt;handlerMethod&amp;gt;persistTime&amp;lt;/handlerMethod&amp;gt;&lt;br /&gt;
			&amp;lt;argumentType&amp;gt;Integer&amp;lt;/argumentType&amp;gt;&lt;br /&gt;
		&amp;lt;/commandHandlerDetails&amp;gt;&lt;br /&gt;
		&amp;lt;actionTag&amp;gt;EDITABLE&amp;lt;/actionTag&amp;gt;&lt;br /&gt;
		&amp;lt;category&amp;gt;TAG&amp;lt;/category&amp;gt;&lt;br /&gt;
		&amp;lt;defaultValue&amp;gt;-1&amp;lt;/defaultValue&amp;gt;&lt;br /&gt;
	&amp;lt;/Command&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jmaine</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/READERNAME_CATEGORY_Handler.java</id>
		<title>READERNAME CATEGORY Handler.java</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/READERNAME_CATEGORY_Handler.java"/>
				<updated>2008-11-23T23:32:01Z</updated>
		
		<summary type="html">&lt;p&gt;Jmaine: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:developerDoc]][[category:emulatorDoc]]&lt;br /&gt;
The Handler method class is made up of handler methods.  These are special methods designed to take care of one specific reader level command.  For example, when you send a 'get taglist' command to the alien reader, it does the actual work of scanning the radio and getting tags in the taglist command handler.  A handler method class usually has more than one command handler in it, and readers normally have more than one handler method class.  The handler methods can usually be divided up by the type of the command.  For example, in the LLRP reader, the command that deal with ROSpecs are in a different file from the commands dealing with AccessSpecs.&lt;br /&gt;
&lt;br /&gt;
Each Handler method must registered in the [[reader.xml]] file. Please see it for how do it.&lt;br /&gt;
=Command Handler Method=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;public CommandObject commandName(CommandObject arg, AbstractReaderSharedResources asr)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Arguments==&lt;br /&gt;
#arg - The incoming command&lt;br /&gt;
#asr - abstract shared resources&lt;br /&gt;
&lt;br /&gt;
==Return Value==&lt;br /&gt;
A command object where the first object in the commandObject's return value array is the return value of the funtion&lt;br /&gt;
&lt;br /&gt;
==Reference Implementation==&lt;br /&gt;
This is a command handler in the symbol reader.  All this handler method does is return four bytes.  It places the bytes in the first slot in the RetrunValue array in the command object.  This return value will then later be processed into an outgoing message by the formatter.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public CommandObject setSystemParameter(CommandObject arg, AbstractReaderSharedResources asr) {&lt;br /&gt;
    byte[] setSystemParam = { 0x04, 0x06, 0x27, 0x00 };&lt;br /&gt;
    arg.getReturnValue().add(setSystemParam);&lt;br /&gt;
    return arg;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jmaine</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/READERNAME_ReaderSharedResources.java</id>
		<title>READERNAME ReaderSharedResources.java</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/READERNAME_ReaderSharedResources.java"/>
				<updated>2008-11-23T00:21:27Z</updated>
		
		<summary type="html">&lt;p&gt;Jmaine: /* Constructor */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:developerDoc]][[category:emulatorDoc]]&lt;br /&gt;
The SharedResources act as common repository for various objects used in various places in the code.  Each reader should have a shared resources and it should extend AbstractReaderSharedResources.&lt;br /&gt;
&lt;br /&gt;
All of the methods in the shared resources are just getters and setters for the components that are held in it.  The only method that this page will cover is the constructor.&lt;br /&gt;
&lt;br /&gt;
=Constructor=&lt;br /&gt;
The constructor for the shared resources should be called in the [[REDERNAME_Module.java| reader module]].&lt;br /&gt;
The constructor for the shared resources must take in the following things:&lt;br /&gt;
#GenericRadio radio&lt;br /&gt;
#TagMemory tagMemory&lt;br /&gt;
#ControlSignal&amp;lt;Boolean&amp;gt; readerPowerSignal&lt;br /&gt;
#String readerName&lt;br /&gt;
#GenericExceptionHandler geh&lt;br /&gt;
#CommandDigester digester&lt;br /&gt;
#int numberOfAntennas&lt;br /&gt;
&lt;br /&gt;
The first thing that the constructor should do is make a call to its super class:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
		super(radio, tagMemory, readerPowerSignal, readerName, geh digester, numberOfAntennas);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then it should set the rest of the variables that are required by the reader to be in the shared resources. If more than one class or part of the reader needs the same object or information then it should be placed inside the shared resources. For more information see the sharedResources in one of the other readers.&lt;/div&gt;</summary>
		<author><name>Jmaine</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/READERNAME_CommandFormatter.java</id>
		<title>READERNAME CommandFormatter.java</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/READERNAME_CommandFormatter.java"/>
				<updated>2008-11-22T23:22:53Z</updated>
		
		<summary type="html">&lt;p&gt;Jmaine: /* decode */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:developerDoc]][[category:emulatorDoc]]&lt;br /&gt;
This class should implement CommandHandler.  This page goes through each of the four methods in CommandHandler and describes in detail what each one does and how it should be implemented.  The first two methods are important, and the last two methods are not as important.&lt;br /&gt;
&lt;br /&gt;
=decode=&lt;br /&gt;
&lt;br /&gt;
This method needs to decode an incoming command into a command to be handled in the command formatter.  It should put the command into a commandObject and put the commandObject in the first slot in an arraylist and return the arraylist. Normally the command object is a string that Rifidi uses to find the the appropriate command handler. The rest of the slots in the ArrayList may be used to pass arguments to the command handler, i.e. a coherent object that contains the the information already parsed and ready for consumption. For an idea on how to do that, look up the ThingMagic source code.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;public ArrayList&amp;lt;Object&amp;gt; decode(byte[] arg);&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Arguments==&lt;br /&gt;
#arg - The incoming command as an array of bytes.&lt;br /&gt;
&lt;br /&gt;
==Return Value==&lt;br /&gt;
An array of objects where the first object is a command in the correct format to be processed by the command handler&lt;br /&gt;
&lt;br /&gt;
==Reference Implementation==&lt;br /&gt;
This is the decode method in the alien reader&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	public ArrayList&amp;lt;Object&amp;gt; decode(byte[] arg) {&lt;br /&gt;
		if (arg.length == 0) {&lt;br /&gt;
			ArrayList&amp;lt;Object&amp;gt; argArray = new ArrayList&amp;lt;Object&amp;gt;();&lt;br /&gt;
			argArray.add(&amp;quot;&amp;quot;);&lt;br /&gt;
			console = false;&lt;br /&gt;
			return argArray;&lt;br /&gt;
		}&lt;br /&gt;
		String newString = new String(arg);&lt;br /&gt;
&lt;br /&gt;
		logger.debug(&amp;quot;Formatter arg: &amp;quot; + newString);&lt;br /&gt;
&lt;br /&gt;
		ArrayList&amp;lt;Object&amp;gt; retVal = this.parseCommand(newString);&lt;br /&gt;
&lt;br /&gt;
		return retVal;&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=encode=&lt;br /&gt;
After a command has been processed by the command handler, the response it returns must be formatted to be sent back out to the client.&lt;br /&gt;
&amp;lt;pre&amp;gt;public ArrayList&amp;lt;Object&amp;gt; encode(ArrayList&amp;lt;Object&amp;gt; arg);&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Arguments==&lt;br /&gt;
#arg - The return message(s) before they has been processed is in the array of objects&lt;br /&gt;
&lt;br /&gt;
==Return Value==&lt;br /&gt;
An array of objects where each object is a formatted response message ready to be sent back to the client. It must be formatted in a way that [[READERNAME_Protocol.java]]::addProtocol() can understand.&lt;br /&gt;
&lt;br /&gt;
==Reference Implementation==&lt;br /&gt;
This is the encode method for the symbol reader.  Because some commands in the symbol reader need to have more than one response message (e.g. a data message and a final message), more than one raw message can be in the array list in arg.  For each message, the CRC must be calculated and appended.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	public ArrayList&amp;lt;Object&amp;gt; encode(ArrayList&amp;lt;Object&amp;gt; arg) {&lt;br /&gt;
&lt;br /&gt;
		ArrayList&amp;lt;Object&amp;gt; retVal = new ArrayList&amp;lt;Object&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
		for (Object o : arg) {&lt;br /&gt;
			byte[] command = (byte[]) o;&lt;br /&gt;
&lt;br /&gt;
			/*&lt;br /&gt;
			 * Create outgoing array list that is 3 slots bigger than incoming&lt;br /&gt;
			 * one: one for start of frame and two for crc bytes&lt;br /&gt;
			 */&lt;br /&gt;
			byte[] outgoingCommand = new byte[command.length + 3];&lt;br /&gt;
			for (int i = 0; i &amp;lt; command.length; i++) {&lt;br /&gt;
				outgoingCommand[i + 1] = command[i];&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			/* Add Start of Frame Byte */&lt;br /&gt;
			outgoingCommand[0] = 0x01;&lt;br /&gt;
&lt;br /&gt;
			// Calculate CRC&lt;br /&gt;
			int crc = CRC16.calculateCRC(command, 0xBEEF,&lt;br /&gt;
					CRC16.XR400_CRC_TABLE, true);&lt;br /&gt;
			byte[] crcBytes = ByteAndHexConvertingUtility&lt;br /&gt;
					.intToByteArray(crc, 2);&lt;br /&gt;
&lt;br /&gt;
			// put crc in outgoingCommand, LSB first&lt;br /&gt;
			outgoingCommand[outgoingCommand.length - 2] = crcBytes[1];&lt;br /&gt;
			outgoingCommand[outgoingCommand.length - 1] = crcBytes[0];&lt;br /&gt;
			&lt;br /&gt;
			logger.debug(ByteAndHexConvertingUtility.toHexString(outgoingCommand));&lt;br /&gt;
			&lt;br /&gt;
			&lt;br /&gt;
			retVal.add(outgoingCommand);&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return retVal;&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=promptSuppress=&lt;br /&gt;
This method is mainly used by the alien reader to determine if the reader should supress the prompt when sending back a response.  Other readers may need similar functionality.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;public boolean promptSuppress();&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Arguments==&lt;br /&gt;
&lt;br /&gt;
==Return Value==&lt;br /&gt;
true if the prompt should be surpressed&lt;br /&gt;
&lt;br /&gt;
=getActualCommand=&lt;br /&gt;
This method is mainly used by the alien reader to return a string that a user actually typed in.  Other readers may need similar functionality&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;public String getActualCommand(byte[] arg);&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Arguments==&lt;br /&gt;
#arg - The incoming command&lt;br /&gt;
&lt;br /&gt;
==Return Value==&lt;br /&gt;
A string that is the command the user typed in&lt;/div&gt;</summary>
		<author><name>Jmaine</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/ThingMagic</id>
		<title>ThingMagic</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/ThingMagic"/>
				<updated>2008-10-20T00:28:02Z</updated>
		
		<summary type="html">&lt;p&gt;Jmaine: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:developerDoc]][[Category:EmulatorDoc]][[Category:userDoc]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
;Model Number: &lt;br /&gt;
 4&lt;br /&gt;
;Network Protocol: &lt;br /&gt;
SQL like protocol that may be wrapped in ssh, web interface, RCP, and Linux shell login.&lt;br /&gt;
;Communication:   &lt;br /&gt;
10/100 BaseT Ethernet – RJ45&lt;br /&gt;
;Antennas:&lt;br /&gt;
4 read points (4 transmit points, 4 receive points)&lt;br /&gt;
;General Purpose I/O:&lt;br /&gt;
(To Do)&lt;br /&gt;
&lt;br /&gt;
==Basis of Virtual Reader==&lt;br /&gt;
The reader accepts SQL style protocol and returns the appropriate information.&lt;br /&gt;
&lt;br /&gt;
===Documentation===&lt;br /&gt;
 &lt;br /&gt;
===Client Tools===&lt;br /&gt;
Telnet, SSH clients, and Tag Centric&lt;br /&gt;
&lt;br /&gt;
==Reader Design==&lt;br /&gt;
This section will give a brief overview of how the hardware reader operates for the purposes of emulation. &lt;br /&gt;
Here is the architecture for the emulator: [[ThingMagic/Emulator_Architecture]] [Deprecated]&lt;br /&gt;
===Communication===&lt;br /&gt;
&lt;br /&gt;
====Protocols====&lt;br /&gt;
The main method for communicating with the reader is via TCP, TCP+SSH on port 8080, web interface, and RCP.&lt;br /&gt;
&lt;br /&gt;
===Memory Model===&lt;br /&gt;
The memory model is like a state based database.&lt;br /&gt;
===Getting Tags===&lt;br /&gt;
Getting tags is fairly simple just execute:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
telnet [reader ip address] 8080&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Then type:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id from tag_id set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Note: the semicolon at the end of each command is necessary.&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
One can also return multiple items:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id, protocol_id from tag_id set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also add filters or conditionals:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id from tag_id where [condition or filter] set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Note: The where clause only works on tag_id or tag_data tables. Only '''protocol_id''' can have a string in the where clause.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In addition more than one statement can be put on more than one line.&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id from tag_id set time_out=[milliseconds]; select protocol from tag_id set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tag Centric reads tags in the following manner:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id,read_count from tag_id WHERE (protocol_id='EPC0' and protocol_id='EPC1' and protocol_id='GEN2') set time_out=200;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
From this, one can tell if two conditions conjoined with 'AND' use the same column name, it counts as a logical 'OR'.&lt;br /&gt;
====Timer====&lt;br /&gt;
&lt;br /&gt;
====Autonomous Mode and Cursors====&lt;br /&gt;
First create a cursor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
declare cursor_name cursor for select id, protocol_id from tag_table;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To use the cursor just once... &lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
fetch cursor_name;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
One may add more cursors to the fetch list by separating them by commas.&lt;br /&gt;
&lt;br /&gt;
To turn on auto mode:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
set auto cursorlist = ON;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To add in additional delay between one tag read operation and another:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
set auto cursorlist = on, repeat = 500;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
NOTE: 500 is the minimum time between the start of one tag read operation to the start of another. This ''includes'' any time_out value in the select command used for the cursor.&lt;br /&gt;
&lt;br /&gt;
To set the delay between the end of the cursor list to the beginning of it repeating again, use:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
SET repeat = 1000;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To turn auto mode off:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
SET auto = OFF;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
NOTE: Do not try to use any other command while auto mode is on; it may cause an ''undesirable undefined'' operation.&lt;br /&gt;
&lt;br /&gt;
To delete a cursor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
close cursor_name;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
NOTE: only one cursor can be close/deleted at a time, and no cursor lists are allowed in the syntax of this command.&lt;br /&gt;
&lt;br /&gt;
====Reset====&lt;br /&gt;
To reset the reader as if there where no cursors defined and no tags read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
reset;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Login===&lt;br /&gt;
By SSH log in.&lt;br /&gt;
&lt;br /&gt;
===RQL Schema===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ tag_id&lt;br /&gt;
! Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R || protocol_id || Int&lt;br /&gt;
|-&lt;br /&gt;
|R || antenna_id || Int&lt;br /&gt;
|-&lt;br /&gt;
|R || read_count || Int&lt;br /&gt;
|-&lt;br /&gt;
| R/W || id || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|W || killed || Int&lt;br /&gt;
|-&lt;br /&gt;
|W || password || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|R || locked || Int&lt;br /&gt;
|-&lt;br /&gt;
|R || frequency || Int&lt;br /&gt;
|-&lt;br /&gt;
|R || dspmicros || Int&lt;br /&gt;
|-&lt;br /&gt;
|R  || timestamp || String&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ tag_data&lt;br /&gt;
! Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R || id || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || block number || Int&lt;br /&gt;
|-&lt;br /&gt;
|R/W || data || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|R || locked || Int&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ settings&lt;br /&gt;
! Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R || current_time || String&lt;br /&gt;
|-               &lt;br /&gt;
|R || version || String&lt;br /&gt;
|-&lt;br /&gt;
|R || supported_protocols || String&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ io&lt;br /&gt;
!Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R/W || data || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ saved_settings&lt;br /&gt;
!Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R/W || hostname || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || iface || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || dhcpcd || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ip_address || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || netmask || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || gateway || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ntp_servers || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || 1tx_power || String&lt;br /&gt;
|-            &lt;br /&gt;
|R/W || uhf_power_centidbm || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || epc1_id_length || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || primary_dns || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || secondary_dns || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || domain_name || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || reader_description || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || reader_role || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ant1_readpoint_descr || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ant2_readpoint_descr || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ant3_readpoint_descr || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ant4_readpoint_descr || String&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Supported Features==&lt;br /&gt;
All tables except tag_data are supported. Where clause only works on tag_id and tag_data on the real reader. Automode is working.&lt;br /&gt;
&lt;br /&gt;
Only no-complex (simple) where clauses are supported now only for the '''select''' command, like:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id,read_count from tag_id WHERE protocol_id='GEN2';&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Adding and removing cursors works. Also automode works (see above examples).&lt;br /&gt;
==Unsupported Features &amp;amp; Bugs==&lt;br /&gt;
Tag_data table and compound conditions are not supported. ThingMagic, Mercury 5 reader RQL features are also not supported. Login by ssh is not supported. Also the time_out feature for reading tags is not supported yet. Complex where clauses are not currently supported but may be in a future release.&lt;br /&gt;
&lt;br /&gt;
==Features that might never be supported==&lt;br /&gt;
Linux shell access to reader. This is fairly complex and require to emulate the entire hardware infrastructure of the reader and an ARM possessor. Also the web and RCP interface might be developed at a later time.&lt;/div&gt;</summary>
		<author><name>Jmaine</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/ThingMagic</id>
		<title>ThingMagic</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/ThingMagic"/>
				<updated>2008-10-20T00:09:44Z</updated>
		
		<summary type="html">&lt;p&gt;Jmaine: /* Getting Tags */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:developerDoc]][[Category:EmulatorDoc]][[Category:userDoc]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
;Model Number: &lt;br /&gt;
 4&lt;br /&gt;
;Network Protocol: &lt;br /&gt;
SQL like protocol that may be wrapped in ssh, web interface, RCP, and Linux shell login.&lt;br /&gt;
;Communication:   &lt;br /&gt;
10/100 BaseT Ethernet – RJ45&lt;br /&gt;
;Antennas:&lt;br /&gt;
4 read points (4 transmit points, 4 receive points)&lt;br /&gt;
;General Purpose I/O:&lt;br /&gt;
(To Do)&lt;br /&gt;
&lt;br /&gt;
==Basis of Virtual Reader==&lt;br /&gt;
The reader accepts SQL style protocol and returns the appropriate information.&lt;br /&gt;
&lt;br /&gt;
===Documentation===&lt;br /&gt;
 &lt;br /&gt;
===Client Tools===&lt;br /&gt;
Telnet, SSH clients, and Tag Centric&lt;br /&gt;
&lt;br /&gt;
==Reader Design==&lt;br /&gt;
This section will give a brief overview of how the hardware reader operates for the purposes of emulation. &lt;br /&gt;
Here is the architecture for the emulator: [[ThingMagic/Emulator_Architecture]] [Deprecated]&lt;br /&gt;
===Communication===&lt;br /&gt;
&lt;br /&gt;
====Protocols====&lt;br /&gt;
The main method for communicating with the reader is via TCP, TCP+SSH on port 8080, web interface, and RCP.&lt;br /&gt;
&lt;br /&gt;
===Memory Model===&lt;br /&gt;
The memory model is like a state based database.&lt;br /&gt;
===Getting Tags===&lt;br /&gt;
Getting tags is fairly simple just execute:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
telnet [reader ip address] 8080&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Then type:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id from tag_id set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Note: the semicolon at the end of each command is necessary.&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
One can also return multiple items:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id, protocol_id from tag_id set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also add filters or conditionals:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id from tag_id where [condition or filter] set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Note: The where clause only works on tag_id or tag_data tables. Only '''protocol_id''' can have a string in the where clause.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In addition more than one statement can be put on more than one line.&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id from tag_id set time_out=[milliseconds]; select protocol from tag_id set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tag Centric reads tags in the following manner:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id,read_count from tag_id WHERE (protocol_id='EPC0' and protocol_id='EPC1' and protocol_id='GEN2') set time_out=200;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
From this, one can tell if two conditions conjoined with 'AND' use the same column name, it counts as a logical 'OR'.&lt;br /&gt;
====Timer====&lt;br /&gt;
&lt;br /&gt;
====Autonomous Mode and Cursors====&lt;br /&gt;
First create a cursor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
declare cursor_name cursor for select id, protocol_id from tag_table;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To use the cursor just once... &lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
fetch cursor_name;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
One may add more cursors to the fetch list by separating them by commas.&lt;br /&gt;
&lt;br /&gt;
To turn on auto mode:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
set auto cursorlist = ON;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To add in additional delay between one tag read operation and another:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
set auto cursorlist = on, repeat = 500;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
NOTE: 500 is the minimum time between the start of one tag read operation to the start of another. This ''includes'' any time_out value in the select command used for the cursor.&lt;br /&gt;
&lt;br /&gt;
To set the delay between the end of the cursor list to the beginning of it repeating again, use:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
SET repeat = 1000;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To turn auto mode off:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
SET auto = OFF;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
NOTE: Do not try to use any other command while auto mode is on; it may cause an ''undesirable undefined'' operation.&lt;br /&gt;
&lt;br /&gt;
To delete a cursor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
close cursor_name;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
NOTE: only one cursor can be close/deleted at a time, and no cursor lists are allowed in the syntax of this command.&lt;br /&gt;
&lt;br /&gt;
====Reset====&lt;br /&gt;
To reset the reader as if there where no cursors defined and no tags read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
reset;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Login===&lt;br /&gt;
By SSH log in.&lt;br /&gt;
&lt;br /&gt;
===RQL Schema===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ tag_id&lt;br /&gt;
! Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R || protocol_id || Int&lt;br /&gt;
|-&lt;br /&gt;
|R || antenna_id || Int&lt;br /&gt;
|-&lt;br /&gt;
|R || read_count || Int&lt;br /&gt;
|-&lt;br /&gt;
| R/W || id || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|W || killed || Int&lt;br /&gt;
|-&lt;br /&gt;
|W || password || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|R || locked || Int&lt;br /&gt;
|-&lt;br /&gt;
|R || frequency || Int&lt;br /&gt;
|-&lt;br /&gt;
|R || dspmicros || Int&lt;br /&gt;
|-&lt;br /&gt;
|R  || timestamp || String&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ tag_data&lt;br /&gt;
! Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R || id || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || block number || Int&lt;br /&gt;
|-&lt;br /&gt;
|R/W || data || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|R || locked || Int&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ settings&lt;br /&gt;
! Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R || current_time || String&lt;br /&gt;
|-               &lt;br /&gt;
|R || version || String&lt;br /&gt;
|-&lt;br /&gt;
|R || supported_protocols || String&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ io&lt;br /&gt;
!Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R/W || data || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ saved_settings&lt;br /&gt;
!Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R/W || hostname || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || iface || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || dhcpcd || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ip_address || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || netmask || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || gateway || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ntp_servers || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || 1tx_power || String&lt;br /&gt;
|-            &lt;br /&gt;
|R/W || uhf_power_centidbm || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || epc1_id_length || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || primary_dns || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || secondary_dns || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || domain_name || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || reader_description || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || reader_role || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ant1_readpoint_descr || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ant2_readpoint_descr || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ant3_readpoint_descr || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ant4_readpoint_descr || String&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Supported Features==&lt;br /&gt;
All tables except tag_data are supported. Where clause only works on tag_id and tag_data on the real reader. Automode is working.&lt;br /&gt;
&lt;br /&gt;
==Unsupported Features &amp;amp; Bugs==&lt;br /&gt;
Tag_data table and compound conditions are not supported. ThingMagic, Mercury 5 reader RQL features are also not supported. Login by ssh is not supported. Also the time_out feature for reading tags is not supported yet.&lt;br /&gt;
&lt;br /&gt;
==Features that might never be supported==&lt;br /&gt;
Linux shell access to reader. This is fairly complex and require to emulate the entire hardware infrastructure of the reader and an ARM possessor. Also the web and RCP interface might be developed at a later time.&lt;/div&gt;</summary>
		<author><name>Jmaine</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/ThingMagic</id>
		<title>ThingMagic</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/ThingMagic"/>
				<updated>2008-10-20T00:07:43Z</updated>
		
		<summary type="html">&lt;p&gt;Jmaine: /* Autonomous Mode and Cursors */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:developerDoc]][[Category:EmulatorDoc]][[Category:userDoc]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
;Model Number: &lt;br /&gt;
 4&lt;br /&gt;
;Network Protocol: &lt;br /&gt;
SQL like protocol that may be wrapped in ssh, web interface, RCP, and Linux shell login.&lt;br /&gt;
;Communication:   &lt;br /&gt;
10/100 BaseT Ethernet – RJ45&lt;br /&gt;
;Antennas:&lt;br /&gt;
4 read points (4 transmit points, 4 receive points)&lt;br /&gt;
;General Purpose I/O:&lt;br /&gt;
(To Do)&lt;br /&gt;
&lt;br /&gt;
==Basis of Virtual Reader==&lt;br /&gt;
The reader accepts SQL style protocol and returns the appropriate information.&lt;br /&gt;
&lt;br /&gt;
===Documentation===&lt;br /&gt;
 &lt;br /&gt;
===Client Tools===&lt;br /&gt;
Telnet, SSH clients, and Tag Centric&lt;br /&gt;
&lt;br /&gt;
==Reader Design==&lt;br /&gt;
This section will give a brief overview of how the hardware reader operates for the purposes of emulation. &lt;br /&gt;
Here is the architecture for the emulator: [[ThingMagic/Emulator_Architecture]] [Deprecated]&lt;br /&gt;
===Communication===&lt;br /&gt;
&lt;br /&gt;
====Protocols====&lt;br /&gt;
The main method for communicating with the reader is via TCP, TCP+SSH on port 8080, web interface, and RCP.&lt;br /&gt;
&lt;br /&gt;
===Memory Model===&lt;br /&gt;
The memory model is like a state based database.&lt;br /&gt;
===Getting Tags===&lt;br /&gt;
Getting tags is fairly simple just execute:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
telnet [reader ip address] 8080&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Then type:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id from tag_id set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Note: the semicolon at the end of each command is necessary.&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
One can also return multiple items:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id, protocol_id from tag_id set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also add filters or conditionals:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id from tag_id where [condition or filter] set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In addition more than one statement can be put on more than one line.&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id from tag_id set time_out=[milliseconds]; select protocol from tag_id set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tag Centric reads tags in the following manner:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id,read_count from tag_id WHERE (protocol_id='EPC0' and protocol_id='EPC1' and protocol_id='GEN2') set time_out=200;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
From this, one can tell if two conditions conjoined with 'AND' use the same column name, it counts as a logical 'OR'.&lt;br /&gt;
====Timer====&lt;br /&gt;
&lt;br /&gt;
====Autonomous Mode and Cursors====&lt;br /&gt;
First create a cursor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
declare cursor_name cursor for select id, protocol_id from tag_table;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To use the cursor just once... &lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
fetch cursor_name;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
One may add more cursors to the fetch list by separating them by commas.&lt;br /&gt;
&lt;br /&gt;
To turn on auto mode:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
set auto cursorlist = ON;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To add in additional delay between one tag read operation and another:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
set auto cursorlist = on, repeat = 500;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
NOTE: 500 is the minimum time between the start of one tag read operation to the start of another. This ''includes'' any time_out value in the select command used for the cursor.&lt;br /&gt;
&lt;br /&gt;
To set the delay between the end of the cursor list to the beginning of it repeating again, use:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
SET repeat = 1000;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To turn auto mode off:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
SET auto = OFF;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
NOTE: Do not try to use any other command while auto mode is on; it may cause an ''undesirable undefined'' operation.&lt;br /&gt;
&lt;br /&gt;
To delete a cursor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
close cursor_name;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
NOTE: only one cursor can be close/deleted at a time, and no cursor lists are allowed in the syntax of this command.&lt;br /&gt;
&lt;br /&gt;
====Reset====&lt;br /&gt;
To reset the reader as if there where no cursors defined and no tags read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
reset;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Login===&lt;br /&gt;
By SSH log in.&lt;br /&gt;
&lt;br /&gt;
===RQL Schema===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ tag_id&lt;br /&gt;
! Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R || protocol_id || Int&lt;br /&gt;
|-&lt;br /&gt;
|R || antenna_id || Int&lt;br /&gt;
|-&lt;br /&gt;
|R || read_count || Int&lt;br /&gt;
|-&lt;br /&gt;
| R/W || id || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|W || killed || Int&lt;br /&gt;
|-&lt;br /&gt;
|W || password || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|R || locked || Int&lt;br /&gt;
|-&lt;br /&gt;
|R || frequency || Int&lt;br /&gt;
|-&lt;br /&gt;
|R || dspmicros || Int&lt;br /&gt;
|-&lt;br /&gt;
|R  || timestamp || String&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ tag_data&lt;br /&gt;
! Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R || id || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || block number || Int&lt;br /&gt;
|-&lt;br /&gt;
|R/W || data || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|R || locked || Int&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ settings&lt;br /&gt;
! Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R || current_time || String&lt;br /&gt;
|-               &lt;br /&gt;
|R || version || String&lt;br /&gt;
|-&lt;br /&gt;
|R || supported_protocols || String&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ io&lt;br /&gt;
!Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R/W || data || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ saved_settings&lt;br /&gt;
!Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R/W || hostname || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || iface || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || dhcpcd || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ip_address || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || netmask || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || gateway || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ntp_servers || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || 1tx_power || String&lt;br /&gt;
|-            &lt;br /&gt;
|R/W || uhf_power_centidbm || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || epc1_id_length || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || primary_dns || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || secondary_dns || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || domain_name || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || reader_description || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || reader_role || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ant1_readpoint_descr || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ant2_readpoint_descr || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ant3_readpoint_descr || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ant4_readpoint_descr || String&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Supported Features==&lt;br /&gt;
All tables except tag_data are supported. Where clause only works on tag_id and tag_data on the real reader. Automode is working.&lt;br /&gt;
&lt;br /&gt;
==Unsupported Features &amp;amp; Bugs==&lt;br /&gt;
Tag_data table and compound conditions are not supported. ThingMagic, Mercury 5 reader RQL features are also not supported. Login by ssh is not supported. Also the time_out feature for reading tags is not supported yet.&lt;br /&gt;
&lt;br /&gt;
==Features that might never be supported==&lt;br /&gt;
Linux shell access to reader. This is fairly complex and require to emulate the entire hardware infrastructure of the reader and an ARM possessor. Also the web and RCP interface might be developed at a later time.&lt;/div&gt;</summary>
		<author><name>Jmaine</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/ThingMagic</id>
		<title>ThingMagic</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/ThingMagic"/>
				<updated>2008-10-20T00:06:48Z</updated>
		
		<summary type="html">&lt;p&gt;Jmaine: /* Reader Design */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:developerDoc]][[Category:EmulatorDoc]][[Category:userDoc]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
;Model Number: &lt;br /&gt;
 4&lt;br /&gt;
;Network Protocol: &lt;br /&gt;
SQL like protocol that may be wrapped in ssh, web interface, RCP, and Linux shell login.&lt;br /&gt;
;Communication:   &lt;br /&gt;
10/100 BaseT Ethernet – RJ45&lt;br /&gt;
;Antennas:&lt;br /&gt;
4 read points (4 transmit points, 4 receive points)&lt;br /&gt;
;General Purpose I/O:&lt;br /&gt;
(To Do)&lt;br /&gt;
&lt;br /&gt;
==Basis of Virtual Reader==&lt;br /&gt;
The reader accepts SQL style protocol and returns the appropriate information.&lt;br /&gt;
&lt;br /&gt;
===Documentation===&lt;br /&gt;
 &lt;br /&gt;
===Client Tools===&lt;br /&gt;
Telnet, SSH clients, and Tag Centric&lt;br /&gt;
&lt;br /&gt;
==Reader Design==&lt;br /&gt;
This section will give a brief overview of how the hardware reader operates for the purposes of emulation. &lt;br /&gt;
Here is the architecture for the emulator: [[ThingMagic/Emulator_Architecture]] [Deprecated]&lt;br /&gt;
===Communication===&lt;br /&gt;
&lt;br /&gt;
====Protocols====&lt;br /&gt;
The main method for communicating with the reader is via TCP, TCP+SSH on port 8080, web interface, and RCP.&lt;br /&gt;
&lt;br /&gt;
===Memory Model===&lt;br /&gt;
The memory model is like a state based database.&lt;br /&gt;
===Getting Tags===&lt;br /&gt;
Getting tags is fairly simple just execute:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
telnet [reader ip address] 8080&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Then type:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id from tag_id set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Note: the semicolon at the end of each command is necessary.&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
One can also return multiple items:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id, protocol_id from tag_id set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also add filters or conditionals:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id from tag_id where [condition or filter] set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In addition more than one statement can be put on more than one line.&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id from tag_id set time_out=[milliseconds]; select protocol from tag_id set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tag Centric reads tags in the following manner:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id,read_count from tag_id WHERE (protocol_id='EPC0' and protocol_id='EPC1' and protocol_id='GEN2') set time_out=200;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
From this, one can tell if two conditions conjoined with 'AND' use the same column name, it counts as a logical 'OR'.&lt;br /&gt;
====Timer====&lt;br /&gt;
&lt;br /&gt;
====Autonomous Mode and Cursors====&lt;br /&gt;
First create a cursor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
declare cursor_name cursor for select id, protocol_id from tag_table;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To use the cursor just once... &lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
fetch cursor_name;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
One may add more cursors to the fetch list by separating them by commas.&lt;br /&gt;
&lt;br /&gt;
To turn on auto mode:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
set auto cursorlist = ON;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To add in additional delay between one tag read operation and another:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
set auto cursorlist = on, repeat = 500;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
NOTE: 500 is the minimum time between the start of one tag read operation to the start of another. This ''includes'' any time_out value in the select command used for the cursor.&lt;br /&gt;
&lt;br /&gt;
To set the delay between the end of the cursor list to the beginning of it repeating again, use:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
SET repeat = 1000;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To turn auto mode off:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
SET auto = OFF;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
NOTE: Do not try to use any other command while auto mode is on; it may cause an undesirable undefined operation.&lt;br /&gt;
&lt;br /&gt;
To delete a cursor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
close cursor_name;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
NOTE: only one cursor can be close/deleted at a time, and no cursor lists are allowed in the syntax of this command.&lt;br /&gt;
&lt;br /&gt;
====Reset====&lt;br /&gt;
To reset the reader as if there where no cursors defined and no tags read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
reset;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Login===&lt;br /&gt;
By SSH log in.&lt;br /&gt;
&lt;br /&gt;
===RQL Schema===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ tag_id&lt;br /&gt;
! Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R || protocol_id || Int&lt;br /&gt;
|-&lt;br /&gt;
|R || antenna_id || Int&lt;br /&gt;
|-&lt;br /&gt;
|R || read_count || Int&lt;br /&gt;
|-&lt;br /&gt;
| R/W || id || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|W || killed || Int&lt;br /&gt;
|-&lt;br /&gt;
|W || password || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|R || locked || Int&lt;br /&gt;
|-&lt;br /&gt;
|R || frequency || Int&lt;br /&gt;
|-&lt;br /&gt;
|R || dspmicros || Int&lt;br /&gt;
|-&lt;br /&gt;
|R  || timestamp || String&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ tag_data&lt;br /&gt;
! Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R || id || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || block number || Int&lt;br /&gt;
|-&lt;br /&gt;
|R/W || data || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|R || locked || Int&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ settings&lt;br /&gt;
! Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R || current_time || String&lt;br /&gt;
|-               &lt;br /&gt;
|R || version || String&lt;br /&gt;
|-&lt;br /&gt;
|R || supported_protocols || String&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ io&lt;br /&gt;
!Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R/W || data || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ saved_settings&lt;br /&gt;
!Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R/W || hostname || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || iface || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || dhcpcd || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ip_address || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || netmask || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || gateway || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ntp_servers || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || 1tx_power || String&lt;br /&gt;
|-            &lt;br /&gt;
|R/W || uhf_power_centidbm || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || epc1_id_length || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || primary_dns || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || secondary_dns || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || domain_name || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || reader_description || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || reader_role || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ant1_readpoint_descr || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ant2_readpoint_descr || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ant3_readpoint_descr || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ant4_readpoint_descr || String&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Supported Features==&lt;br /&gt;
All tables except tag_data are supported. Where clause only works on tag_id and tag_data on the real reader. Automode is working.&lt;br /&gt;
&lt;br /&gt;
==Unsupported Features &amp;amp; Bugs==&lt;br /&gt;
Tag_data table and compound conditions are not supported. ThingMagic, Mercury 5 reader RQL features are also not supported. Login by ssh is not supported. Also the time_out feature for reading tags is not supported yet.&lt;br /&gt;
&lt;br /&gt;
==Features that might never be supported==&lt;br /&gt;
Linux shell access to reader. This is fairly complex and require to emulate the entire hardware infrastructure of the reader and an ARM possessor. Also the web and RCP interface might be developed at a later time.&lt;/div&gt;</summary>
		<author><name>Jmaine</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/Emulator_1.5.2</id>
		<title>Emulator 1.5.2</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/Emulator_1.5.2"/>
				<updated>2008-10-13T14:46:55Z</updated>
		
		<summary type="html">&lt;p&gt;Jmaine: /* New Features */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=New Features=&lt;br /&gt;
This section describes some of the new features in release 1.5.2 --COMING SOON--&lt;br /&gt;
&lt;br /&gt;
Testing with [[OpenJDK6]].&lt;br /&gt;
 &lt;br /&gt;
==Alien==&lt;br /&gt;
&lt;br /&gt;
1. Uptime for the Alien is now accurate.  &lt;br /&gt;
&lt;br /&gt;
2. Fixed some bugs with GPIO view. &lt;br /&gt;
&lt;br /&gt;
3. Added LEDs instead of checkboxes to determine if GPOs are high or low.  The LED icons come from [http://www.modernlifeisrubbish.co.uk/ Stuart Brown's] website [http://www.modernlifeisrubbish.co.uk/article/led-icons here].  &lt;br /&gt;
&lt;br /&gt;
==ThingMagic==&lt;br /&gt;
&lt;br /&gt;
1.&lt;br /&gt;
&lt;br /&gt;
=Bug Fixes=&lt;br /&gt;
The following section describes a few of the bugs that have been fixed in this release&lt;br /&gt;
&lt;br /&gt;
==Bug [ 12 ] Alien %i custom format doesn't work==&lt;br /&gt;
https://67.207.137.86/trac/rep-external-trac/ticket/12&lt;br /&gt;
==Bug [ 17 ] Null pointer for blank login credentials==&lt;br /&gt;
https://67.207.137.86/trac/rep-external-trac/ticket/17&lt;br /&gt;
==Bug [ 32 ] Alien GPI/O in Automode error. AutoTrueOutput not being set to true==&lt;br /&gt;
https://67.207.137.86/trac/rep-external-trac/ticket/32&lt;br /&gt;
==Bug [ 50 ] Emulator crashes if a reader command returns null==&lt;br /&gt;
https://67.207.137.86/trac/rep-external-trac/ticket/50&lt;/div&gt;</summary>
		<author><name>Jmaine</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/ThingMagic</id>
		<title>ThingMagic</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/ThingMagic"/>
				<updated>2008-10-08T17:06:39Z</updated>
		
		<summary type="html">&lt;p&gt;Jmaine: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:developerDoc]][[Category:EmulatorDoc]][[Category:userDoc]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
;Model Number: &lt;br /&gt;
 4&lt;br /&gt;
;Network Protocol: &lt;br /&gt;
SQL like protocol that may be wrapped in ssh, web interface, RCP, and Linux shell login.&lt;br /&gt;
;Communication:   &lt;br /&gt;
10/100 BaseT Ethernet – RJ45&lt;br /&gt;
;Antennas:&lt;br /&gt;
4 read points (4 transmit points, 4 receive points)&lt;br /&gt;
;General Purpose I/O:&lt;br /&gt;
(To Do)&lt;br /&gt;
&lt;br /&gt;
==Basis of Virtual Reader==&lt;br /&gt;
The reader accepts SQL style protocol and returns the appropriate information.&lt;br /&gt;
&lt;br /&gt;
===Documentation===&lt;br /&gt;
 &lt;br /&gt;
===Client Tools===&lt;br /&gt;
Telnet, SSH clients, and Tag Centric&lt;br /&gt;
&lt;br /&gt;
==Reader Design==&lt;br /&gt;
This section will give a brief overview of how the hardware reader operates for the purposes of emulation. &lt;br /&gt;
Here is the architecture for the emulator: [[ThingMagic/Emulator_Architecture]]&lt;br /&gt;
===Communication===&lt;br /&gt;
&lt;br /&gt;
====Protocols====&lt;br /&gt;
The main method for communicating with the reader is via TCP, TCP+SSH on port 8080, web interface, and RCP.&lt;br /&gt;
&lt;br /&gt;
===Memory Model===&lt;br /&gt;
The memory model is like a state based database.&lt;br /&gt;
===Getting Tags===&lt;br /&gt;
Getting tags is fairly simple just execute:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
telnet [reader ip address] 8080&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Then type:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id from tag_id set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Note: the semicolon at the end of each command is necessary.&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
One can also return multiple items:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id, protocol_id from tag_id set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also add filters or conditionals:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id from tag_id where [condition or filter] set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In addition more than one statement can be put on more than one line.&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id from tag_id set time_out=[milliseconds]; select protocol from tag_id set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tag Centric reads tags in the following manner:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id,read_count from tag_id WHERE (protocol_id='EPC0' and protocol_id='EPC1' and protocol_id='GEN2') set time_out=200;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
From this, one can tell if two conditions conjoined with 'AND' use the same column name, it counts as a logical 'OR'.&lt;br /&gt;
====Timer====&lt;br /&gt;
&lt;br /&gt;
====Autonomous Mode and Cursors====&lt;br /&gt;
First create a cursor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
declare cursor_name cursor for select id, protocol_id from tag_table;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To use the cursor just once... &lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
fetch cursor_name;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
One may add more cursors to the fetch list by separating them by commas.&lt;br /&gt;
&lt;br /&gt;
To turn on auto mode:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
set auto cursorlist = ON;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To add in additional delay between one tag read operation and another:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
set auto cursorlist = on, repeat = 500;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
NOTE: 500 is the minimum time between the start of one tag read operation to the start of another. This ''includes'' any time_out value in the select command used for the cursor.&lt;br /&gt;
&lt;br /&gt;
To set the delay between the end of the cursor list to the beginning of it repeating again, use:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
SET repeat = 1000;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To turn auto mode off:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
SET auto = OFF;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
NOTE: Do not try to use any other command while auto mode is on; it may cause an undesirable undefined operation.&lt;br /&gt;
&lt;br /&gt;
To delete a cursor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
close cursor_name;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
NOTE: only one cursor can be close/deleted at a time, and no cursor lists are allowed in the syntax of this command.&lt;br /&gt;
&lt;br /&gt;
====Reset====&lt;br /&gt;
To reset the reader as if there where no cursors defined and no tags read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
reset;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Login===&lt;br /&gt;
By SSH log in.&lt;br /&gt;
&lt;br /&gt;
===RQL Schema===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ tag_id&lt;br /&gt;
! Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R || protocol_id || Int&lt;br /&gt;
|-&lt;br /&gt;
|R || antenna_id || Int&lt;br /&gt;
|-&lt;br /&gt;
|R || read_count || Int&lt;br /&gt;
|-&lt;br /&gt;
| R/W || id || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|W || killed || Int&lt;br /&gt;
|-&lt;br /&gt;
|W || password || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|R || locked || Int&lt;br /&gt;
|-&lt;br /&gt;
|R || frequency || Int&lt;br /&gt;
|-&lt;br /&gt;
|R || dspmicros || Int&lt;br /&gt;
|-&lt;br /&gt;
|R  || timestamp || String&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ tag_data&lt;br /&gt;
! Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R || id || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || block number || Int&lt;br /&gt;
|-&lt;br /&gt;
|R/W || data || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|R || locked || Int&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ settings&lt;br /&gt;
! Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R || current_time || String&lt;br /&gt;
|-               &lt;br /&gt;
|R || version || String&lt;br /&gt;
|-&lt;br /&gt;
|R || supported_protocols || String&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ io&lt;br /&gt;
!Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R/W || data || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ saved_settings&lt;br /&gt;
!Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R/W || hostname || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || iface || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || dhcpcd || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ip_address || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || netmask || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || gateway || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ntp_servers || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || 1tx_power || String&lt;br /&gt;
|-            &lt;br /&gt;
|R/W || uhf_power_centidbm || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || epc1_id_length || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || primary_dns || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || secondary_dns || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || domain_name || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || reader_description || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || reader_role || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ant1_readpoint_descr || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ant2_readpoint_descr || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ant3_readpoint_descr || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ant4_readpoint_descr || String&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Supported Features==&lt;br /&gt;
All tables except tag_data are supported. Where clause only works on tag_id and tag_data on the real reader. Automode is working.&lt;br /&gt;
&lt;br /&gt;
==Unsupported Features &amp;amp; Bugs==&lt;br /&gt;
Tag_data table and compound conditions are not supported. ThingMagic, Mercury 5 reader RQL features are also not supported. Login by ssh is not supported. Also the time_out feature for reading tags is not supported yet.&lt;br /&gt;
&lt;br /&gt;
==Features that might never be supported==&lt;br /&gt;
Linux shell access to reader. This is fairly complex and require to emulate the entire hardware infrastructure of the reader and an ARM possessor. Also the web and RCP interface might be developed at a later time.&lt;/div&gt;</summary>
		<author><name>Jmaine</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/ThingMagic</id>
		<title>ThingMagic</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/ThingMagic"/>
				<updated>2008-10-08T17:05:57Z</updated>
		
		<summary type="html">&lt;p&gt;Jmaine: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:developerDoc]][[Category:EmulatorDoc]][[Category:userDoc]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
;Model Number: &lt;br /&gt;
 4&lt;br /&gt;
;Network Protocol: &lt;br /&gt;
SQL like protocol that may be wrapped in ssh, web interface, RCP, and Linux shell login.&lt;br /&gt;
;Communication:   &lt;br /&gt;
10/100 BaseT Ethernet – RJ45&lt;br /&gt;
;Antennas:&lt;br /&gt;
4 read points (4 transmit points, 4 receive points)&lt;br /&gt;
;General Purpose I/O:&lt;br /&gt;
(To Do)&lt;br /&gt;
&lt;br /&gt;
==Basis of Virtual Reader==&lt;br /&gt;
The reader accepts SQL style protocol and returns the appropriate information.&lt;br /&gt;
&lt;br /&gt;
===Documentation===&lt;br /&gt;
 &lt;br /&gt;
===Client Tools===&lt;br /&gt;
Telnet, SSH clients, and Tag Centric&lt;br /&gt;
&lt;br /&gt;
==Reader Design==&lt;br /&gt;
This section will give a brief overview of how the hardware reader operates for the purposes of emulation. &lt;br /&gt;
Here is the architecture for the emulator: [[ThingMagic/Emulator_Architecture]]&lt;br /&gt;
===Communication===&lt;br /&gt;
&lt;br /&gt;
====Protocols====&lt;br /&gt;
The main method for communicating with the reader is via TCP, TCP+SSH on port 8080, web interface, and RCP.&lt;br /&gt;
&lt;br /&gt;
===Memory Model===&lt;br /&gt;
The memory model is like a state based database.&lt;br /&gt;
===Getting Tags===&lt;br /&gt;
Getting tags is fairly simple just execute:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
telnet [reader ip address] 8080&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Then type:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id from tag_id set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Note: the semicolon at the end of each command is necessary.&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
One can also return multiple items:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id, protocol_id from tag_id set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also add filters or conditionals:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id from tag_id where [condition or filter] set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In addition more than one statement can be put on more than one line.&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id from tag_id set time_out=[milliseconds]; select protocol from tag_id set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tag Centric reads tags in the following manner:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id,read_count from tag_id WHERE (protocol_id='EPC0' and protocol_id='EPC1' and protocol_id='GEN2') set time_out=200;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
From this, one can tell if two conditions conjoined with 'AND' use the same column name, it counts as a logical 'OR'.&lt;br /&gt;
====Timer====&lt;br /&gt;
&lt;br /&gt;
====Autonomous Mode and Cursors====&lt;br /&gt;
First create a cursor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
declare cursor_name cursor for select id, protocol_id from tag_table;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To use the cursor just once... &lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
fetch cursor_name;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
One may add more cursors to the fetch list by separating them by commas.&lt;br /&gt;
&lt;br /&gt;
To turn on auto mode:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
set auto cursorlist = ON;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To add in additional delay between one tag read operation and another:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
set auto cursorlist = on, repeat = 500;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
NOTE: 500 is the minimum time between the start of one tag read operation to the start of another. This ''includes'' any time_out value in the select command used for the cursor.&lt;br /&gt;
&lt;br /&gt;
To set the delay between the end of the cursor list to the beginning of it repeating again, use:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
SET repeat = 1000;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To turn auto mode off:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
SET auto = OFF;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
NOTE: Do not try to use any other command while auto mode is on; it may cause an undesirable undefined operation.&lt;br /&gt;
&lt;br /&gt;
To delete a cursor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
close cursor_name;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
NOTE: only one cursor can be close/deleted at a time, and no cursor lists are allowed in the syntax of this command.&lt;br /&gt;
&lt;br /&gt;
====Reset====&lt;br /&gt;
To reset the reader as if there where no cursors defined and no tags read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
reset:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Login===&lt;br /&gt;
By SSH log in.&lt;br /&gt;
&lt;br /&gt;
===RQL Schema===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ tag_id&lt;br /&gt;
! Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R || protocol_id || Int&lt;br /&gt;
|-&lt;br /&gt;
|R || antenna_id || Int&lt;br /&gt;
|-&lt;br /&gt;
|R || read_count || Int&lt;br /&gt;
|-&lt;br /&gt;
| R/W || id || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|W || killed || Int&lt;br /&gt;
|-&lt;br /&gt;
|W || password || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|R || locked || Int&lt;br /&gt;
|-&lt;br /&gt;
|R || frequency || Int&lt;br /&gt;
|-&lt;br /&gt;
|R || dspmicros || Int&lt;br /&gt;
|-&lt;br /&gt;
|R  || timestamp || String&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ tag_data&lt;br /&gt;
! Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R || id || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || block number || Int&lt;br /&gt;
|-&lt;br /&gt;
|R/W || data || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|R || locked || Int&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ settings&lt;br /&gt;
! Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R || current_time || String&lt;br /&gt;
|-               &lt;br /&gt;
|R || version || String&lt;br /&gt;
|-&lt;br /&gt;
|R || supported_protocols || String&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ io&lt;br /&gt;
!Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R/W || data || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ saved_settings&lt;br /&gt;
!Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R/W || hostname || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || iface || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || dhcpcd || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ip_address || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || netmask || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || gateway || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ntp_servers || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || 1tx_power || String&lt;br /&gt;
|-            &lt;br /&gt;
|R/W || uhf_power_centidbm || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || epc1_id_length || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || primary_dns || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || secondary_dns || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || domain_name || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || reader_description || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || reader_role || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ant1_readpoint_descr || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ant2_readpoint_descr || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ant3_readpoint_descr || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ant4_readpoint_descr || String&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Supported Features==&lt;br /&gt;
All tables except tag_data are supported. Where clause only works on tag_id and tag_data on the real reader. Automode is working.&lt;br /&gt;
&lt;br /&gt;
==Unsupported Features &amp;amp; Bugs==&lt;br /&gt;
Tag_data table and compound conditions are not supported. ThingMagic, Mercury 5 reader RQL features are also not supported. Login by ssh is not supported. Also the time_out feature for reading tags is not supported yet.&lt;br /&gt;
&lt;br /&gt;
==Features that might never be supported==&lt;br /&gt;
Linux shell access to reader. This is fairly complex and require to emulate the entire hardware infrastructure of the reader and an ARM possessor. Also the web and RCP interface might be developed at a later time.&lt;/div&gt;</summary>
		<author><name>Jmaine</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/ThingMagic</id>
		<title>ThingMagic</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/ThingMagic"/>
				<updated>2008-10-08T17:04:46Z</updated>
		
		<summary type="html">&lt;p&gt;Jmaine: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:developerDoc]][[Category:EmulatorDoc]][[Category:userDoc]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
;Model Number: &lt;br /&gt;
 4&lt;br /&gt;
;Network Protocol: &lt;br /&gt;
SQL like protocol that may be wrapped in ssh, web interface, RCP, and Linux shell login.&lt;br /&gt;
;Communication:   &lt;br /&gt;
10/100 BaseT Ethernet – RJ45&lt;br /&gt;
;Antennas:&lt;br /&gt;
4 read points (4 transmit points, 4 receive points)&lt;br /&gt;
;General Purpose I/O:&lt;br /&gt;
(To Do)&lt;br /&gt;
&lt;br /&gt;
==Basis of Virtual Reader==&lt;br /&gt;
The reader accepts SQL style protocol and returns the appropriate information.&lt;br /&gt;
&lt;br /&gt;
===Documentation===&lt;br /&gt;
 &lt;br /&gt;
===Client Tools===&lt;br /&gt;
Telnet, SSH clients, and Tag Centric&lt;br /&gt;
&lt;br /&gt;
==Reader Design==&lt;br /&gt;
This section will give a brief overview of how the hardware reader operates for the purposes of emulation. &lt;br /&gt;
Here is the architecture for the emulator: [[ThingMagic/Emulator_Architecture]]&lt;br /&gt;
===Communication===&lt;br /&gt;
&lt;br /&gt;
====Protocols====&lt;br /&gt;
The main method for communicating with the reader is via TCP, TCP+SSH on port 8080, web interface, and RCP.&lt;br /&gt;
&lt;br /&gt;
===Memory Model===&lt;br /&gt;
The memory model is like a state based database.&lt;br /&gt;
===Getting Tags===&lt;br /&gt;
Getting tags is fairly simple just execute:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
telnet [reader ip address] 8080&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Then type:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id from tag_id set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Note: the semicolon at the end of each command is necessary.&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
One can also return multiple items:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id, protocol_id from tag_id set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also add filters or conditionals:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id from tag_id where [condition or filter] set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In addition more than one statement can be put on more than one line.&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id from tag_id set time_out=[milliseconds]; select protocol from tag_id set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tag Centric reads tags in the following manner:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id,read_count from tag_id WHERE (protocol_id='EPC0' and protocol_id='EPC1' and protocol_id='GEN2') set time_out=200;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
From this, one can tell if two conditions conjoined with 'AND' use the same column name, it counts as a logical 'OR'.&lt;br /&gt;
====Timer====&lt;br /&gt;
&lt;br /&gt;
====Autonomous Mode and Cursors====&lt;br /&gt;
First create a cursor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
declare cursor_name cursor for select id, protocol_id from tag_table;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To use the cursor just once... &lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
fetch cursor_name;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
One may add more cursors to the fetch list by separating them by commas.&lt;br /&gt;
&lt;br /&gt;
To turn on auto mode:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
set auto cursorlist = ON;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To add in additional delay between one tag read operation and another:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
set auto cursorlist = on, repeat = 500;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
NOTE: 500 is the minimum time between the start of one tag read operation to the start of another. This ''includes'' any time_out value in the select command used for the cursor.&lt;br /&gt;
&lt;br /&gt;
To set the delay between the end of the cursor list to the beginning of it repeating again, use:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
SET repeat = 1000;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To turn auto mode off:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
SET auto = OFF;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
NOTE: Do not try to use any other command while auto mode is on; it may cause an undesirable undefined operation.&lt;br /&gt;
&lt;br /&gt;
To delete a cursor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
close cursor_name;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
NOTE: only one cursor can be close/deleted at a time, and no cursor lists are allowed in the syntax of this command.&lt;br /&gt;
&lt;br /&gt;
====Reset====&lt;br /&gt;
To reset the reader as if there where no cursors defined and no tags read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
reset:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Login===&lt;br /&gt;
By SSH log in.&lt;br /&gt;
&lt;br /&gt;
===RQL Schema===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ tag_id&lt;br /&gt;
! Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R || protocol_id || Int&lt;br /&gt;
|-&lt;br /&gt;
|R || antenna_id || Int&lt;br /&gt;
|-&lt;br /&gt;
|R || read_count || Int&lt;br /&gt;
|-&lt;br /&gt;
| R/W || id || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|W || killed || Int&lt;br /&gt;
|-&lt;br /&gt;
|W || password || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|R || locked || Int&lt;br /&gt;
|-&lt;br /&gt;
|R || frequency || Int&lt;br /&gt;
|-&lt;br /&gt;
|R || dspmicros || Int&lt;br /&gt;
|-&lt;br /&gt;
|R  || timestamp || String&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ tag_data&lt;br /&gt;
! Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R || id || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || block number || Int&lt;br /&gt;
|-&lt;br /&gt;
|R/W || data || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|R || locked || Int&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ settings&lt;br /&gt;
! Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R || current_time || String&lt;br /&gt;
|-               &lt;br /&gt;
|R || version || String&lt;br /&gt;
|-&lt;br /&gt;
|R || supported_protocols || String&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ io&lt;br /&gt;
!Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R/W || data || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ saved_settings&lt;br /&gt;
!Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R/W || hostname || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || iface || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || dhcpcd || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ip_address || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || netmask || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || gateway || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ntp_servers || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || 1tx_power || String&lt;br /&gt;
|-            &lt;br /&gt;
|R/W || uhf_power_centidbm || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || epc1_id_length || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || primary_dns || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || secondary_dns || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || domain_name || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || reader_description || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || reader_role || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ant1_readpoint_descr || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ant2_readpoint_descr || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ant3_readpoint_descr || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ant4_readpoint_descr || String&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Supported Features==&lt;br /&gt;
All tables except tag_data are supported. Where clause only works on tag_id and tag_data on the real reader. Automode is working.&lt;br /&gt;
&lt;br /&gt;
==Unsupported Features &amp;amp; Bugs==&lt;br /&gt;
Tag_data table and compound conditions are not supported. ThingMagic, Mercury 5 reader RQL features are also not supported. Login by ssh is not supported.&lt;br /&gt;
&lt;br /&gt;
==Features that might never be supported==&lt;br /&gt;
Linux shell access to reader. This is fairly complex and require to emulate the entire hardware infrastructure of the reader and an ARM possessor. Also the web and RCP interface might be developed at a later time.&lt;/div&gt;</summary>
		<author><name>Jmaine</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/ThingMagic</id>
		<title>ThingMagic</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/ThingMagic"/>
				<updated>2008-10-08T17:03:23Z</updated>
		
		<summary type="html">&lt;p&gt;Jmaine: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:developerDoc]][[Category:EmulatorDoc]][[Category:userDoc]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
;Model Number: &lt;br /&gt;
 4&lt;br /&gt;
;Network Protocol: &lt;br /&gt;
SQL like protocol that may be wrapped in ssh, web interface, RCP, and Linux shell login.&lt;br /&gt;
;Communication:   &lt;br /&gt;
10/100 BaseT Ethernet – RJ45&lt;br /&gt;
;Antennas:&lt;br /&gt;
4 read points (4 transmit points, 4 receive points)&lt;br /&gt;
;General Purpose I/O:&lt;br /&gt;
(To Do)&lt;br /&gt;
&lt;br /&gt;
==Basis of Virtual Reader==&lt;br /&gt;
The reader accepts SQL style protocol and returns the appropriate information.&lt;br /&gt;
&lt;br /&gt;
===Documentation===&lt;br /&gt;
 &lt;br /&gt;
===Client Tools===&lt;br /&gt;
Telnet, SSH clients, and Tag Centric&lt;br /&gt;
&lt;br /&gt;
==Reader Design==&lt;br /&gt;
This section will give a brief overview of how the hardware reader operates for the purposes of emulation. &lt;br /&gt;
Here is the architecture for the emulator: [[ThingMagic/Emulator_Architecture]]&lt;br /&gt;
===Communication===&lt;br /&gt;
&lt;br /&gt;
====Protocols====&lt;br /&gt;
The main method for communicating with the reader is via TCP, TCP+SSH on port 8080, web interface, and RCP.&lt;br /&gt;
&lt;br /&gt;
===Memory Model===&lt;br /&gt;
The memory model is like a state based database.&lt;br /&gt;
===Getting Tags===&lt;br /&gt;
Getting tags is fairly simple just execute:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
telnet [reader ip address] 8080&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Then type:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id from tag_id set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Note: the semicolon at the end of each command is necessary.&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
One can also return multiple items:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id, protocol_id from tag_id set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also add filters or conditionals:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id from tag_id where [condition or filter] set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In addition more than one statement can be put on more than one line.&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id from tag_id set time_out=[milliseconds]; select protocol from tag_id set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tag Centric reads tags in the following manner:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id,read_count from tag_id WHERE (protocol_id='EPC0' and protocol_id='EPC1' and protocol_id='GEN2') set time_out=200;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
From this, one can tell if two conditions conjoined with 'AND' use the same column name, it counts as a logical 'OR'.&lt;br /&gt;
====Timer====&lt;br /&gt;
&lt;br /&gt;
====Autonomous Mode and Cursors====&lt;br /&gt;
First create a cursor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
declare cursor_name cursor for select id, protocol_id from tag_table;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To use the cursor just once... &lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
fetch cursor_name;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
One may add more cursors to the fetch list by separating them by commas.&lt;br /&gt;
&lt;br /&gt;
To turn on auto mode:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
set auto cursorlist = ON;&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To add in additional delay between one tag read operation and another:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
set auto cursorlist = on, repeat = 500;&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
NOTE: 500 is the minimum time between the start of one tag read operation to the start of another. This ''includes'' any time_out value in the select command used for the cursor.&lt;br /&gt;
&lt;br /&gt;
To set the delay between the end of the cursor list to the beginning of it repeating again, use:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
SET repeat = 1000;&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To turn auto mode off:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
SET auto = OFF;&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
NOTE: Do not try to use any other command while auto mode is on; it may cause an undesirable undefined operation.&lt;br /&gt;
&lt;br /&gt;
To delete a cursor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
close cursor_name;&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
NOTE: only one cursor can be close/deleted at a time, and no cursor lists are allowed in the syntax of this command.&lt;br /&gt;
&lt;br /&gt;
====Reset====&lt;br /&gt;
To reset the reader as if there where no cursors defined and no tags read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
reset:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Login===&lt;br /&gt;
By SSH log in.&lt;br /&gt;
&lt;br /&gt;
===RQL Schema===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ tag_id&lt;br /&gt;
! Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R || protocol_id || Int&lt;br /&gt;
|-&lt;br /&gt;
|R || antenna_id || Int&lt;br /&gt;
|-&lt;br /&gt;
|R || read_count || Int&lt;br /&gt;
|-&lt;br /&gt;
| R/W || id || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|W || killed || Int&lt;br /&gt;
|-&lt;br /&gt;
|W || password || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|R || locked || Int&lt;br /&gt;
|-&lt;br /&gt;
|R || frequency || Int&lt;br /&gt;
|-&lt;br /&gt;
|R || dspmicros || Int&lt;br /&gt;
|-&lt;br /&gt;
|R  || timestamp || String&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ tag_data&lt;br /&gt;
! Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R || id || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || block number || Int&lt;br /&gt;
|-&lt;br /&gt;
|R/W || data || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|R || locked || Int&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ settings&lt;br /&gt;
! Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R || current_time || String&lt;br /&gt;
|-               &lt;br /&gt;
|R || version || String&lt;br /&gt;
|-&lt;br /&gt;
|R || supported_protocols || String&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ io&lt;br /&gt;
!Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R/W || data || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ saved_settings&lt;br /&gt;
!Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R/W || hostname || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || iface || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || dhcpcd || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ip_address || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || netmask || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || gateway || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ntp_servers || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || 1tx_power || String&lt;br /&gt;
|-            &lt;br /&gt;
|R/W || uhf_power_centidbm || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || epc1_id_length || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || primary_dns || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || secondary_dns || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || domain_name || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || reader_description || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || reader_role || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ant1_readpoint_descr || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ant2_readpoint_descr || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ant3_readpoint_descr || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ant4_readpoint_descr || String&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Supported Features==&lt;br /&gt;
All tables except tag_data are supported. Where clause only works on tag_id and tag_data on the real reader. Automode is working.&lt;br /&gt;
&lt;br /&gt;
==Unsupported Features &amp;amp; Bugs==&lt;br /&gt;
Tag_data table and compound conditions are not supported. ThingMagic, Mercury 5 reader RQL features are also not supported. Login by ssh is not supported.&lt;br /&gt;
&lt;br /&gt;
==Features that might never be supported==&lt;br /&gt;
Linux shell access to reader. This is fairly complex and require to emulate the entire hardware infrastructure of the reader and an ARM possessor. Also the web and RCP interface might be developed at a later time.&lt;/div&gt;</summary>
		<author><name>Jmaine</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/Junit_Example</id>
		<title>Junit Example</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/Junit_Example"/>
				<updated>2008-05-14T00:45:48Z</updated>
		
		<summary type="html">&lt;p&gt;Jmaine: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:developerDoc]]&lt;br /&gt;
Junit 4.x may be tricky at first to build test suites or regular tests, but they are pretty easy to write once one gains a hang of it.&lt;br /&gt;
&lt;br /&gt;
Here is an example of a regular test class.&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
import org.junit.AfterClass;&lt;br /&gt;
import org.junit.Assert;&lt;br /&gt;
import org.junit.BeforeClass;&lt;br /&gt;
import org.junit.Test;&lt;br /&gt;
&lt;br /&gt;
public class Example {&lt;br /&gt;
    @BeforeClass&lt;br /&gt;
	public static void setUpBeforeClass() throws Exception {&lt;br /&gt;
              /* things to do before running tests */&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
	@AfterClass&lt;br /&gt;
	public static void tearDownAfterClass() throws Exception {&lt;br /&gt;
              /* things to do after running tests */&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
	@Test&lt;br /&gt;
	public void testExample1() {&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
	@Test&lt;br /&gt;
	public void testExample2() {&lt;br /&gt;
&lt;br /&gt;
        }        &lt;br /&gt;
   &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Here is an example of a test suite. This class can be subclassed to create sub-suites to keep from writing &lt;br /&gt;
boiler plate code over and over.&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
&lt;br /&gt;
import org.junit.runner.Description;&lt;br /&gt;
import org.junit.runner.RunWith;&lt;br /&gt;
import org.junit.runner.Runner;&lt;br /&gt;
import org.junit.runner.notification.RunNotifier;&lt;br /&gt;
 &lt;br /&gt;
/*&lt;br /&gt;
 * This is the runner class for the entire test suite. &lt;br /&gt;
 * All we do here is to add the sub suites here.&lt;br /&gt;
 * &lt;br /&gt;
 * This class can be subclassed to create subsuites.&lt;br /&gt;
 * Note the run with annotation is needed for each subsuite.&lt;br /&gt;
 * And each subsuite must have a constructor with a signature of&lt;br /&gt;
 * public [constructor] (Class&amp;lt;?&amp;gt; klass)&lt;br /&gt;
 */&lt;br /&gt;
@RunWith(SuiteExample.class)&lt;br /&gt;
public class SuiteExample extends Runner {&lt;br /&gt;
	protected Description description;&lt;br /&gt;
	protected ArrayList&amp;lt;Runner&amp;gt; runners;&lt;br /&gt;
	&lt;br /&gt;
	public ReaderTests()&lt;br /&gt;
	{&lt;br /&gt;
		runners = new ArrayList&amp;lt;Runner&amp;gt;();&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	public ReaderTests (Class&amp;lt;?&amp;gt; klass)&lt;br /&gt;
	{&lt;br /&gt;
		this();&lt;br /&gt;
		&lt;br /&gt;
		runners.add(Request.aClass(Example.class).sortWith(this).getRunner());&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
		description = Description.createSuiteDescription(&amp;quot;Rifidi Junit Test Suite&amp;quot;);&lt;br /&gt;
		&lt;br /&gt;
		addRunnersToDescription();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/* call this method in the constructor of the subclass&lt;br /&gt;
	 * to add the runners to the description&lt;br /&gt;
	 */&lt;br /&gt;
	protected void addRunnersToDescription()&lt;br /&gt;
	{&lt;br /&gt;
		for(Runner run : runners)&lt;br /&gt;
		{&lt;br /&gt;
			description.addChild(run.getDescription());&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	@Override&lt;br /&gt;
	public Description getDescription() {&lt;br /&gt;
		&lt;br /&gt;
		return description;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void run(RunNotifier notifier) {&lt;br /&gt;
		&lt;br /&gt;
		notifier.fireTestStarted(description);&lt;br /&gt;
		for (Runner run : runners)&lt;br /&gt;
		{&lt;br /&gt;
			notifier.fireTestStarted(run.getDescription());&lt;br /&gt;
			run.run(notifier);&lt;br /&gt;
			notifier.fireTestFinished(run.getDescription());&lt;br /&gt;
		}&lt;br /&gt;
		notifier.fireTestFinished(description);&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jmaine</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/Junit_Example</id>
		<title>Junit Example</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/Junit_Example"/>
				<updated>2008-05-14T00:36:04Z</updated>
		
		<summary type="html">&lt;p&gt;Jmaine: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:developerDoc]]&lt;br /&gt;
Junit 4.x may be tricky at first to build test suites or regular tests, but they are pretty easy to write once one gains a hang of it.&lt;br /&gt;
&lt;br /&gt;
Here is an example of a regular test class.&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
import org.junit.AfterClass;&lt;br /&gt;
import org.junit.Assert;&lt;br /&gt;
import org.junit.BeforeClass;&lt;br /&gt;
import org.junit.Test;&lt;br /&gt;
&lt;br /&gt;
public class Example {&lt;br /&gt;
    @BeforeClass&lt;br /&gt;
	public static void setUpBeforeClass() throws Exception {&lt;br /&gt;
              /* things to do before running tests */&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
	@AfterClass&lt;br /&gt;
	public static void tearDownAfterClass() throws Exception {&lt;br /&gt;
              /* things to do after running tests */&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
	@Test&lt;br /&gt;
	public void testExample1() {&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
	@Test&lt;br /&gt;
	public void testExample2() {&lt;br /&gt;
&lt;br /&gt;
        }        &lt;br /&gt;
   &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jmaine</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/Junit_Example</id>
		<title>Junit Example</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/Junit_Example"/>
				<updated>2008-05-14T00:24:29Z</updated>
		
		<summary type="html">&lt;p&gt;Jmaine: New page: category:developerDoc Junit 4.x may be tricky at first to build test suites or regular tests, but they are pretty easy to write once one gains a hang of it.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:developerDoc]]&lt;br /&gt;
Junit 4.x may be tricky at first to build test suites or regular tests, but they are pretty easy to write once one gains a hang of it.&lt;/div&gt;</summary>
		<author><name>Jmaine</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/ReaderJunits</id>
		<title>ReaderJunits</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/ReaderJunits"/>
				<updated>2008-05-09T21:19:26Z</updated>
		
		<summary type="html">&lt;p&gt;Jmaine: Put the wiki under its proper catagory.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:developerDoc]]&lt;br /&gt;
=Purpose of Junits=&lt;br /&gt;
Junits are automated tests that programatically test functionality.  The advantage of them is that you can run the tests to make sure that as new functionality is added, old functionality doesn't break.&lt;br /&gt;
&lt;br /&gt;
=Creating a new Junit in eclipse=&lt;br /&gt;
Currently our testing packages are stored internally to Pramari because they have dependencies to non-free libraries provided by RFID reader companies.   We are currently working on opening up our tests.  However, you can ignore the first step and add the test to a testing package contained in your reader's source code.&lt;br /&gt;
#Checkout org.rifidi.tests and org.rifidi.internal.dependencies from the internal repository&lt;br /&gt;
#Create a new package for your tests&lt;br /&gt;
#Add a new Junit in eclipse&lt;br /&gt;
##New-&amp;gt;Other-&amp;gt;Junit Test Case&lt;br /&gt;
##Fill in the information in the wizard.  You need a Junit 4 test case with the SetUpBeforeClass() and TearDownAfterClass() methods generated.[[image:Newjunit.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Designing a Junit to Test a Virtual Reader=&lt;br /&gt;
The test that you are designing depends on which version of emulator you are running.  To figure this out, open up the plugin.xml file for org.rifidi.emulator, and look at the plugin version&lt;br /&gt;
&lt;br /&gt;
==Junit Guidelines==&lt;br /&gt;
* When creating a Junit, it is important to add comments to almost everything you do, because your test might not fail for months after you've written it, and it will be difficult to go in and figure out why it failed if there are no comments&lt;br /&gt;
* It is important to think through exactly what you want to test and make sure that you are testing it well.  For example, The following test could be designed better, because it will not fail if more than one tag comes back from the alien reader for some reason after the getTaglist command is sent&lt;br /&gt;
* It is also important that one test not depend on the state of previously run test.  All test methods should run independently and should only assume that SetUpBeforeClass() has finished without error.  For example, if I added another test method to run after the &amp;lt;tt&amp;gt;getTaglistTest&amp;lt;/tt&amp;gt; method, it should not assume that a tag is on the reader.  Also this test method should have removed the tag after it was done.&lt;br /&gt;
&lt;br /&gt;
==Junits for org.rifidi.emulator 1.x==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * &lt;br /&gt;
 */&lt;br /&gt;
package org.rifidi.tests.reader.alien;&lt;br /&gt;
&lt;br /&gt;
import gnu.cajo.utils.extra.TransparentItemProxy;&lt;br /&gt;
&lt;br /&gt;
import java.io.BufferedReader;&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.io.InputStreamReader;&lt;br /&gt;
import java.io.PrintWriter;&lt;br /&gt;
import java.net.Socket;&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
&lt;br /&gt;
import org.apache.commons.logging.Log;&lt;br /&gt;
import org.apache.commons.logging.LogFactory;&lt;br /&gt;
import org.junit.AfterClass;&lt;br /&gt;
import org.junit.Assert;&lt;br /&gt;
import org.junit.BeforeClass;&lt;br /&gt;
import org.junit.Test;&lt;br /&gt;
import org.rifidi.emulator.reader.module.GeneralReaderPropertyHolder;&lt;br /&gt;
import org.rifidi.emulator.rmi.server.ReaderModuleManagerInterface;&lt;br /&gt;
import org.rifidi.emulator.rmi.server.RifidiManager;&lt;br /&gt;
import org.rifidi.emulator.rmi.server.RifidiManagerInterface;&lt;br /&gt;
import org.rifidi.emulator.tags.impl.C1G2Tag;&lt;br /&gt;
import org.rifidi.emulator.tags.impl.RifidiTag;&lt;br /&gt;
import org.rifidi.utilities.formatting.ByteAndHexConvertingUtility;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * &lt;br /&gt;
 * This Junit is designed to demonstrate how to write Junits for Rifidi Virtual&lt;br /&gt;
 * Readers&lt;br /&gt;
 * &lt;br /&gt;
 * @author Kyle Neumeier - kyle@pramari.com&lt;br /&gt;
 * &lt;br /&gt;
 */&lt;br /&gt;
public class AlienExample {&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * The logger for this class. Allows you to keep track of debug statements&lt;br /&gt;
	 * instead of using&lt;br /&gt;
	 */&lt;br /&gt;
	private static final Log logger = LogFactory.getLog(AlienExample.class);&lt;br /&gt;
&lt;br /&gt;
	public static final String READER_IP_ADDRESS = new String(&amp;quot;127.0.0.1&amp;quot;);&lt;br /&gt;
	public static final int READER_PORT = 20000;&lt;br /&gt;
	public static final String READER_NAME = &amp;quot;virtualAlienReader&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	public static final String RMI_SERVER_IP_ADDRESS = new String(&amp;quot;127.0.0.1&amp;quot;);&lt;br /&gt;
	public static final int RMI_SERVER_PORT = 1099;&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * The RMI Client Interface for the Alien Reader. It allows you to turn the&lt;br /&gt;
	 * reader on and off as well as add and remove tags to the antenna&lt;br /&gt;
	 */&lt;br /&gt;
	private static ReaderModuleManagerInterface alienManager;&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * The Interface for the RMI server&lt;br /&gt;
	 */&lt;br /&gt;
	private static RifidiManagerInterface RMIManager;&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * The client connection to the Alien reader&lt;br /&gt;
	 */&lt;br /&gt;
	private static Socket connection = null;&lt;br /&gt;
	private static PrintWriter out = null;&lt;br /&gt;
	private static BufferedReader in = null;&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * This method is run before any of the tests in this file&lt;br /&gt;
	 * &lt;br /&gt;
	 * @throws java.lang.Exception&lt;br /&gt;
	 */&lt;br /&gt;
	@BeforeClass&lt;br /&gt;
	public static void setUpBeforeClass() throws Exception {&lt;br /&gt;
		// set up RMI Server, Client, and Readers&lt;br /&gt;
		RifidiManager.startManager(RMI_SERVER_IP_ADDRESS, RMI_SERVER_PORT);&lt;br /&gt;
		RMIManager = RifidiManager.getManager();&lt;br /&gt;
&lt;br /&gt;
		/*&lt;br /&gt;
		 * The General Reader Property Holder contains information needed to&lt;br /&gt;
		 * instantiate the virutal reader. Note that the GRPH has a property map&lt;br /&gt;
		 * in it that is different for every reader. To find out which&lt;br /&gt;
		 * properties you should have in your reader, look at the required&lt;br /&gt;
		 * properties in the emulator.xml file in the reader project.&lt;br /&gt;
		 */&lt;br /&gt;
		GeneralReaderPropertyHolder alienGRPH = new GeneralReaderPropertyHolder();&lt;br /&gt;
		alienGRPH.setNumAntennas(2);&lt;br /&gt;
		alienGRPH.setNumGPIs(2);&lt;br /&gt;
		alienGRPH.setNumGPOs(2);&lt;br /&gt;
		alienGRPH.setReaderName(READER_NAME);&lt;br /&gt;
		alienGRPH.setReaderClassName(&amp;quot;org.rifidi.emulator.reader.alien.module.AlienReaderModule&amp;quot;);&lt;br /&gt;
		alienGRPH.setProperty(&amp;quot;inet_address&amp;quot;, READER_IP_ADDRESS + &amp;quot;:&amp;quot;+ READER_PORT);&lt;br /&gt;
		alienGRPH.setProperty(&amp;quot;heartbeat_address&amp;quot;, READER_IP_ADDRESS + &amp;quot;:54321&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		// create the reader&lt;br /&gt;
		RMIManager.createReader(alienGRPH);&lt;br /&gt;
&lt;br /&gt;
		// get the reader manager from the RMI server&lt;br /&gt;
		alienManager = (ReaderModuleManagerInterface) TransparentItemProxy&lt;br /&gt;
				.getItem(&amp;quot;//&amp;quot; + RMI_SERVER_IP_ADDRESS + &amp;quot;:&amp;quot; + RMI_SERVER_PORT + &amp;quot;/&amp;quot; + READER_NAME,&lt;br /&gt;
				         new Class[] { ReaderModuleManagerInterface.class });&lt;br /&gt;
&lt;br /&gt;
		// turn on the reader&lt;br /&gt;
		alienManager.turnReaderOn();&lt;br /&gt;
&lt;br /&gt;
		// wait for reader to turn on&lt;br /&gt;
		Thread.sleep(500);&lt;br /&gt;
&lt;br /&gt;
		// create a new client connection&lt;br /&gt;
		connection = new Socket(READER_IP_ADDRESS, READER_PORT);&lt;br /&gt;
&lt;br /&gt;
		in = new BufferedReader(new InputStreamReader(connection.getInputStream()));&lt;br /&gt;
		out = new PrintWriter(connection.getOutputStream());&lt;br /&gt;
&lt;br /&gt;
		try {&lt;br /&gt;
			// read welcome message&lt;br /&gt;
			System.out.println(readFromReader(in));&lt;br /&gt;
			// send user name&lt;br /&gt;
			out.write(&amp;quot;alien\n&amp;quot;);&lt;br /&gt;
			out.flush();&lt;br /&gt;
			// read resoponse&lt;br /&gt;
			System.out.println(readFromReader(in));&lt;br /&gt;
			Thread.sleep(500);&lt;br /&gt;
			// send password&lt;br /&gt;
			out.write(&amp;quot;password\n&amp;quot;);&lt;br /&gt;
			out.flush();&lt;br /&gt;
			System.out.println(readFromReader(in));&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			Assert.fail(e.getMessage());&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * This class is run after all the tests in this class have been run. It&lt;br /&gt;
	 * should shut down the reader and tear down the RMI server&lt;br /&gt;
	 * &lt;br /&gt;
	 * @throws java.lang.Exception&lt;br /&gt;
	 */&lt;br /&gt;
	@AfterClass&lt;br /&gt;
	public static void tearDownAfterClass() throws Exception {&lt;br /&gt;
		out.write(&amp;quot;q&amp;quot;);&lt;br /&gt;
		connection.close();&lt;br /&gt;
		alienManager.turnReaderOff();&lt;br /&gt;
		RMIManager.removeReader(READER_NAME);&lt;br /&gt;
		RMIManager.cleanup();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * This is a Junit Test. Use the &amp;quot;@Test&amp;quot; annotation above the class so that&lt;br /&gt;
	 * it will be run as a Junit.&lt;br /&gt;
	 * &lt;br /&gt;
	 * This Junit adds a tag to the reader, then sends a get taglist command to&lt;br /&gt;
	 * the reader. It then compares the response with the sent tag information&lt;br /&gt;
	 * and will fail if the information is not the same.&lt;br /&gt;
	 * &lt;br /&gt;
	 * @throws Exception&lt;br /&gt;
	 */&lt;br /&gt;
	@Test&lt;br /&gt;
	public void getTaglistTest() throws Exception {&lt;br /&gt;
		// make sure information comes back in the right format&lt;br /&gt;
		String command1 = &amp;quot;\1set TagListFormat = TEXT\n&amp;quot;;&lt;br /&gt;
		out.write(command1);&lt;br /&gt;
		out.flush();&lt;br /&gt;
		String returnVal1 = readFromReader(in);&lt;br /&gt;
		Assert.assertTrue(returnVal1.toLowerCase().contains(&amp;quot;TagListFormat = TEXT&amp;quot;.toLowerCase()));&lt;br /&gt;
&lt;br /&gt;
		// create a new tag&lt;br /&gt;
		byte[] epcID = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C };&lt;br /&gt;
		byte[] pass = { 0x00, 0x00, 0x00, 0x00 };&lt;br /&gt;
		C1G2Tag t = new C1G2Tag(epcID, pass, pass.clone());&lt;br /&gt;
		RifidiTag tag = new RifidiTag(t);&lt;br /&gt;
		ArrayList&amp;lt;RifidiTag&amp;gt; tags = new ArrayList&amp;lt;RifidiTag&amp;gt;();&lt;br /&gt;
		tags.add(tag);&lt;br /&gt;
&lt;br /&gt;
		// add tag to antenna 0 on the reader&lt;br /&gt;
		alienManager.addTags(0, tags);&lt;br /&gt;
&lt;br /&gt;
		Thread.sleep(500);&lt;br /&gt;
&lt;br /&gt;
		// send a get taglist command&lt;br /&gt;
		out.write(&amp;quot;\1getTaglist\n&amp;quot;);&lt;br /&gt;
		out.flush();&lt;br /&gt;
		String taglist = readFromReader(in);&lt;br /&gt;
		logger.debug(taglist);&lt;br /&gt;
&lt;br /&gt;
		// process command and compare byte ids.&lt;br /&gt;
		String[] info = taglist.split(&amp;quot;,&amp;quot;);&lt;br /&gt;
		String id = info[0].split(&amp;quot;:&amp;quot;)[1];&lt;br /&gt;
		byte[] byteID = ByteAndHexConvertingUtility.fromHexString(id.trim());&lt;br /&gt;
		Assert.assertArrayEquals(epcID, byteID);&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public static String readFromReader(BufferedReader inBuf)&lt;br /&gt;
			throws IOException {&lt;br /&gt;
		StringBuffer buf = new StringBuffer();&lt;br /&gt;
		int ch = inBuf.read();&lt;br /&gt;
		while ((char) ch != '\0') {&lt;br /&gt;
			buf.append((char) ch);&lt;br /&gt;
			ch = inBuf.read();&lt;br /&gt;
		}&lt;br /&gt;
		return buf.toString();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Junits for org.rifidi.emulator 2.x==&lt;br /&gt;
Creating Junits for emulator 2.x is similar to that.  The main difference is how tags are created.  An example is coming soon.&lt;br /&gt;
&lt;br /&gt;
=Running the Junit Test Case=&lt;br /&gt;
#Right click the Junit in the tree on the left inside of eclipse&lt;br /&gt;
#Select RunAs -&amp;gt; Junit Plugin Test&lt;/div&gt;</summary>
		<author><name>Jmaine</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/ThingMagic/Emulator_Architecture</id>
		<title>ThingMagic/Emulator Architecture</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/ThingMagic/Emulator_Architecture"/>
				<updated>2008-04-24T23:43:26Z</updated>
		
		<summary type="html">&lt;p&gt;Jmaine: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Here is the UML diagram for the ThingMagic specific parts of the emulator in Rifidi.&lt;br /&gt;
[[Image:Thingmagic.png|800px]]&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Here is the flow diagram for the emulator.&lt;br /&gt;
[[Image:Thingmagic_flow_diagram.png]]&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
The ETable enum list all the possible tables for the reader and each enum object, table, can return the list of rows it has (also a list of enum objects). Each row implements a Comparator interface that is directly related to it. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Database uses these enums to find the correct Comparator list to give to the MultiFilter to use in the filtering operation.&lt;/div&gt;</summary>
		<author><name>Jmaine</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/ThingMagic/Emulator_Architecture</id>
		<title>ThingMagic/Emulator Architecture</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/ThingMagic/Emulator_Architecture"/>
				<updated>2008-04-17T20:42:03Z</updated>
		
		<summary type="html">&lt;p&gt;Jmaine: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Here is the UML diagram for the ThingMagic specific parts of the emulator in Rifidi.&lt;br /&gt;
[[Image:Thingmagic.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Here is the flow diagram for the emulator.&lt;br /&gt;
[[Image:Thingmagic_flow_diagram.png]]&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
The ETable enum list all the possible tables for the reader and each enum object, table, can return the list of rows it has (also a list of enum objects). Each row implements a Comparator interface that is directly related to it. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Database uses these enums to find the correct Comparator list to give to the MultiFilter to use in the filtering operation.&lt;/div&gt;</summary>
		<author><name>Jmaine</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/ThingMagic/Emulator_Architecture</id>
		<title>ThingMagic/Emulator Architecture</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/ThingMagic/Emulator_Architecture"/>
				<updated>2008-04-17T20:41:41Z</updated>
		
		<summary type="html">&lt;p&gt;Jmaine: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Here is the UML diagram for the ThingMagic specific parts of the emulator in Rifidi.&lt;br /&gt;
[[Image:Thingmagic.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Here is the flow diagram for the emulator.&lt;br /&gt;
[[Image:Thingmagic_flow_diagram.png]]&amp;lt;br /&amp;gt;&lt;br /&gt;
The ETable enum list all the possible tables for the reader and each enum object, table, can return the list of rows it has (also a list of enum objects). Each row implements a Comparator interface that is directly related to it. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Database uses these enums to find the correct Comparator list to give to the MultiFilter to use in the filtering operation.&lt;/div&gt;</summary>
		<author><name>Jmaine</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/ThingMagic/Emulator_Architecture</id>
		<title>ThingMagic/Emulator Architecture</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/ThingMagic/Emulator_Architecture"/>
				<updated>2008-04-17T20:41:14Z</updated>
		
		<summary type="html">&lt;p&gt;Jmaine: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Here is the UML diagram for the ThingMagic specific parts of the emulator in Rifidi.&lt;br /&gt;
[[Image:Thingmagic.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Here is the flow diagram for the emulator.&lt;br /&gt;
[[Image:Thingmagic_flow_diagram.png]]&lt;br /&gt;
The ETable enum list all the possible tables for the reader and each enum object, table, can return the list of rows it has (also a list of enum objects). Each row implements a Comparator interface that is directly related to it. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Database uses these enums to find the correct Comparator list to give to the MultiFilter to use in the filtering operation.&lt;/div&gt;</summary>
		<author><name>Jmaine</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/READERNAME_LogFormatter.java</id>
		<title>READERNAME LogFormatter.java</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/READERNAME_LogFormatter.java"/>
				<updated>2008-04-17T20:01:54Z</updated>
		
		<summary type="html">&lt;p&gt;Jmaine: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:developerDoc]][[category:emulatorDoc]]&lt;br /&gt;
This class handles how the reader should display outgoing and incoming messages in the console logger in the IDE.  If the reader does not need to display this information in any special way, it does not have to implement this class and instead can use either the GenericByteLogFormatter or the GenericStringLogFormatter.  If it does need to implement this class, it should implement the LogFormatter interface.&lt;br /&gt;
&lt;br /&gt;
=formatMessage=&lt;br /&gt;
&lt;br /&gt;
This method needs to decode an incoming command into a command to be handled in the command formatter.  It should put the command into a commandObject and put the commandObject in the first slot in an arraylist and return the arraylist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;public String formatMessage(byte[] rawMessage);&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Arguments==&lt;br /&gt;
#arg - The incoming or outgoing message that needs to be turned into a log message&lt;br /&gt;
&lt;br /&gt;
==Return Value==&lt;br /&gt;
A string that will be printed in the console&lt;br /&gt;
&lt;br /&gt;
==Reference Implementation==&lt;br /&gt;
This is the log formatter for the llrp reader.  It displays both the bytes and the xml representation of the messages.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	public String formatMessage(byte[] rawMessage) {&lt;br /&gt;
		&lt;br /&gt;
		ByteArrayInputStream is = new ByteArrayInputStream(rawMessage);&lt;br /&gt;
		String bytes = ByteAndHexConvertingUtility.toHexString(rawMessage);&lt;br /&gt;
		try {&lt;br /&gt;
			Message m = Message.receive(is);&lt;br /&gt;
			return &amp;quot;\nBYTES: \n&amp;quot; + bytes + &amp;quot;\nXML: \n&amp;quot; + m.toXMLString();&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			logger.error(&amp;quot;Cannot serialize the message&amp;quot;);&lt;br /&gt;
			return &amp;quot;\nBytes: &amp;quot; + bytes;&lt;br /&gt;
		} &lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Other Notes==&lt;br /&gt;
Also note GenericByteLogFormatter and GenericStringLogFormatter are used for two different purposes. GenericByteLogFormatter is used when the reader takes in bytes as commands and out puts them into the debug window of the IDE--like the LLRP or the Symbol. GenericStringLogFormatter is used when the reader takes in strings as commands and out puts them into the debug window of the IDE--like the Alien or the Thing Magic.&lt;/div&gt;</summary>
		<author><name>Jmaine</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/READERNAME_LogFormatter.java</id>
		<title>READERNAME LogFormatter.java</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/READERNAME_LogFormatter.java"/>
				<updated>2008-04-17T20:00:47Z</updated>
		
		<summary type="html">&lt;p&gt;Jmaine: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:developerDoc]][[category:emulatorDoc]]&lt;br /&gt;
This class handles how the reader should display outgoing and incoming messages in the console logger in the IDE.  If the reader does not need to display this information in any special way, it does not have to implement this class and instead can use either the GenericByteLogFormatter or the GenericStringLogFormatter.  If it does need to implement this class, it should implement the LogFormatter interface.&lt;br /&gt;
&lt;br /&gt;
=formatMessage=&lt;br /&gt;
&lt;br /&gt;
This method needs to decode an incoming command into a command to be handled in the command formatter.  It should put the command into a commandObject and put the commandObject in the first slot in an arraylist and return the arraylist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;public String formatMessage(byte[] rawMessage);&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Arguments==&lt;br /&gt;
#arg - The incoming or outgoing message that needs to be turned into a log message&lt;br /&gt;
&lt;br /&gt;
==Return Value==&lt;br /&gt;
A string that will be printed in the console&lt;br /&gt;
&lt;br /&gt;
==Reference Implementation==&lt;br /&gt;
This is the log formatter for the llrp reader.  It displays both the bytes and the xml representation of the messages.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	public String formatMessage(byte[] rawMessage) {&lt;br /&gt;
		&lt;br /&gt;
		ByteArrayInputStream is = new ByteArrayInputStream(rawMessage);&lt;br /&gt;
		String bytes = ByteAndHexConvertingUtility.toHexString(rawMessage);&lt;br /&gt;
		try {&lt;br /&gt;
			Message m = Message.receive(is);&lt;br /&gt;
			return &amp;quot;\nBYTES: \n&amp;quot; + bytes + &amp;quot;\nXML: \n&amp;quot; + m.toXMLString();&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			logger.error(&amp;quot;Cannot serialize the message&amp;quot;);&lt;br /&gt;
			return &amp;quot;\nBytes: &amp;quot; + bytes;&lt;br /&gt;
		} &lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Other Notes==&lt;br /&gt;
Also note GenericByteLogFormatter and GenericStringLogFormatter are used for two different purposes. GenericByteLogFormatter is used when the reader takes in bytes as commands and out puts them into the debug window of the IDE--like the LLRP or the Symbol. GenericStringLogFormatter&lt;/div&gt;</summary>
		<author><name>Jmaine</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/READERNAME_Protocol.java</id>
		<title>READERNAME Protocol.java</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/READERNAME_Protocol.java"/>
				<updated>2008-04-17T19:54:06Z</updated>
		
		<summary type="html">&lt;p&gt;Jmaine: /* removeProtocol */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:developerDoc]][[category:emulatorDoc]]&lt;br /&gt;
This class removes protocols from incoming messages and adds protocols to outgoing messages.  In addition it parses incoming messages to make sure that only one command at a time is placed on the incoming message buffer.  See [[Command Flow]].  This class should implement Protocol.  If nothing special needs to happen, the reader can use RawProtocol.&lt;br /&gt;
&lt;br /&gt;
=addProtocol=&lt;br /&gt;
&lt;br /&gt;
This method adds a protocol to outgoing messages.  For example, if the outgoing message needs to be an HTTP message, the protocol should construct the necessary HTTP part of the outgoing message&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;public byte[] addProtocol(byte[] data);&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Arguments==&lt;br /&gt;
# data - The response from the reader that needs a protocol added to it.&lt;br /&gt;
&lt;br /&gt;
==Return Value==&lt;br /&gt;
A message that is properly encoded with the correct protocol that is ready to be sent back to the client.&lt;br /&gt;
&lt;br /&gt;
==Reference Implementation==&lt;br /&gt;
This is the implementation of the addProtocol() method in the alien reader.  For it, nothing special needs to happen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	public byte[] addProtocol(byte[] data) {&lt;br /&gt;
		return data;&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=removeProtocol=&lt;br /&gt;
&lt;br /&gt;
This method removes protocols on incoming messages.  It also splits up commands if more than two commands are sent at the same time and read from the TCP socket all at once. These command are sent one at a time to [[READERNAME_CommandFormatter.java]]::decode(byte[] arg) to be parsed and sent to the command handler.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;public List&amp;lt;byte[]&amp;gt; removeProtocol(byte[] data);&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Arguments==&lt;br /&gt;
# data - A list of bytes that has been read from the TCP socket&lt;br /&gt;
&lt;br /&gt;
==Return Value==&lt;br /&gt;
A list of commands, where each item in the list is a single command&lt;br /&gt;
&lt;br /&gt;
==Reference Implementation==&lt;br /&gt;
This is the implementation of the removeProtocol() method in the alien reader.  It splits up messages using '\n' as a deliminator.  It then puts each individual message in its own slot in an array and returns the array.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	public List&amp;lt;byte[]&amp;gt; removeProtocol(byte[] data)&lt;br /&gt;
			throws ProtocolValidationException {&lt;br /&gt;
		List&amp;lt;byte[]&amp;gt; retVal = new ArrayList&amp;lt;byte[]&amp;gt;();&lt;br /&gt;
		String strData = new String(data);&lt;br /&gt;
		String[] arrayData = strData.split(&amp;quot;\n&amp;quot;);&lt;br /&gt;
		for( String i:arrayData ) {&lt;br /&gt;
			retVal.add(i.getBytes());&lt;br /&gt;
		}&lt;br /&gt;
		return retVal;&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jmaine</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/READERNAME_Protocol.java</id>
		<title>READERNAME Protocol.java</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/READERNAME_Protocol.java"/>
				<updated>2008-04-17T19:53:49Z</updated>
		
		<summary type="html">&lt;p&gt;Jmaine: /* removeProtocol */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:developerDoc]][[category:emulatorDoc]]&lt;br /&gt;
This class removes protocols from incoming messages and adds protocols to outgoing messages.  In addition it parses incoming messages to make sure that only one command at a time is placed on the incoming message buffer.  See [[Command Flow]].  This class should implement Protocol.  If nothing special needs to happen, the reader can use RawProtocol.&lt;br /&gt;
&lt;br /&gt;
=addProtocol=&lt;br /&gt;
&lt;br /&gt;
This method adds a protocol to outgoing messages.  For example, if the outgoing message needs to be an HTTP message, the protocol should construct the necessary HTTP part of the outgoing message&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;public byte[] addProtocol(byte[] data);&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Arguments==&lt;br /&gt;
# data - The response from the reader that needs a protocol added to it.&lt;br /&gt;
&lt;br /&gt;
==Return Value==&lt;br /&gt;
A message that is properly encoded with the correct protocol that is ready to be sent back to the client.&lt;br /&gt;
&lt;br /&gt;
==Reference Implementation==&lt;br /&gt;
This is the implementation of the addProtocol() method in the alien reader.  For it, nothing special needs to happen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	public byte[] addProtocol(byte[] data) {&lt;br /&gt;
		return data;&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=removeProtocol=&lt;br /&gt;
&lt;br /&gt;
This method removes protocols on incoming messages.  It also splits up commands if more than two commands are sent at the same time and read from the TCP socket all at once. These command are sent one at a time to [[/READERNAME_CommandFormatter.java]]::decode(byte[] arg) to be parsed and sent to the command handler.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;public List&amp;lt;byte[]&amp;gt; removeProtocol(byte[] data);&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Arguments==&lt;br /&gt;
# data - A list of bytes that has been read from the TCP socket&lt;br /&gt;
&lt;br /&gt;
==Return Value==&lt;br /&gt;
A list of commands, where each item in the list is a single command&lt;br /&gt;
&lt;br /&gt;
==Reference Implementation==&lt;br /&gt;
This is the implementation of the removeProtocol() method in the alien reader.  It splits up messages using '\n' as a deliminator.  It then puts each individual message in its own slot in an array and returns the array.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	public List&amp;lt;byte[]&amp;gt; removeProtocol(byte[] data)&lt;br /&gt;
			throws ProtocolValidationException {&lt;br /&gt;
		List&amp;lt;byte[]&amp;gt; retVal = new ArrayList&amp;lt;byte[]&amp;gt;();&lt;br /&gt;
		String strData = new String(data);&lt;br /&gt;
		String[] arrayData = strData.split(&amp;quot;\n&amp;quot;);&lt;br /&gt;
		for( String i:arrayData ) {&lt;br /&gt;
			retVal.add(i.getBytes());&lt;br /&gt;
		}&lt;br /&gt;
		return retVal;&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jmaine</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/READERNAME_CommandFormatter.java</id>
		<title>READERNAME CommandFormatter.java</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/READERNAME_CommandFormatter.java"/>
				<updated>2008-04-17T19:50:48Z</updated>
		
		<summary type="html">&lt;p&gt;Jmaine: /* Return Value */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:developerDoc]][[category:emulatorDoc]]&lt;br /&gt;
This class should implement CommandHandler.  This page goes through each of the four methods in CommandHandler and describes in detail what each one does and how it should be implemented.  The first two methods are important, and the last two methods are not as important.&lt;br /&gt;
&lt;br /&gt;
=decode=&lt;br /&gt;
&lt;br /&gt;
This method needs to decode an incoming command into a command to be handled in the command formatter.  It should put the command into a commandObject and put the commandObject in the first slot in an arraylist and return the arraylist. Normally the command object is a string that Rifidi uses to find the the appropriate command handler. The rest of the slots in the ArrayList may be used to pass arguments to the command handler, i.e. a coherent object that contains the the information already parsed and ready for consumption.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;public ArrayList&amp;lt;Object&amp;gt; decode(byte[] arg);&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Arguments==&lt;br /&gt;
#arg - The incoming command as an array of bytes.&lt;br /&gt;
&lt;br /&gt;
==Return Value==&lt;br /&gt;
An array of objects where the first object is a command in the correct format to be processed by the command handler&lt;br /&gt;
&lt;br /&gt;
==Reference Implementation==&lt;br /&gt;
This is the decode method in the alien reader&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	public ArrayList&amp;lt;Object&amp;gt; decode(byte[] arg) {&lt;br /&gt;
		if (arg.length == 0) {&lt;br /&gt;
			ArrayList&amp;lt;Object&amp;gt; argArray = new ArrayList&amp;lt;Object&amp;gt;();&lt;br /&gt;
			argArray.add(&amp;quot;&amp;quot;);&lt;br /&gt;
			console = false;&lt;br /&gt;
			return argArray;&lt;br /&gt;
		}&lt;br /&gt;
		String newString = new String(arg);&lt;br /&gt;
&lt;br /&gt;
		logger.debug(&amp;quot;Formatter arg: &amp;quot; + newString);&lt;br /&gt;
&lt;br /&gt;
		ArrayList&amp;lt;Object&amp;gt; retVal = this.parseCommand(newString);&lt;br /&gt;
&lt;br /&gt;
		return retVal;&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=encode=&lt;br /&gt;
After a command has been processed by the command handler, the response it returns must be formatted to be sent back out to the client.&lt;br /&gt;
&amp;lt;pre&amp;gt;public ArrayList&amp;lt;Object&amp;gt; encode(ArrayList&amp;lt;Object&amp;gt; arg);&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Arguments==&lt;br /&gt;
#arg - The return message(s) before they has been processed is in the array of objects&lt;br /&gt;
&lt;br /&gt;
==Return Value==&lt;br /&gt;
An array of objects where each object is a formatted response message ready to be sent back to the client. It must be formatted in a way that [[READERNAME_Protocol.java]]::addProtocol() can understand.&lt;br /&gt;
&lt;br /&gt;
==Reference Implementation==&lt;br /&gt;
This is the encode method for the symbol reader.  Because some commands in the symbol reader need to have more than one response message (e.g. a data message and a final message), more than one raw message can be in the array list in arg.  For each message, the CRC must be calculated and appended.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	public ArrayList&amp;lt;Object&amp;gt; encode(ArrayList&amp;lt;Object&amp;gt; arg) {&lt;br /&gt;
&lt;br /&gt;
		ArrayList&amp;lt;Object&amp;gt; retVal = new ArrayList&amp;lt;Object&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
		for (Object o : arg) {&lt;br /&gt;
			byte[] command = (byte[]) o;&lt;br /&gt;
&lt;br /&gt;
			/*&lt;br /&gt;
			 * Create outgoing array list that is 3 slots bigger than incoming&lt;br /&gt;
			 * one: one for start of frame and two for crc bytes&lt;br /&gt;
			 */&lt;br /&gt;
			byte[] outgoingCommand = new byte[command.length + 3];&lt;br /&gt;
			for (int i = 0; i &amp;lt; command.length; i++) {&lt;br /&gt;
				outgoingCommand[i + 1] = command[i];&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			/* Add Start of Frame Byte */&lt;br /&gt;
			outgoingCommand[0] = 0x01;&lt;br /&gt;
&lt;br /&gt;
			// Calculate CRC&lt;br /&gt;
			int crc = CRC16.calculateCRC(command, 0xBEEF,&lt;br /&gt;
					CRC16.XR400_CRC_TABLE, true);&lt;br /&gt;
			byte[] crcBytes = ByteAndHexConvertingUtility&lt;br /&gt;
					.intToByteArray(crc, 2);&lt;br /&gt;
&lt;br /&gt;
			// put crc in outgoingCommand, LSB first&lt;br /&gt;
			outgoingCommand[outgoingCommand.length - 2] = crcBytes[1];&lt;br /&gt;
			outgoingCommand[outgoingCommand.length - 1] = crcBytes[0];&lt;br /&gt;
			&lt;br /&gt;
			logger.debug(ByteAndHexConvertingUtility.toHexString(outgoingCommand));&lt;br /&gt;
			&lt;br /&gt;
			&lt;br /&gt;
			retVal.add(outgoingCommand);&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return retVal;&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=promptSuppress=&lt;br /&gt;
This method is mainly used by the alien reader to determine if the reader should supress the prompt when sending back a response.  Other readers may need similar functionality.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;public boolean promptSuppress();&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Arguments==&lt;br /&gt;
&lt;br /&gt;
==Return Value==&lt;br /&gt;
true if the prompt should be surpressed&lt;br /&gt;
&lt;br /&gt;
=getActualCommand=&lt;br /&gt;
This method is mainly used by the alien reader to return a string that a user actually typed in.  Other readers may need similar functionality&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;public String getActualCommand(byte[] arg);&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Arguments==&lt;br /&gt;
#arg - The incoming command&lt;br /&gt;
&lt;br /&gt;
==Return Value==&lt;br /&gt;
A string that is the command the user typed in&lt;/div&gt;</summary>
		<author><name>Jmaine</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/READERNAME_CommandFormatter.java</id>
		<title>READERNAME CommandFormatter.java</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/READERNAME_CommandFormatter.java"/>
				<updated>2008-04-17T19:43:21Z</updated>
		
		<summary type="html">&lt;p&gt;Jmaine: /* decode */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:developerDoc]][[category:emulatorDoc]]&lt;br /&gt;
This class should implement CommandHandler.  This page goes through each of the four methods in CommandHandler and describes in detail what each one does and how it should be implemented.  The first two methods are important, and the last two methods are not as important.&lt;br /&gt;
&lt;br /&gt;
=decode=&lt;br /&gt;
&lt;br /&gt;
This method needs to decode an incoming command into a command to be handled in the command formatter.  It should put the command into a commandObject and put the commandObject in the first slot in an arraylist and return the arraylist. Normally the command object is a string that Rifidi uses to find the the appropriate command handler. The rest of the slots in the ArrayList may be used to pass arguments to the command handler, i.e. a coherent object that contains the the information already parsed and ready for consumption.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;public ArrayList&amp;lt;Object&amp;gt; decode(byte[] arg);&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Arguments==&lt;br /&gt;
#arg - The incoming command as an array of bytes.&lt;br /&gt;
&lt;br /&gt;
==Return Value==&lt;br /&gt;
An array of objects where the first object is a command in the correct format to be processed by the command handler&lt;br /&gt;
&lt;br /&gt;
==Reference Implementation==&lt;br /&gt;
This is the decode method in the alien reader&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	public ArrayList&amp;lt;Object&amp;gt; decode(byte[] arg) {&lt;br /&gt;
		if (arg.length == 0) {&lt;br /&gt;
			ArrayList&amp;lt;Object&amp;gt; argArray = new ArrayList&amp;lt;Object&amp;gt;();&lt;br /&gt;
			argArray.add(&amp;quot;&amp;quot;);&lt;br /&gt;
			console = false;&lt;br /&gt;
			return argArray;&lt;br /&gt;
		}&lt;br /&gt;
		String newString = new String(arg);&lt;br /&gt;
&lt;br /&gt;
		logger.debug(&amp;quot;Formatter arg: &amp;quot; + newString);&lt;br /&gt;
&lt;br /&gt;
		ArrayList&amp;lt;Object&amp;gt; retVal = this.parseCommand(newString);&lt;br /&gt;
&lt;br /&gt;
		return retVal;&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=encode=&lt;br /&gt;
After a command has been processed by the command handler, the response it returns must be formatted to be sent back out to the client.&lt;br /&gt;
&amp;lt;pre&amp;gt;public ArrayList&amp;lt;Object&amp;gt; encode(ArrayList&amp;lt;Object&amp;gt; arg);&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Arguments==&lt;br /&gt;
#arg - The return message(s) before they has been processed is in the array of objects&lt;br /&gt;
&lt;br /&gt;
==Return Value==&lt;br /&gt;
An array of objects where each object is a formatted response message ready to be sent back to the client.&lt;br /&gt;
&lt;br /&gt;
==Reference Implementation==&lt;br /&gt;
This is the encode method for the symbol reader.  Because some commands in the symbol reader need to have more than one response message (e.g. a data message and a final message), more than one raw message can be in the array list in arg.  For each message, the CRC must be calculated and appended.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	public ArrayList&amp;lt;Object&amp;gt; encode(ArrayList&amp;lt;Object&amp;gt; arg) {&lt;br /&gt;
&lt;br /&gt;
		ArrayList&amp;lt;Object&amp;gt; retVal = new ArrayList&amp;lt;Object&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
		for (Object o : arg) {&lt;br /&gt;
			byte[] command = (byte[]) o;&lt;br /&gt;
&lt;br /&gt;
			/*&lt;br /&gt;
			 * Create outgoing array list that is 3 slots bigger than incoming&lt;br /&gt;
			 * one: one for start of frame and two for crc bytes&lt;br /&gt;
			 */&lt;br /&gt;
			byte[] outgoingCommand = new byte[command.length + 3];&lt;br /&gt;
			for (int i = 0; i &amp;lt; command.length; i++) {&lt;br /&gt;
				outgoingCommand[i + 1] = command[i];&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			/* Add Start of Frame Byte */&lt;br /&gt;
			outgoingCommand[0] = 0x01;&lt;br /&gt;
&lt;br /&gt;
			// Calculate CRC&lt;br /&gt;
			int crc = CRC16.calculateCRC(command, 0xBEEF,&lt;br /&gt;
					CRC16.XR400_CRC_TABLE, true);&lt;br /&gt;
			byte[] crcBytes = ByteAndHexConvertingUtility&lt;br /&gt;
					.intToByteArray(crc, 2);&lt;br /&gt;
&lt;br /&gt;
			// put crc in outgoingCommand, LSB first&lt;br /&gt;
			outgoingCommand[outgoingCommand.length - 2] = crcBytes[1];&lt;br /&gt;
			outgoingCommand[outgoingCommand.length - 1] = crcBytes[0];&lt;br /&gt;
			&lt;br /&gt;
			logger.debug(ByteAndHexConvertingUtility.toHexString(outgoingCommand));&lt;br /&gt;
			&lt;br /&gt;
			&lt;br /&gt;
			retVal.add(outgoingCommand);&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return retVal;&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=promptSuppress=&lt;br /&gt;
This method is mainly used by the alien reader to determine if the reader should supress the prompt when sending back a response.  Other readers may need similar functionality.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;public boolean promptSuppress();&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Arguments==&lt;br /&gt;
&lt;br /&gt;
==Return Value==&lt;br /&gt;
true if the prompt should be surpressed&lt;br /&gt;
&lt;br /&gt;
=getActualCommand=&lt;br /&gt;
This method is mainly used by the alien reader to return a string that a user actually typed in.  Other readers may need similar functionality&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;public String getActualCommand(byte[] arg);&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Arguments==&lt;br /&gt;
#arg - The incoming command&lt;br /&gt;
&lt;br /&gt;
==Return Value==&lt;br /&gt;
A string that is the command the user typed in&lt;/div&gt;</summary>
		<author><name>Jmaine</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/REDERNAME_Module.java</id>
		<title>REDERNAME Module.java</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/REDERNAME_Module.java"/>
				<updated>2008-04-17T19:30:03Z</updated>
		
		<summary type="html">&lt;p&gt;Jmaine: /* Other Notes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:developerDoc]][[category:emulatorDoc]]&lt;br /&gt;
The readerModule is the constructor for the reader.  Every reader needs one of these classes.  The class needs to extend AbstractPowerModule and implement ReaderModule.&lt;br /&gt;
&lt;br /&gt;
=READERNAMEModule=&lt;br /&gt;
This is the main constructor for the reader  There should actually be two constructors.  One is an empty constructor that is needed for jaxb to automatically create the reader.  It should look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	public SymbolReaderModule(){&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The readermodule also needs a main constructor with this signature:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	public SymbolReaderModule(ControlSignal&amp;lt;Boolean&amp;gt; powerControlSignal,GeneralReaderPropertyHolder properties);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Arguments==&lt;br /&gt;
# powerControlSignal - The power control signal for the entire reader.  It is used to turn the reader on and off as well as to suspend and resume the reader.  See information on the power states in the module package for more explanation of this.&lt;br /&gt;
# properties - These are the properties that the reader creation wizzard constructed.  The GeneralReaderPropertyHolder contains the information required by the [[emulator.xml]].&lt;br /&gt;
&lt;br /&gt;
==Reference Implementation==&lt;br /&gt;
This is the constructor for the SymbolReaderModule.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	public SymbolReaderModule(ControlSignal&amp;lt;Boolean&amp;gt; powerControlSignal,&lt;br /&gt;
			GeneralReaderPropertyHolder properties) {&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
always start out with a call to the super class&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                super(SymbolReaderModuleOffPowerState.getInstance(),powerControlSignal);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
write some basic information to the console to let the user know that the reader is starting.  Note that we are getting some information from the generalRederProperyHolder&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
		consoleLogger = LogFactory.getLog(&amp;quot;console.&amp;quot;&lt;br /&gt;
				+ properties.getReaderName());&lt;br /&gt;
		consoleLogger.info(SymbolReaderModule.startupText&lt;br /&gt;
				+ &amp;quot;Instantiated Symbol Reader with name: &amp;quot;&lt;br /&gt;
				+ properties.getReaderName());&lt;br /&gt;
		consoleLogger.info(SymbolReaderModule.startupText&lt;br /&gt;
				+ properties.getReaderName() + &amp;quot; IP Address: &amp;quot;&lt;br /&gt;
				+ properties.getProperty(&amp;quot;byte_address&amp;quot;));&lt;br /&gt;
		consoleLogger.info(SymbolReaderModule.startupText&lt;br /&gt;
				+ properties.getReaderName() + &amp;quot; has &amp;quot;&lt;br /&gt;
				+ properties.getNumAntennas() + &amp;quot; antennas&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
set the name of the reader equal to the name given in the generalReaderPropertyHolder&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
		this.name = properties.getReaderName();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Initialize the digester and read in the command hander methods supplied in the [[reader.xml]] file&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
		digester = new CommandXMLDigester();&lt;br /&gt;
		digester.parseToCommand(this.getClass().getClassLoader()&lt;br /&gt;
				.getResourceAsStream(XMLLOCATION + &amp;quot;reader.xml&amp;quot;));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Create a new tag memory, create antennas, create a new radio and supply the tagMemory and antennas to the radio&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
		SymbolTagMemory tagMemory = new SymbolTagMemory();&lt;br /&gt;
&lt;br /&gt;
		HashMap&amp;lt;Integer, Antenna&amp;gt; antennaList = new HashMap&amp;lt;Integer, Antenna&amp;gt;();&lt;br /&gt;
		for (int i = 0; i &amp;lt; properties.getNumAntennas(); i++) {&lt;br /&gt;
			logger.debug(&amp;quot;creating an antenna: &amp;quot; + i);&lt;br /&gt;
			antennaList.put(i, new Antenna(i));&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		/* Make a Radio for the reader */&lt;br /&gt;
		GenericRadio genericRadio = new GenericRadio(antennaList, 25, tagMemory);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The symbol reader has two different IP addresses being used.  One is for byte commands, and the other is for HTTP commands.  parse out the IPs and ports from the GeneralReaderPropertyHolder&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
		String byte_address = ((String) properties.getProperty(&amp;quot;byte_address&amp;quot;))&lt;br /&gt;
				.split(&amp;quot;:&amp;quot;)[0];&lt;br /&gt;
		int byte_port = Integer.parseInt(((String) properties&lt;br /&gt;
				.getProperty(&amp;quot;byte_address&amp;quot;)).split(&amp;quot;:&amp;quot;)[1]);&lt;br /&gt;
&lt;br /&gt;
		String http_address = ((String) properties.getProperty(&amp;quot;http_address&amp;quot;))&lt;br /&gt;
				.split(&amp;quot;:&amp;quot;)[0];&lt;br /&gt;
		int http_port = Integer.parseInt(((String) properties&lt;br /&gt;
				.getProperty(&amp;quot;http_address&amp;quot;)).split(&amp;quot;:&amp;quot;)[1]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
create the shared resources and supply necessary information to it&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
		this.srsr = new SymbolReaderSharedResources(genericRadio, tagMemory,&lt;br /&gt;
				new ControlSignal&amp;lt;Boolean&amp;gt;(false), name, null, digester,&lt;br /&gt;
				new ControlSignal&amp;lt;Boolean&amp;gt;(false), new ControlSignal&amp;lt;Boolean&amp;gt;(&lt;br /&gt;
						false), new ControlSignal&amp;lt;Boolean&amp;gt;(false),&lt;br /&gt;
				new ControlSignal&amp;lt;Boolean&amp;gt;(false), antennaList.size());&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Create the communication objects.  In this case, we need two communication objects (one for bytes, and one for http), however, most readers will probably only need one.  Notice that this is where we supply the reader with the [[READERNAME_Protocol.java|Protocol]], [[READERNAME_StreamReaderFormatter.java|Stream Reader]], and [[READERNAME_LogFormatter.java|Log Formatter]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
		this.httpComm = new TCPServerCommunication(new RawProtocol(), this.srsr&lt;br /&gt;
				.getInteractiveHttpPowerSignal(), this.srsr&lt;br /&gt;
				.getInteractiveHttpConnectionSignal(), http_address, http_port,&lt;br /&gt;
				this.name, GenericByteStreamReader.class, new GenericByteLogFormatter());&lt;br /&gt;
&lt;br /&gt;
		this.byteComm = new TCPServerCommunication(new RawProtocol(), this.srsr&lt;br /&gt;
				.getInteractiveBytePowerSignal(), this.srsr&lt;br /&gt;
				.getInteractiveByteConnectionSignal(), byte_address, byte_port,&lt;br /&gt;
				this.name, GenericByteStreamReader.class, new GenericByteLogFormatter());&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Build the adapters for this reader.  Again, because the Symbol reader has two ways of communicating, we need two adapters.  See [[Command Flow]] for more information about the adapter.  This is where we supply the reader with the [[READERNAME_CommandFormatter.java|CommandFormatter]] and the [[READERNAME_ExceptionHanlder.java|ExceptionHandler]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
		this.interactiveBitAdapter = new ReflectiveCommandAdapter(&lt;br /&gt;
				&amp;quot;Interactive&amp;quot;, new SymbolBitCommandFormatter(), new SymbolBitExceptionHandler(),&lt;br /&gt;
				this.srsr, new RawCommandSearcher());&lt;br /&gt;
&lt;br /&gt;
		this.interactiveHttpAdapter = new ReflectiveCommandAdapter(&lt;br /&gt;
				&amp;quot;Interactive&amp;quot;, null, new SymbolBitExceptionHandler(), this.srsr, new RawCommandSearcher());&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Build the controllers.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
		this.interactiveBitController = new InteractiveCommandController(&lt;br /&gt;
				new LoginAuthenticatedCommandControllerOperatingState(&lt;br /&gt;
						interactiveBitAdapter), this.srsr&lt;br /&gt;
						.getInteractiveBytePowerSignal(), this.srsr&lt;br /&gt;
						.getInteractiveByteConnectionSignal(), this.byteComm);&lt;br /&gt;
&lt;br /&gt;
		this.interactiveHttpController = new InteractiveCommandController(&lt;br /&gt;
				new LoginAuthenticatedCommandControllerOperatingState(&lt;br /&gt;
						interactiveHttpAdapter), this.srsr&lt;br /&gt;
						.getInteractiveHttpPowerSignal(), this.srsr&lt;br /&gt;
						.getInteractiveHttpConnectionSignal(), this.httpComm);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=Other Notes=&lt;br /&gt;
Here is an example from the Thing Magic reader:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
		this.RQLComm = new TCPServerCommunication(new ThingMagicProtocol(), this.tmsr&lt;br /&gt;
				.getInteractiveRQLPowerSignal(), this.tmsr&lt;br /&gt;
				.getInteractiveRQLConnectionSignal(), rql_address, rql_port,&lt;br /&gt;
				this.name, GenericCharStreamReader.class, new GenericStringLogFormatter());&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Notice the difference of this from the Symbol example. We are using GenericCharStreamReader and GenericStringLogFormatter instead. These are used when a client can be a standard telnet connection (another example of this is the Alien reader).&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In addition, if you need to override the default command searcher, RawCommandSearcher, then replace this class with a different implementation and pass it to ReflectiveCommandAdapter instead of the default one.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Also, one can add a few more parameters to ones implementation of the shared resources if it that information (object or primitive type) if it is needed across different areas of the reader (including its accessors and mutators if needed).&lt;br /&gt;
&lt;br /&gt;
=Other Methods=&lt;br /&gt;
The ReaderModule will also need to implement some other methods required by the interface that it implements, however, these methods should be nearly identical to similar methods in the other readers.  Please see the other readers and follow examples there for more information.&lt;/div&gt;</summary>
		<author><name>Jmaine</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/REDERNAME_Module.java</id>
		<title>REDERNAME Module.java</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/REDERNAME_Module.java"/>
				<updated>2008-04-17T19:25:20Z</updated>
		
		<summary type="html">&lt;p&gt;Jmaine: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:developerDoc]][[category:emulatorDoc]]&lt;br /&gt;
The readerModule is the constructor for the reader.  Every reader needs one of these classes.  The class needs to extend AbstractPowerModule and implement ReaderModule.&lt;br /&gt;
&lt;br /&gt;
=READERNAMEModule=&lt;br /&gt;
This is the main constructor for the reader  There should actually be two constructors.  One is an empty constructor that is needed for jaxb to automatically create the reader.  It should look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	public SymbolReaderModule(){&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The readermodule also needs a main constructor with this signature:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	public SymbolReaderModule(ControlSignal&amp;lt;Boolean&amp;gt; powerControlSignal,GeneralReaderPropertyHolder properties);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Arguments==&lt;br /&gt;
# powerControlSignal - The power control signal for the entire reader.  It is used to turn the reader on and off as well as to suspend and resume the reader.  See information on the power states in the module package for more explanation of this.&lt;br /&gt;
# properties - These are the properties that the reader creation wizzard constructed.  The GeneralReaderPropertyHolder contains the information required by the [[emulator.xml]].&lt;br /&gt;
&lt;br /&gt;
==Reference Implementation==&lt;br /&gt;
This is the constructor for the SymbolReaderModule.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	public SymbolReaderModule(ControlSignal&amp;lt;Boolean&amp;gt; powerControlSignal,&lt;br /&gt;
			GeneralReaderPropertyHolder properties) {&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
always start out with a call to the super class&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                super(SymbolReaderModuleOffPowerState.getInstance(),powerControlSignal);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
write some basic information to the console to let the user know that the reader is starting.  Note that we are getting some information from the generalRederProperyHolder&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
		consoleLogger = LogFactory.getLog(&amp;quot;console.&amp;quot;&lt;br /&gt;
				+ properties.getReaderName());&lt;br /&gt;
		consoleLogger.info(SymbolReaderModule.startupText&lt;br /&gt;
				+ &amp;quot;Instantiated Symbol Reader with name: &amp;quot;&lt;br /&gt;
				+ properties.getReaderName());&lt;br /&gt;
		consoleLogger.info(SymbolReaderModule.startupText&lt;br /&gt;
				+ properties.getReaderName() + &amp;quot; IP Address: &amp;quot;&lt;br /&gt;
				+ properties.getProperty(&amp;quot;byte_address&amp;quot;));&lt;br /&gt;
		consoleLogger.info(SymbolReaderModule.startupText&lt;br /&gt;
				+ properties.getReaderName() + &amp;quot; has &amp;quot;&lt;br /&gt;
				+ properties.getNumAntennas() + &amp;quot; antennas&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
set the name of the reader equal to the name given in the generalReaderPropertyHolder&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
		this.name = properties.getReaderName();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Initialize the digester and read in the command hander methods supplied in the [[reader.xml]] file&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
		digester = new CommandXMLDigester();&lt;br /&gt;
		digester.parseToCommand(this.getClass().getClassLoader()&lt;br /&gt;
				.getResourceAsStream(XMLLOCATION + &amp;quot;reader.xml&amp;quot;));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Create a new tag memory, create antennas, create a new radio and supply the tagMemory and antennas to the radio&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
		SymbolTagMemory tagMemory = new SymbolTagMemory();&lt;br /&gt;
&lt;br /&gt;
		HashMap&amp;lt;Integer, Antenna&amp;gt; antennaList = new HashMap&amp;lt;Integer, Antenna&amp;gt;();&lt;br /&gt;
		for (int i = 0; i &amp;lt; properties.getNumAntennas(); i++) {&lt;br /&gt;
			logger.debug(&amp;quot;creating an antenna: &amp;quot; + i);&lt;br /&gt;
			antennaList.put(i, new Antenna(i));&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		/* Make a Radio for the reader */&lt;br /&gt;
		GenericRadio genericRadio = new GenericRadio(antennaList, 25, tagMemory);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The symbol reader has two different IP addresses being used.  One is for byte commands, and the other is for HTTP commands.  parse out the IPs and ports from the GeneralReaderPropertyHolder&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
		String byte_address = ((String) properties.getProperty(&amp;quot;byte_address&amp;quot;))&lt;br /&gt;
				.split(&amp;quot;:&amp;quot;)[0];&lt;br /&gt;
		int byte_port = Integer.parseInt(((String) properties&lt;br /&gt;
				.getProperty(&amp;quot;byte_address&amp;quot;)).split(&amp;quot;:&amp;quot;)[1]);&lt;br /&gt;
&lt;br /&gt;
		String http_address = ((String) properties.getProperty(&amp;quot;http_address&amp;quot;))&lt;br /&gt;
				.split(&amp;quot;:&amp;quot;)[0];&lt;br /&gt;
		int http_port = Integer.parseInt(((String) properties&lt;br /&gt;
				.getProperty(&amp;quot;http_address&amp;quot;)).split(&amp;quot;:&amp;quot;)[1]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
create the shared resources and supply necessary information to it&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
		this.srsr = new SymbolReaderSharedResources(genericRadio, tagMemory,&lt;br /&gt;
				new ControlSignal&amp;lt;Boolean&amp;gt;(false), name, null, digester,&lt;br /&gt;
				new ControlSignal&amp;lt;Boolean&amp;gt;(false), new ControlSignal&amp;lt;Boolean&amp;gt;(&lt;br /&gt;
						false), new ControlSignal&amp;lt;Boolean&amp;gt;(false),&lt;br /&gt;
				new ControlSignal&amp;lt;Boolean&amp;gt;(false), antennaList.size());&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Create the communication objects.  In this case, we need two communication objects (one for bytes, and one for http), however, most readers will probably only need one.  Notice that this is where we supply the reader with the [[READERNAME_Protocol.java|Protocol]], [[READERNAME_StreamReaderFormatter.java|Stream Reader]], and [[READERNAME_LogFormatter.java|Log Formatter]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
		this.httpComm = new TCPServerCommunication(new RawProtocol(), this.srsr&lt;br /&gt;
				.getInteractiveHttpPowerSignal(), this.srsr&lt;br /&gt;
				.getInteractiveHttpConnectionSignal(), http_address, http_port,&lt;br /&gt;
				this.name, GenericByteStreamReader.class, new GenericByteLogFormatter());&lt;br /&gt;
&lt;br /&gt;
		this.byteComm = new TCPServerCommunication(new RawProtocol(), this.srsr&lt;br /&gt;
				.getInteractiveBytePowerSignal(), this.srsr&lt;br /&gt;
				.getInteractiveByteConnectionSignal(), byte_address, byte_port,&lt;br /&gt;
				this.name, GenericByteStreamReader.class, new GenericByteLogFormatter());&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Build the adapters for this reader.  Again, because the Symbol reader has two ways of communicating, we need two adapters.  See [[Command Flow]] for more information about the adapter.  This is where we supply the reader with the [[READERNAME_CommandFormatter.java|CommandFormatter]] and the [[READERNAME_ExceptionHanlder.java|ExceptionHandler]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
		this.interactiveBitAdapter = new ReflectiveCommandAdapter(&lt;br /&gt;
				&amp;quot;Interactive&amp;quot;, new SymbolBitCommandFormatter(), new SymbolBitExceptionHandler(),&lt;br /&gt;
				this.srsr, new RawCommandSearcher());&lt;br /&gt;
&lt;br /&gt;
		this.interactiveHttpAdapter = new ReflectiveCommandAdapter(&lt;br /&gt;
				&amp;quot;Interactive&amp;quot;, null, new SymbolBitExceptionHandler(), this.srsr, new RawCommandSearcher());&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Build the controllers.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
		this.interactiveBitController = new InteractiveCommandController(&lt;br /&gt;
				new LoginAuthenticatedCommandControllerOperatingState(&lt;br /&gt;
						interactiveBitAdapter), this.srsr&lt;br /&gt;
						.getInteractiveBytePowerSignal(), this.srsr&lt;br /&gt;
						.getInteractiveByteConnectionSignal(), this.byteComm);&lt;br /&gt;
&lt;br /&gt;
		this.interactiveHttpController = new InteractiveCommandController(&lt;br /&gt;
				new LoginAuthenticatedCommandControllerOperatingState(&lt;br /&gt;
						interactiveHttpAdapter), this.srsr&lt;br /&gt;
						.getInteractiveHttpPowerSignal(), this.srsr&lt;br /&gt;
						.getInteractiveHttpConnectionSignal(), this.httpComm);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=Other Notes=&lt;br /&gt;
Here is an example from the Thing Magic reader:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
		this.RQLComm = new TCPServerCommunication(new ThingMagicProtocol(), this.tmsr&lt;br /&gt;
				.getInteractiveRQLPowerSignal(), this.tmsr&lt;br /&gt;
				.getInteractiveRQLConnectionSignal(), rql_address, rql_port,&lt;br /&gt;
				this.name, GenericCharStreamReader.class, new GenericStringLogFormatter());&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Notice the difference of this from the Symbol example. We are using GenericCharStreamReader and GenericStringLogFormatter instead. These are used when a client can be a standard telnet connection (another example of this is the Alien reader).&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In addition, if you need to override the default command searcher, RawCommandSearcher, then replace this class with a different implementation and pass it to ReflectiveCommandAdapter instead of the default one.&lt;br /&gt;
&lt;br /&gt;
=Other Methods=&lt;br /&gt;
The ReaderModule will also need to implement some other methods required by the interface that it implements, however, these methods should be nearly identical to similar methods in the other readers.  Please see the other readers and follow examples there for more information.&lt;/div&gt;</summary>
		<author><name>Jmaine</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/ThingMagic/Emulator_Architecture</id>
		<title>ThingMagic/Emulator Architecture</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/ThingMagic/Emulator_Architecture"/>
				<updated>2008-04-17T17:56:49Z</updated>
		
		<summary type="html">&lt;p&gt;Jmaine: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Here is the UML diagram for the ThingMagic specific parts of the emulator in Rifidi.&lt;br /&gt;
[[Image:Thingmagic.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Here is the flow diagram for the emulator.&lt;br /&gt;
[[Image:Thingmagic_flow_diagram.png]]&lt;/div&gt;</summary>
		<author><name>Jmaine</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/File:Thingmagic_flow_diagram.png</id>
		<title>File:Thingmagic flow diagram.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/File:Thingmagic_flow_diagram.png"/>
				<updated>2008-04-17T17:55:50Z</updated>
		
		<summary type="html">&lt;p&gt;Jmaine: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Jmaine</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/ThingMagic/Emulator_Architecture</id>
		<title>ThingMagic/Emulator Architecture</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/ThingMagic/Emulator_Architecture"/>
				<updated>2008-04-12T18:05:04Z</updated>
		
		<summary type="html">&lt;p&gt;Jmaine: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Here is the UML diagram for the ThingMagic specific parts of the emulator in Rifidi.&lt;br /&gt;
[[Image:Thingmagic.png|800px]]&lt;/div&gt;</summary>
		<author><name>Jmaine</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/ThingMagic/Emulator_Architecture</id>
		<title>ThingMagic/Emulator Architecture</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/ThingMagic/Emulator_Architecture"/>
				<updated>2008-04-12T18:04:10Z</updated>
		
		<summary type="html">&lt;p&gt;Jmaine: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Here is the UML diagram for the ThingMagic specific parts of the emulator in Rifidi.&lt;br /&gt;
[[Image:Thingmagic.png|700px]]&lt;/div&gt;</summary>
		<author><name>Jmaine</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/ThingMagic/Emulator_Architecture</id>
		<title>ThingMagic/Emulator Architecture</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/ThingMagic/Emulator_Architecture"/>
				<updated>2008-04-12T18:03:51Z</updated>
		
		<summary type="html">&lt;p&gt;Jmaine: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Here is the UML diagram for the ThingMagic specific parts of the emulator in Rifidi.&lt;br /&gt;
[[Image:Thingmagic.png|600px]]&lt;/div&gt;</summary>
		<author><name>Jmaine</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/ThingMagic/Emulator_Architecture</id>
		<title>ThingMagic/Emulator Architecture</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/ThingMagic/Emulator_Architecture"/>
				<updated>2008-04-12T17:59:18Z</updated>
		
		<summary type="html">&lt;p&gt;Jmaine: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Here is the UML diagram for the ThingMagic specific parts of the emulator in Rifidi.&lt;br /&gt;
[[Image:Thingmagic.png]]&lt;/div&gt;</summary>
		<author><name>Jmaine</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/File:Thingmagic.png</id>
		<title>File:Thingmagic.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/File:Thingmagic.png"/>
				<updated>2008-04-12T17:58:35Z</updated>
		
		<summary type="html">&lt;p&gt;Jmaine: Thing Magic UML diagram&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Thing Magic UML diagram&lt;/div&gt;</summary>
		<author><name>Jmaine</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/ThingMagic/Emulator_Architecture</id>
		<title>ThingMagic/Emulator Architecture</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/ThingMagic/Emulator_Architecture"/>
				<updated>2008-04-12T17:57:18Z</updated>
		
		<summary type="html">&lt;p&gt;Jmaine: New page: Here is the UML diagram for the ThingMagic specific parts of the emulator in Rifidi.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Here is the UML diagram for the ThingMagic specific parts of the emulator in Rifidi.&lt;/div&gt;</summary>
		<author><name>Jmaine</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/ThingMagic</id>
		<title>ThingMagic</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/ThingMagic"/>
				<updated>2008-04-12T17:55:51Z</updated>
		
		<summary type="html">&lt;p&gt;Jmaine: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:developerDoc]][[Category:EmulatorDoc]][[Category:userDoc]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
;Model Number: &lt;br /&gt;
 4&lt;br /&gt;
;Network Protocol: &lt;br /&gt;
SQL like protocol that may be wrapped in ssh, web interface, RCP, and Linux shell login.&lt;br /&gt;
;Communication:   &lt;br /&gt;
10/100 BaseT Ethernet – RJ45&lt;br /&gt;
;Antennas:&lt;br /&gt;
4 read points (4 transmit points, 4 receive points)&lt;br /&gt;
;General Purpose I/O:&lt;br /&gt;
(To Do)&lt;br /&gt;
&lt;br /&gt;
==Basis of Virtual Reader==&lt;br /&gt;
The reader accepts SQL style protocol and returns the appropriate information.&lt;br /&gt;
&lt;br /&gt;
===Documentation===&lt;br /&gt;
 &lt;br /&gt;
===Client Tools===&lt;br /&gt;
Telnet, SSH clients, and Tag Centric&lt;br /&gt;
&lt;br /&gt;
==Reader Design==&lt;br /&gt;
This section will give a brief overview of how the hardware reader operates for the purposes of emulation. &lt;br /&gt;
Here is the architecture for the emulator: [[ThingMagic/Emulator_Architecture]]&lt;br /&gt;
===Communication===&lt;br /&gt;
&lt;br /&gt;
====Protocols====&lt;br /&gt;
The main method for communicating with the reader is via TCP, TCP+SSH on port 8080, web interface, and RCP.&lt;br /&gt;
&lt;br /&gt;
===Memory Model===&lt;br /&gt;
The memory model is like a state based database.&lt;br /&gt;
===Getting Tags===&lt;br /&gt;
Getting tags is fairly simple just execute:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
telnet [reader ip address] 8080&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Then type:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id from tag_id set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Note: the semicolon at the end of each command is necessary.&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
One can also return multiple items:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id, protocol_id from tag_id set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also add filters or conditionals:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id from tag_id where [condition or filter] set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In addition more than one statement can be put on more than one line.&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id from tag_id set time_out=[milliseconds]; select protocol from tag_id set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tag Centric reads tags in the following manner:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id,read_count from tag_id WHERE (protocol_id='EPC0' and protocol_id='EPC1' and protocol_id='GEN2') set time_out=200;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
From this, one can tell if two conditions conjoined with 'AND' use the same column name, it counts as a logical 'OR'.&lt;br /&gt;
====Timer====&lt;br /&gt;
&lt;br /&gt;
====Autonomous Mode====&lt;br /&gt;
&lt;br /&gt;
===Login===&lt;br /&gt;
By SSH log in.&lt;br /&gt;
&lt;br /&gt;
===RQL Schema===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ tag_id&lt;br /&gt;
! Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R || protocol_id || Int&lt;br /&gt;
|-&lt;br /&gt;
|R || antenna_id || Int&lt;br /&gt;
|-&lt;br /&gt;
|R || read_count || Int&lt;br /&gt;
|-&lt;br /&gt;
| R/W || id || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|W || killed || Int&lt;br /&gt;
|-&lt;br /&gt;
|W || password || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|R || locked || Int&lt;br /&gt;
|-&lt;br /&gt;
|R || frequency || Int&lt;br /&gt;
|-&lt;br /&gt;
|R || dspmicros || Int&lt;br /&gt;
|-&lt;br /&gt;
|R  || timestamp || String&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ tag_data&lt;br /&gt;
! Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R || id || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || block number || Int&lt;br /&gt;
|-&lt;br /&gt;
|R/W || data || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|R || locked || Int&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ settings&lt;br /&gt;
! Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R || current_time || String&lt;br /&gt;
|-               &lt;br /&gt;
|R || version || String&lt;br /&gt;
|-&lt;br /&gt;
|R || supported_protocols || String&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ io&lt;br /&gt;
!Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R/W || data || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ saved_settings&lt;br /&gt;
!Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R/W || hostname || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || iface || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || dhcpcd || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ip_address || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || netmask || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || gateway || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ntp_servers || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || 1tx_power || String&lt;br /&gt;
|-            &lt;br /&gt;
|R/W || uhf_power_centidbm || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || epc1_id_length || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || primary_dns || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || secondary_dns || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || domain_name || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || reader_description || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || reader_role || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ant1_readpoint_descr || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ant2_readpoint_descr || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ant3_readpoint_descr || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ant4_readpoint_descr || String&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Supported Features==&lt;br /&gt;
[To do.]&lt;br /&gt;
&lt;br /&gt;
==Unsupported Features &amp;amp; Bugs==&lt;br /&gt;
Linux shell access to reader. This is fairly complex and require to emulate the entire hardware infrastructure of the reader and an ARM possessor. Also the web and RCP interface might be developed at a later time.&lt;/div&gt;</summary>
		<author><name>Jmaine</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/ThingMagic</id>
		<title>ThingMagic</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/ThingMagic"/>
				<updated>2008-03-20T02:10:49Z</updated>
		
		<summary type="html">&lt;p&gt;Jmaine: /* RQL Schema */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:developerDoc]][[Category:EmulatorDoc]][[Category:userDoc]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
;Model Number: &lt;br /&gt;
 4&lt;br /&gt;
;Network Protocol: &lt;br /&gt;
SQL like protocol that may be wrapped in ssh, web interface, RCP, and Linux shell login.&lt;br /&gt;
;Communication:   &lt;br /&gt;
10/100 BaseT Ethernet – RJ45&lt;br /&gt;
;Antennas:&lt;br /&gt;
4 read points (4 transmit points, 4 receive points)&lt;br /&gt;
;General Purpose I/O:&lt;br /&gt;
(To Do)&lt;br /&gt;
&lt;br /&gt;
==Basis of Virtual Reader==&lt;br /&gt;
The reader accepts SQL style protocol and returns the appropriate information.&lt;br /&gt;
&lt;br /&gt;
===Documentation===&lt;br /&gt;
 &lt;br /&gt;
===Client Tools===&lt;br /&gt;
Telnet, SSH clients, and Tag Centric&lt;br /&gt;
&lt;br /&gt;
==Reader Design==&lt;br /&gt;
This section will give a brief overview of how the hardware reader operates for the purposes of emulation. &lt;br /&gt;
===Communication===&lt;br /&gt;
&lt;br /&gt;
====Protocols====&lt;br /&gt;
The main method for communicating with the reader is via TCP, TCP+SSH on port 8080, web interface, and RCP.&lt;br /&gt;
&lt;br /&gt;
===Memory Model===&lt;br /&gt;
The memory model is like a state based database.&lt;br /&gt;
===Getting Tags===&lt;br /&gt;
Getting tags is fairly simple just execute:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
telnet [reader ip address] 8080&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Then type:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id from tag_id set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Note: the semicolon at the end of each command is necessary.&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
One can also return multiple items:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id, protocol_id from tag_id set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also add filters or conditionals:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id from tag_id where [condition or filter] set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In addition more than one statement can be put on more than one line.&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id from tag_id set time_out=[milliseconds]; select protocol from tag_id set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tag Centric reads tags in the following manner:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id,read_count from tag_id WHERE (protocol_id='EPC0' and protocol_id='EPC1' and protocol_id='GEN2') set time_out=200;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
From this, one can tell if two conditions conjoined with 'AND' use the same column name, it counts as a logical 'OR'.&lt;br /&gt;
====Timer====&lt;br /&gt;
&lt;br /&gt;
====Autonomous Mode====&lt;br /&gt;
&lt;br /&gt;
===Login===&lt;br /&gt;
By SSH log in.&lt;br /&gt;
&lt;br /&gt;
===RQL Schema===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ tag_id&lt;br /&gt;
! Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R || protocol_id || Int&lt;br /&gt;
|-&lt;br /&gt;
|R || antenna_id || Int&lt;br /&gt;
|-&lt;br /&gt;
|R || read_count || Int&lt;br /&gt;
|-&lt;br /&gt;
| R/W || id || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|W || killed || Int&lt;br /&gt;
|-&lt;br /&gt;
|W || password || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|R || locked || Int&lt;br /&gt;
|-&lt;br /&gt;
|R || frequency || Int&lt;br /&gt;
|-&lt;br /&gt;
|R || dspmicros || Int&lt;br /&gt;
|-&lt;br /&gt;
|R  || timestamp || String&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ tag_data&lt;br /&gt;
! Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R || id || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || block number || Int&lt;br /&gt;
|-&lt;br /&gt;
|R/W || data || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|R || locked || Int&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ settings&lt;br /&gt;
! Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R || current_time || String&lt;br /&gt;
|-               &lt;br /&gt;
|R || version || String&lt;br /&gt;
|-&lt;br /&gt;
|R || supported_protocols || String&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ io&lt;br /&gt;
!Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R/W || data || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ saved_settings&lt;br /&gt;
!Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R/W || hostname || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || iface || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || dhcpcd || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ip_address || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || netmask || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || gateway || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ntp_servers || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || 1tx_power || String&lt;br /&gt;
|-            &lt;br /&gt;
|R/W || uhf_power_centidbm || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || epc1_id_length || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || primary_dns || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || secondary_dns || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || domain_name || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || reader_description || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || reader_role || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ant1_readpoint_descr || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ant2_readpoint_descr || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ant3_readpoint_descr || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ant4_readpoint_descr || String&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Supported Features==&lt;br /&gt;
[To do.]&lt;br /&gt;
&lt;br /&gt;
==Unsupported Features &amp;amp; Bugs==&lt;br /&gt;
Linux shell access to reader. This is fairly complex and require to emulate the entire hardware infrastructure of the reader and an ARM possessor. Also the web and RCP interface might be developed at a later time.&lt;/div&gt;</summary>
		<author><name>Jmaine</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/ThingMagic</id>
		<title>ThingMagic</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/ThingMagic"/>
				<updated>2008-03-19T18:36:55Z</updated>
		
		<summary type="html">&lt;p&gt;Jmaine: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:developerDoc]][[Category:EmulatorDoc]][[Category:userDoc]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
;Model Number: &lt;br /&gt;
 4&lt;br /&gt;
;Network Protocol: &lt;br /&gt;
SQL like protocol that may be wrapped in ssh, web interface, RCP, and Linux shell login.&lt;br /&gt;
;Communication:   &lt;br /&gt;
10/100 BaseT Ethernet – RJ45&lt;br /&gt;
;Antennas:&lt;br /&gt;
4 read points (4 transmit points, 4 receive points)&lt;br /&gt;
;General Purpose I/O:&lt;br /&gt;
(To Do)&lt;br /&gt;
&lt;br /&gt;
==Basis of Virtual Reader==&lt;br /&gt;
The reader accepts SQL style protocol and returns the appropriate information.&lt;br /&gt;
&lt;br /&gt;
===Documentation===&lt;br /&gt;
 &lt;br /&gt;
===Client Tools===&lt;br /&gt;
Telnet, SSH clients, and Tag Centric&lt;br /&gt;
&lt;br /&gt;
==Reader Design==&lt;br /&gt;
This section will give a brief overview of how the hardware reader operates for the purposes of emulation. &lt;br /&gt;
===Communication===&lt;br /&gt;
&lt;br /&gt;
====Protocols====&lt;br /&gt;
The main method for communicating with the reader is via TCP, TCP+SSH on port 8080, web interface, and RCP.&lt;br /&gt;
&lt;br /&gt;
===Memory Model===&lt;br /&gt;
The memory model is like a state based database.&lt;br /&gt;
===Getting Tags===&lt;br /&gt;
Getting tags is fairly simple just execute:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
telnet [reader ip address] 8080&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Then type:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id from tag_id set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Note: the semicolon at the end of each command is necessary.&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
One can also return multiple items:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id, protocol_id from tag_id set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also add filters or conditionals:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id from tag_id where [condition or filter] set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In addition more than one statement can be put on more than one line.&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id from tag_id set time_out=[milliseconds]; select protocol from tag_id set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tag Centric reads tags in the following manner:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id,read_count from tag_id WHERE (protocol_id='EPC0' and protocol_id='EPC1' and protocol_id='GEN2') set time_out=200;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
From this, one can tell if two conditions conjoined with 'AND' use the same column name, it counts as a logical 'OR'.&lt;br /&gt;
====Timer====&lt;br /&gt;
&lt;br /&gt;
====Autonomous Mode====&lt;br /&gt;
&lt;br /&gt;
===Login===&lt;br /&gt;
By SSH log in.&lt;br /&gt;
&lt;br /&gt;
===RQL Schema===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ tag_id&lt;br /&gt;
! Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R || protocol_id || Int&lt;br /&gt;
|-&lt;br /&gt;
|R || antenna_id || Int&lt;br /&gt;
|-&lt;br /&gt;
|R || read_count || Int&lt;br /&gt;
|-&lt;br /&gt;
| R/W || id || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|W || killed || Int&lt;br /&gt;
|-&lt;br /&gt;
|W || password || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|R || locked || Int&lt;br /&gt;
|-&lt;br /&gt;
|R || frequency || Int&lt;br /&gt;
|-&lt;br /&gt;
|R || dspmicros || Int&lt;br /&gt;
|-&lt;br /&gt;
|R  || timestamp || String&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ tag_data&lt;br /&gt;
! Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R || id || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || block number || Int&lt;br /&gt;
|-&lt;br /&gt;
|R/W || data || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|R || locked || Int&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ settings&lt;br /&gt;
! Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R || current_time || String&lt;br /&gt;
|-               &lt;br /&gt;
|R || version || String&lt;br /&gt;
|-&lt;br /&gt;
|R || supported_protocols || String&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ io&lt;br /&gt;
!Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R/W || data || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ saved_settings&lt;br /&gt;
!Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R/W || hostname || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || iface || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || dhcpcd || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ip_address || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || netmask || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || gateway || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ntp_servers || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || 1tx_power || String&lt;br /&gt;
|-            &lt;br /&gt;
|R/W || uhf_power_centidbm || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || epc1_id_length || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || primary_dns || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || secondary_dns || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || domain_name || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || reader_description || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || reader_role || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ant1_readpoint_descr || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ant2_readpoint_descr || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ant3_readpoint_descr || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ant4_readpoint_descr || Stromg&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Supported Features==&lt;br /&gt;
[To do.]&lt;br /&gt;
&lt;br /&gt;
==Unsupported Features &amp;amp; Bugs==&lt;br /&gt;
Linux shell access to reader. This is fairly complex and require to emulate the entire hardware infrastructure of the reader and an ARM possessor. Also the web and RCP interface might be developed at a later time.&lt;/div&gt;</summary>
		<author><name>Jmaine</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/Reader_Activator.java</id>
		<title>Reader Activator.java</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/Reader_Activator.java"/>
				<updated>2008-02-23T03:18:58Z</updated>
		
		<summary type="html">&lt;p&gt;Jmaine: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:developerDoc]][[category:emulatorDoc]]&lt;br /&gt;
You should only modify Activator.java that was automatically created to create and register the reader--like this (Example taken from ThingMagic Reader):&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
public class Activator implements BundleActivator  {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	/*&lt;br /&gt;
	 * (non-Javadoc)&lt;br /&gt;
	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)&lt;br /&gt;
	 */&lt;br /&gt;
	public void start(BundleContext context) throws Exception {&lt;br /&gt;
		System.out.println(&amp;quot;Registered org.rifidi.emulator.reader.thingmagic&amp;quot;);&lt;br /&gt;
		context.registerService(new String[]{ReaderModule.class.getName()}, new ThingMagicReaderModule(), new Hashtable());&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/*&lt;br /&gt;
	 * (non-Javadoc)&lt;br /&gt;
	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)&lt;br /&gt;
	 */&lt;br /&gt;
	public void stop(BundleContext context) throws Exception {&lt;br /&gt;
		System.out.println(&amp;quot;Shutting down org.rifidi.emulator.reader.thingmagic&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Notice those those three total lines of code in the methods '''start''' and '''stop'''. Those are the only lines one has to add then chance '''ThingMagic''' or '''thingmagic''' to match the name of the reader one is building.&lt;/div&gt;</summary>
		<author><name>Jmaine</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/Reader_Activator.java</id>
		<title>Reader Activator.java</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/Reader_Activator.java"/>
				<updated>2008-02-23T03:10:05Z</updated>
		
		<summary type="html">&lt;p&gt;Jmaine: New page: You should only modify Activator.java that was automatically created to create and register the reader--like this (Example taken from ThingMagic Reader): &amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt; public class Activat...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;You should only modify Activator.java that was automatically created to create and register the reader--like this (Example taken from ThingMagic Reader):&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
public class Activator implements BundleActivator  {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	/*&lt;br /&gt;
	 * (non-Javadoc)&lt;br /&gt;
	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)&lt;br /&gt;
	 */&lt;br /&gt;
	public void start(BundleContext context) throws Exception {&lt;br /&gt;
		System.out.println(&amp;quot;Registered org.rifidi.emulator.reader.thingmagic&amp;quot;);&lt;br /&gt;
		context.registerService(new String[]{ReaderModule.class.getName()}, new ThingMagicReaderModule(), new Hashtable());&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/*&lt;br /&gt;
	 * (non-Javadoc)&lt;br /&gt;
	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)&lt;br /&gt;
	 */&lt;br /&gt;
	public void stop(BundleContext context) throws Exception {&lt;br /&gt;
		System.out.println(&amp;quot;Shutting down org.rifidi.emulator.reader.thingmagic&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Notice those those three total lines of code in the methods '''start''' and '''stop'''. Those are the only lines one has to add then chance '''ThingMagic''' or '''thingmagic''' to match the name of the reader one is building.&lt;/div&gt;</summary>
		<author><name>Jmaine</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/Package_Structure_for_a_reader_project</id>
		<title>Package Structure for a reader project</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/Package_Structure_for_a_reader_project"/>
				<updated>2008-02-23T03:03:12Z</updated>
		
		<summary type="html">&lt;p&gt;Jmaine: /* org.rifidi.emulator.reader.READERNAME */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:developerDoc]][[category:emulatorDoc]]&lt;br /&gt;
&lt;br /&gt;
Please refer to [[Create a new reader project | this document]] to figure out how to create a new reader project in eclipse&lt;br /&gt;
&lt;br /&gt;
This page enumerates the very basic packages that a reader will need to have and the important files in each one.  Complex readers will have more packages than these, but this is a bare minimum.  These packages correspond with what you will need to program in [[Reader_Development_Stages#Stage_2_Reader_Core_Implementation| stage 2 of reader creation]].&lt;br /&gt;
==org.rifidi.emulator.reader.READERNAME==&lt;br /&gt;
This package just contains the osgi activator.  It should be created for you automatically when you create the project.  You have to modify it only to make sure it sets up the reader. [[Reader_Activator.java|Activator.java]]&lt;br /&gt;
&lt;br /&gt;
==org.rifidi.emualtor.reader.READERNAME.command.exception==&lt;br /&gt;
This package contains a file that handles exceptions that occur in the parsing and execution of reader commands.&lt;br /&gt;
*[[READERNAME_ExceptionHanlder.java]] &lt;br /&gt;
==org.rifidi.emualtor.reader.READERNAME.commandhandler==&lt;br /&gt;
This package contains one or more files that handle incoming reader messages.  Normally commands can be divided into general categories.  For example, with the LLRP reader, there are a set of commands that deal with ROSPec messages (such as ADD_ROSPEC, ENABLE_ROSPEC, etc.) and a separate set of commands that deal with AccessSpec messages (such as ADD_ACCESSSPEC, ENABLE_ACCESSSPEC).  So for the LLRP reader, there is one file called 'LLRPReaderOperationControl.java' that contains the handler methods for ROSpec commands and  a file called 'LLRPAccessControl.java' that contains the handler methods for AccessSpec commands.  &lt;br /&gt;
*[[READERNAME_CATEGORY_Handler.java]]&lt;br /&gt;
==org.rifidi.emualtor.reader.READERNAME.formatter==&lt;br /&gt;
Any kind of formatters used should go into this package.  You will definitely need a formatter that handles the parsing of incoming and outgoing commands called &lt;br /&gt;
*[[READERNAME_CommandFormatter.java]]&lt;br /&gt;
But you may also need formatters such as &lt;br /&gt;
*[[READERNAME_LogFormatter.java]] (not required)&lt;br /&gt;
that handles how incoming and outgoing messages should look in the log file.&lt;br /&gt;
Another useful formatter that may be necessary is&lt;br /&gt;
*[[READERNAME_StreamReaderFormatter.java]] (not required)&lt;br /&gt;
that controls how bytes are read off of and written to the TCPSocket.&lt;br /&gt;
&lt;br /&gt;
==org.rifidi.emulator.reader.READERNAME.protocol==&lt;br /&gt;
The protocol package contains one file whose purpose is twofold.  The protocol needs to:&lt;br /&gt;
#strip any extra protocol-- such as HTTP that the reader uses to communicate-- off of incoming messages and apply these protocols back to outgoing messages.&lt;br /&gt;
#Sometimes two or more commands can be read off of the TCP socket at the same time if the messages are sent quickly.  Therefore the protocol needs to make sure that each command is placed on the incoming buffer individually.&lt;br /&gt;
*[[READERNAME_Protocol.java]]&lt;br /&gt;
&lt;br /&gt;
==org.rifidi.emualtor.reader.READERNAME.module==&lt;br /&gt;
The module is the heart of the reader.  It contains all the essential classes to get the reader up and running.&lt;br /&gt;
*[[reader.xml]] is a file that has the mappings between command names and handler methods&lt;br /&gt;
*[[emulator.xml]] is a file that contains with some basic configuration information&lt;br /&gt;
*[[REDERNAME_Module.java]] has the constructor for the reader&lt;br /&gt;
*[[READERNAME_ReaderSharedResources.java]] - The shared resources for this reader.  It allows various pieces of the reader to be accessed in different parts.&lt;br /&gt;
*[[READERNAME_ReaderModuleOnPowerState.java]] - contains the transition functions for how to go from on-&amp;gt;off and on-&amp;gt;suspend&lt;br /&gt;
*[[READERNAME_ReaderModuleOffPowerState.java]] - contains the transition functions for how to go from off-&amp;gt;on&lt;br /&gt;
*[[READERNAME_ReaderModuleSuspendPowerState.java]] - contains the transition functions for how to go from suspended-&amp;gt;on and suspended-&amp;gt;off&lt;br /&gt;
&lt;br /&gt;
==org.rifidi.emualtor.reader.READERNAME.tagbuffer==&lt;br /&gt;
Because every real reader has a slightly different way that they remember tags, each virtual reader will need a class to handle tag reads.&lt;br /&gt;
* [[READERNAME_TagMemory.java]] is a class that keeps up with tag reads for the reader.&lt;/div&gt;</summary>
		<author><name>Jmaine</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/ThingMagic</id>
		<title>ThingMagic</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/ThingMagic"/>
				<updated>2008-02-14T02:12:34Z</updated>
		
		<summary type="html">&lt;p&gt;Jmaine: /* Getting Tags */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:developerDoc]][[Category:EmulatorDoc]][[Category:userDoc]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
;Model Number: &lt;br /&gt;
 4&lt;br /&gt;
;Network Protocol: &lt;br /&gt;
SQL like protocol that may be wrapped in ssh, web interface, RCP, and Linux shell login.&lt;br /&gt;
;Communication:   &lt;br /&gt;
10/100 BaseT Ethernet – RJ45&lt;br /&gt;
;Antennas:&lt;br /&gt;
4 read points (4 transmit points, 4 receive points)&lt;br /&gt;
;General Purpose I/O:&lt;br /&gt;
(To Do)&lt;br /&gt;
&lt;br /&gt;
==Basis of Virtual Reader==&lt;br /&gt;
The reader accepts SQL style protocol and returns the appropriate information.&lt;br /&gt;
&lt;br /&gt;
===Documentation===&lt;br /&gt;
 &lt;br /&gt;
===Client Tools===&lt;br /&gt;
Telnet, SSH clients, and Tag Centric&lt;br /&gt;
&lt;br /&gt;
==Reader Design==&lt;br /&gt;
This section will give a brief overview of how the hardware reader operates for the purposes of emulation. &lt;br /&gt;
===Communication===&lt;br /&gt;
&lt;br /&gt;
====Protocols====&lt;br /&gt;
The main method for communicating with the reader is via TCP, TCP+SSH on port 8080, web interface, and RCP.&lt;br /&gt;
&lt;br /&gt;
===Memory Model===&lt;br /&gt;
The memory model is like a state based database.&lt;br /&gt;
===Getting Tags===&lt;br /&gt;
Getting tags is fairly simple just execute:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
telnet [reader ip address] 8080&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Then type:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id from tag_id set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Note: the semicolon at the end of each command is necessary.&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
One can also return multiple items:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id, protocol_id from tag_id set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also add filters or conditionals:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id from tag_id where [condition or filter] set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In addition more than one statement can be put on more than one line.&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id from tag_id set time_out=[milliseconds]; select protocol from tag_id set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tag Centric reads tags in the following manner:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id,read_count from tag_id WHERE (protocol_id='EPC0' and protocol_id='EPC1' and protocol_id='GEN2') set time_out=200;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
From this, one can tell if two conditions conjoined with 'AND' use the same column name, it counts as a logical 'OR'.&lt;br /&gt;
====Timer====&lt;br /&gt;
&lt;br /&gt;
====Autonomous Mode====&lt;br /&gt;
&lt;br /&gt;
===Login===&lt;br /&gt;
By SSH log in.&lt;br /&gt;
&lt;br /&gt;
==Supported Features==&lt;br /&gt;
[To do.]&lt;br /&gt;
&lt;br /&gt;
==Unsupported Features &amp;amp; Bugs==&lt;br /&gt;
Linux shell access to reader. This is fairly complex and require to emulate the entire hardware infrastructure of the reader and an ARM possessor. Also the web and RCP interface might be developed at a later time.&lt;/div&gt;</summary>
		<author><name>Jmaine</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/ThingMagic</id>
		<title>ThingMagic</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/ThingMagic"/>
				<updated>2008-02-14T01:53:56Z</updated>
		
		<summary type="html">&lt;p&gt;Jmaine: /* Getting Tags */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:developerDoc]][[Category:EmulatorDoc]][[Category:userDoc]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
;Model Number: &lt;br /&gt;
 4&lt;br /&gt;
;Network Protocol: &lt;br /&gt;
SQL like protocol that may be wrapped in ssh, web interface, RCP, and Linux shell login.&lt;br /&gt;
;Communication:   &lt;br /&gt;
10/100 BaseT Ethernet – RJ45&lt;br /&gt;
;Antennas:&lt;br /&gt;
4 read points (4 transmit points, 4 receive points)&lt;br /&gt;
;General Purpose I/O:&lt;br /&gt;
(To Do)&lt;br /&gt;
&lt;br /&gt;
==Basis of Virtual Reader==&lt;br /&gt;
The reader accepts SQL style protocol and returns the appropriate information.&lt;br /&gt;
&lt;br /&gt;
===Documentation===&lt;br /&gt;
 &lt;br /&gt;
===Client Tools===&lt;br /&gt;
Telnet, SSH clients, and Tag Centric&lt;br /&gt;
&lt;br /&gt;
==Reader Design==&lt;br /&gt;
This section will give a brief overview of how the hardware reader operates for the purposes of emulation. &lt;br /&gt;
===Communication===&lt;br /&gt;
&lt;br /&gt;
====Protocols====&lt;br /&gt;
The main method for communicating with the reader is via TCP, TCP+SSH on port 8080, web interface, and RCP.&lt;br /&gt;
&lt;br /&gt;
===Memory Model===&lt;br /&gt;
The memory model is like a state based database.&lt;br /&gt;
===Getting Tags===&lt;br /&gt;
Getting tags is fairly simple just execute:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
telnet [reader ip address] 8080&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Then type:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id from tag_id set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Note: the semicolon at the end of each command is necessary.&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
One can also return multiple items:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id, protocol_id from tag_id set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also add filters or conditionals:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id from tag_id where [condition or filter] set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In addition more than one statement can be put on more than one line.&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id from tag_id set time_out=[milliseconds]; select protocol from tag_id set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tag Centric reads tags in the following manner:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id,read_count from tag_id WHERE (protocol_id='EPC0' and protocol_id='EPC1' and protocol_id='GEN2') set time_out=200;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
From this, one can tell if two conditions conjoined with 'AND' use the same column name it counts as a logical 'OR'.&lt;br /&gt;
====Timer====&lt;br /&gt;
&lt;br /&gt;
====Autonomous Mode====&lt;br /&gt;
&lt;br /&gt;
===Login===&lt;br /&gt;
By SSH log in.&lt;br /&gt;
&lt;br /&gt;
==Supported Features==&lt;br /&gt;
[To do.]&lt;br /&gt;
&lt;br /&gt;
==Unsupported Features &amp;amp; Bugs==&lt;br /&gt;
Linux shell access to reader. This is fairly complex and require to emulate the entire hardware infrastructure of the reader and an ARM possessor. Also the web and RCP interface might be developed at a later time.&lt;/div&gt;</summary>
		<author><name>Jmaine</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/ThingMagic</id>
		<title>ThingMagic</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/ThingMagic"/>
				<updated>2008-02-14T01:37:06Z</updated>
		
		<summary type="html">&lt;p&gt;Jmaine: /* Client Tools */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:developerDoc]][[Category:EmulatorDoc]][[Category:userDoc]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
;Model Number: &lt;br /&gt;
 4&lt;br /&gt;
;Network Protocol: &lt;br /&gt;
SQL like protocol that may be wrapped in ssh, web interface, RCP, and Linux shell login.&lt;br /&gt;
;Communication:   &lt;br /&gt;
10/100 BaseT Ethernet – RJ45&lt;br /&gt;
;Antennas:&lt;br /&gt;
4 read points (4 transmit points, 4 receive points)&lt;br /&gt;
;General Purpose I/O:&lt;br /&gt;
(To Do)&lt;br /&gt;
&lt;br /&gt;
==Basis of Virtual Reader==&lt;br /&gt;
The reader accepts SQL style protocol and returns the appropriate information.&lt;br /&gt;
&lt;br /&gt;
===Documentation===&lt;br /&gt;
 &lt;br /&gt;
===Client Tools===&lt;br /&gt;
Telnet, SSH clients, and Tag Centric&lt;br /&gt;
&lt;br /&gt;
==Reader Design==&lt;br /&gt;
This section will give a brief overview of how the hardware reader operates for the purposes of emulation. &lt;br /&gt;
===Communication===&lt;br /&gt;
&lt;br /&gt;
====Protocols====&lt;br /&gt;
The main method for communicating with the reader is via TCP, TCP+SSH on port 8080, web interface, and RCP.&lt;br /&gt;
&lt;br /&gt;
===Memory Model===&lt;br /&gt;
The memory model is like a state based database.&lt;br /&gt;
===Getting Tags===&lt;br /&gt;
Getting tags is fairly simple just execute:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
telnet [reader ip address] 8080&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Then type:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id from tag_id set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Note: the semicolon at the end of each command is necessary.&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
One can also return multiple items:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id, protocol_id from tag_id set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also add filters or conditionals:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id from tag_id where [condition or filter] set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In addition more than one statement can be put on more than one line.&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id from tag_id set time_out=[milliseconds]; select protocol from tag_id set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Timer====&lt;br /&gt;
&lt;br /&gt;
====Autonomous Mode====&lt;br /&gt;
&lt;br /&gt;
===Login===&lt;br /&gt;
By SSH log in.&lt;br /&gt;
&lt;br /&gt;
==Supported Features==&lt;br /&gt;
[To do.]&lt;br /&gt;
&lt;br /&gt;
==Unsupported Features &amp;amp; Bugs==&lt;br /&gt;
Linux shell access to reader. This is fairly complex and require to emulate the entire hardware infrastructure of the reader and an ARM possessor. Also the web and RCP interface might be developed at a later time.&lt;/div&gt;</summary>
		<author><name>Jmaine</name></author>	</entry>

	</feed>