2 Handle Proxmark USB Commands 
 
   5 local _commands = require('usb_cmd')
 
   7 local _reverse_lookup,k,v = {}
 
   8         for k, v in pairs(_commands) do
 
  11         _commands.tostring = function(command)
 
  12         if(type(command) == 'number') then
 
  13                 return ("%s (%d)"):format(_reverse_lookup[command]or "ERROR UNDEFINED!", command) 
 
  15         return ("Error, numeric argument expected, got : %s"):format(tostring(command))
 
  20         new = function(self, o)
 
  22                 local o = o or {}   -- create object if user does not provide one
 
  23                 setmetatable(o, self) -- DIY inheritance a'la javascript
 
  26                 o.cmd = o.cmd or _commands.CMD_UNKNOWN
 
  31                 local data = o.data or "0"
 
  33                 if(type(data) == 'string') then
 
  34                         -- We need to check if it is correct length, otherwise pad it
 
  35                         local len = string.len(data)
 
  37                                 --Should be 1024 hex characters to represent 512 bytes of data 
 
  38                                 data = data .. string.rep("0",1024 - len ) 
 
  41                                 -- OOps, a bit too much data here
 
  42                                 print( ( "WARNING: data size too large, was %s chars, will be truncated "):format(len) )
 
  44                                 data = data:sub(1,1024)
 
  47                         print(("WARNING; data was NOT a (hex-) string, but was %s"):format(type(data)))
 
  53         parse = function (packet)
 
  54                 local count,cmd,arg1,arg2,arg3,data = bin.unpack('LLLLH512',packet)
 
  55                 return Command:new{cmd = cmd, arg1 = arg1, arg2 = arg2, arg3 = arg3, data = data}
 
  58 function Command:__tostring()
 
  59         local output = ("%s\r\nargs : (%s, %s, %s)\r\ndata:\r\n%s\r\n"):format(
 
  60                 _commands.tostring(self.cmd),
 
  67 function Command:getBytes()
 
  68         --If a hex-string has been used
 
  69         local data  = self.data
 
  71         local arg1, arg2, arg3 = self.arg1, self.arg2, self.arg3
 
  72         return bin.pack("LLLLH",cmd, arg1, arg2, arg3, data);