TI-Nspire & BLE / SimpleLink SensorTag をつなぐ

The following script, which is from http://compasstech.com.au/TNS_Authoring/Scripting/script_tut30.html, will try to establish a connection with BLE devices.


.lua

-- Source: http://compasstech.com.au/TNS_Authoring/Scripting/script_tut30.html
platform.apilevel = '2.5'
screen = platform.window
w = screen:width()
h = screen:height()
pcall(function () require 'bleCentral' end)
require "color"
local bleState       = ''
local bleStatus      = 'Stand by'
local peripheralName = ''
local myPeripheral   = nil

function on.resize()
   w = screen:width() or 841
   h = screen:height() or 567
   pcall(function() ble.addStateListener(listenerCallback) end)
   refreshMenu()
   screen:invalidate()
end
function on.paint(gc)
   w = screen:width() or 841
   h = screen:height() or 567
   if bleState:find("ON") then
      gc:setColorRGB(color.blue)
   else
      gc:setColorRGB(color.red)
   end
   --gc:setFont("sansserif", "b", 12)
   gc:setFont("sansserif", "b", w/15)
   gc:drawString(bleState      , 0.1*w, 0.1*h)
   gc:drawString(bleStatus     , 0.1*w, 0.2*h)
   gc:drawString(peripheralName, 0.1*w, 0.3*h)
end

--BLE STATE LISTENER -----------

function listenerCallback(state, scriptError)
   if     state == ble.ON          then bleState = 'BLE ON'
   elseif state == ble.OFF         then bleState = 'BLE OFF'
   elseif state == ble.RESETTING   then bleState = 'BLE RESET'
   elseif state == ble.UNSUPPORTED then bleState = 'UNSUPPORTED'
      if scriptError then print('Error message: BLE not supported') end
   end
   screen:invalidate()
end

-- BLE PERIPHERALS -----------------------

function peripheralOn()
   bleCentral.startScanning(callbackScan)
   bleStatus = 'Scanning' 
   screen:invalidate()
end
function peripheralOff()
   bleCentral.stopScanning()
   if myPeripheral then
      myPeripheral:disconnect()
   end
   bleStatus = 'Stand by' 
   screen:invalidate()
end
function callbackScan(peripheral)
   if peripheral ~= nil then
      peripheralName = peripheral:getName() 
   end
   peripheral:connect(callbackConnect) 
   screen:invalidate()
end
function callbackConnect(peripheral, event)
  if event == bleCentral.CONNECTED then 
      bleCentral.stopScanning()
      bleStatus = 'Connected'
      myPeripheral = peripheral
   elseif event == bleCentral.DISCONNECTED then 
      bleStatus = 'Disconnected'
      peripheralName = ''
   end
   screen:invalidate()
end

--Menu-----------------------------------

function refreshMenu()
   Menu = {
      {"Controls",
         {"Scan and Connect", function() peripheralOn()  end},
         {"Disconnect"      , function() peripheralOff() end},
         {"Reset"           , function() bleState = '' bleStatus = 'Stand by' on.resize() end},
      },
   }
   toolpalette.register(Menu)
end