PIR-1 HID Complete Example

Top  Previous  Next

 

To actually make the code useful and maintainable that we developed in the hid.open and HidDevice chapters we place it into an organized class. I suggest you do the same with your hid code. That way you can also share them easier with other users on the forum!

 

--[[ 

    PIR-1 Lua HID example 

    Copyright 2014 (c) Promixis, LLC

  

 Usage

 =====

  

 Starting up:

 

 ph = require('examples.pirhid')

 PIR = ph.new()

 

 Sending a CCF code:

 PIR:sendCCF(3, 2, "0000 006E 0000 0022 0156 00A9 0014 0014 0014 0040 0014 0040 0014 0040 0014 0014 0014 0040 0014 0040 0014 0014 0014 0040 0014 0014 0014 0014 0014 0014 0014 0040 0014 0014 0014 0014 0014 0040 0014 0040 0014 0014 0014 0040 0014 0040 0014 0040 0014 0014 0014 0014 0014 0014 0014 0014 0014 0040 0014 0014 0014 0014 0014 0014 0014 0040 0014 0040 0014 0040 0014 05EF")

  

--]]

 

local hid = require('hid')

local bit = require('bit')

local string = require('string')

local math = require('math')

local Base = require('Class')

local table = require('table')

local thread = require('thread')

local print = print

local ipairs = ipairs

local gir = gir

local pcall = pcall

 

 

module (...)

 

Base:subclass( _M)

 

-- Opens the first available PIR-1 

local openFirstPIR1 = function () 

 

    local pir1Devices = hid.enumerate(0x20a0, 0x413f)

    

    for idx, pir1Device in ipairs(pir1Devices) do

    

      if pir1Device.interfaceNumber == -1 or pir1Device.interfaceNumber == 0 then

        local hidDev, err = hid.open(pir1Device.path)

        if hidDev then

            return hidDev

        else

            print(err)

        end

              

     end

    

    end

    

end

 

 

-- The Receive thread, this will exit automatically during a script reset.

local recv = function ( self ) 

 

    while not self.terminated and not gir.girderClosing do

    

        local data, err = self.dev:read(65, 250)

        if not data then            

            print(err)

            return

        end

        

        if string.len(data) > 0 then        

            print(math.binarytohex(data))        

        end

        

    end

 

end

 

 

-- Sends the CCF code to the loaded PIR with bitmask ( 1 = back, 2 = front, 3 = back and front ) and repeat count.

function sendCCF( self, bitmask, repeats, ccf )

 

 if not self.dev then

         return false, "No Device"

 end

 

    local ccfParts = string.split(ccf," ")

    local firstPacket = true

    local data = '';

    for i, v in ipairs(ccfParts) do

              

      if i == 1 then

          data = data .. string.char( repeats ) .. string.char(bitmask)

      end      

 

      local value = math.hextodecimal(v)

      local vl = bit.band(value,0xff)

      local vh = bit.rshift(value,8)

 

      data = data .. string.char(vh) .. string.char(vl)

 

      local lastPacket = i == #ccfParts;

      

      if string.len(data) >= 60 or lastPacket then

      

        local flags = 0;

        if firstPacket then

            flags = bit.bor(flags,1)

        end

        firstPacket = false;

        if lastPacket then

            flags = bit.bor(flags,2)

        end

        

        local reportHeader = '\000\014' .. string.char(flags) .. string.char( string.len(data))

        local packet = reportHeader .. data

 

        if not self.dev:write(packet) then

                 return false, "No Device"

         end

        data = ''

 

      end

    

    end

 

 return true

 

end

 

 

function init ( self )

 Base.init(self)        

 self.terminated = true

 self.dev = openFirstPIR1()

 self.terminated = false

 

 thread.newthread( function()         

         self.threadRunning = true

         pcall(recv, self)

         self.threadRunning = false

 end, {})

 

end

 

function deinit( self )                

 Base.deinit(self)        

 

 self.terminated = true        

 while self.threadRunning do

         -- loop loop loop

 end

 

 if self.dev then

         self.dev:close()

         self.dev = nil

 end        

end