diff --git a/app/service.lua b/app/service.lua new file mode 100644 index 0000000..6d5bca3 --- /dev/null +++ b/app/service.lua @@ -0,0 +1,110 @@ +require "cord" -- scheduler / fiber library +Toaster = require "toaster" + +toaster = Toaster:new("D6") +toaster:init() +ipaddr = storm.os.getipaddr() +ipaddrs = string.format("%02x%02x:%02x%02x:%02x%02x:%02x%02x::%02x%02x:%02x%02x:%02x%02x:%02x%02x", + ipaddr[0], + ipaddr[1],ipaddr[2],ipaddr[3],ipaddr[4], + ipaddr[5],ipaddr[6],ipaddr[7],ipaddr[8], + ipaddr[9],ipaddr[10],ipaddr[11],ipaddr[12], + ipaddr[13],ipaddr[14],ipaddr[15]) + +print("ip addr", ipaddrs) +print("node id", storm.os.nodeid()) + +service_announce = 1525 +service_invoke = 1526 + +function pt(x) for k,v in pairs(x) do print("", "", k,v) end end + +function print_msg(msg) + if (type(msg) ~= "table") then + print("Malformed service [type=%s]", type(msg)) + return {} + end + + for k,v in pairs(msg) do + if (k ~= "id") then + if type(v) ~= "table" then + print("", k, v) + else + print("", k) + pt(v) + end + else + print("", k, v) + end + end + + return msg +end + +a_socket = storm.net.udpsocket(service_announce, + function(payload, from, port) + print (string.format("from %s port %d",from,port)) + local msg = storm.mp.unpack(payload) + msg = print_msg(msg) + end) + +local svc_manifest = { + id="FirestormTroopers", + turnOn={}, + turnOff={}, + setTemperature={t="degrees in celcius"}, + getTemperature={}, +} + +local svc_msg = storm.mp.pack(svc_manifest) +storm.os.invokePeriodically(2*storm.os.SECOND, + function() + print ("SENDING ANNOUNCEMENT") + storm.net.sendto( + a_socket, + svc_msg, + "ff02::1", + service_announce) + end) + +storm.io.set_mode(storm.io.OUTPUT, storm.io.GP0) + + +b_socket = storm.net.udpsocket(service_invoke, + function(payload, from, port) + print (string.format("invoke from %s port %d",from,port)) + local msg = storm.mp.unpack(payload) + if (type(msg) ~= "table") then + print ("Invalid format [type=%s]", type(msg)) + return + end + + cmd = msg[1] + args = msg[2] + print("cmd", cmd) + print("args", args) + if (cmd == nil) then + return + end + + if (args == nil) then + args = {} + elseif (type(args) ~= "table") then + args = {args} + end + + if (cmd == "turnOn") then + toaster:on() + elseif (cmd == "turnOff") then + toaster:off() + elseif (cmd == "setTemperature") then + toaster:setTemp(args) + elseif (cmd == "getTemperature") then + toaster:getTemp(args) + end + end) + +-- enable a shell +sh = require "stormsh" +sh.start() +cord.enter_loop() -- start event/sleep loop diff --git a/app/testing_broadcast.lua b/app/testing_broadcast.lua new file mode 100644 index 0000000..901ff5b --- /dev/null +++ b/app/testing_broadcast.lua @@ -0,0 +1,60 @@ +require "cord" +-- sock = storm.net.udpsocket(1525, function(payload, from, port) end) +local svc_manifest = {id="what"} +function pt(x) for k,v in pairs(x) do print("", "", k,v) end end + +function print_msg(msg) + if (type(msg) ~= "table") then + print("Malformed service [type=%s]", type(msg)) + return {} + end + + for k,v in pairs(msg) do + if (k ~= "id") then + if type(v) ~= "table" then + print("", k, v) + else + print("", k) + pt(v) + end + else + print("", k, v) + end + end + + return msg +end + +a_socket = storm.net.udpsocket(1525, + function(payload, from, port) + print (string.format("from %s port %d",from,port)) + local msg = storm.mp.unpack(payload) + msg = print_msg(msg) + end) +local msg = storm.mp.pack(svc_manifest) +storm.os.invokePeriodically(5*storm.os.SECOND, function() + storm.net.sendto(a_socket, msg, "ff02::1", 1525) + end) + +local svc_invoke_off = { + "setOvenState", + {false}, +} +local svc_invoke_on = { + "setOvenState", + {true}, +} +local onMsg = storm.mp.pack(svc_invoke_on) +local offMsg = storm.mp.pack(svc_invoke_off) +function toggleState(args) + print("i want to turn the oven on") + if args then + storm.net.sendto(a_socket, onMsg, "ff02::1", 1526) + else + storm.net.sendto(a_socket, offMsg, "ff02::1", 1526) + end +end +sh = require "stormsh" +sh.start() +cord.enter_loop() + diff --git a/lib/ourtemp.lua b/lib/ourtemp.lua new file mode 100644 index 0000000..0a8811a --- /dev/null +++ b/lib/ourtemp.lua @@ -0,0 +1,29 @@ +require("storm") -- libraries for interfacing with the board and kernel +require("cord") -- scheduler / fiber library + +---------------------------------------------- +-- TEMP class +-- basic TEMP functions associated with a shield pin +-- assume cord.enter_loop() is active, as per stormsh +---------------------------------------------- +local TEMP = {} + +function TEMP:new(temppin) + assert(temppin and storm.io[temppin], "invalid pin spec") + obj = {pin = temppin} -- initialize the new object + setmetatable(obj, self) -- associate class methods + self.__index = self + storm.io.set_mode(storm.io.INPUT, storm.io[temppin]) + return obj +end + +function TEMP:pin() + return self.pin +end + +function TEMP:readTemp() + temp_constant = 1 --XXX: Figure this out by testing... + return storm.io.get(storm.io[self.pin]) * temp_constant +end + +return TEMP diff --git a/lib/relay.lua b/lib/relay.lua new file mode 100644 index 0000000..d10b66b --- /dev/null +++ b/lib/relay.lua @@ -0,0 +1,33 @@ +require("storm") -- libraries for interfacing with the board and kernel +require("cord") -- scheduler / fiber library + +---------------------------------------------- +-- RELAY class +-- basic RELAY functions associated with a shield pin +-- assume cord.enter_loop() is active, as per stormsh +---------------------------------------------- +local RELAY = {} + +function RELAY:new(relaypin) + assert(relaypin and storm.io[relaypin], "invalid pin spec") + obj = {pin = relaypin} -- initialize the new object + setmetatable(obj, self) -- associate class methods + self.__index = self + storm.io.set_mode(storm.io.OUTPUT, storm.io[relaypin]) + return obj +end + +function RELAY:pin() + return self.pin +end + +function RELAY:on() + storm.io.set(1,storm.io[self.pin]) +end + +function RELAY:off() + storm.io.set(0,storm.io[self.pin]) +end + +return RELAY + diff --git a/lib/temp.lua b/lib/temp.lua new file mode 100644 index 0000000..d3ae663 --- /dev/null +++ b/lib/temp.lua @@ -0,0 +1,27 @@ +require("storm") -- libraries for interfacing with the board and kernel +require("cord") -- scheduler / fiber library +ADC = require ("adc") -- adc library + +---------------------------------------------- +-- TEMP class +-- basic TEMP functions associated with a shield pin +-- assume cord.enter_loop() is active, as per stormsh +---------------------------------------------- +local TEMP = {} + +function TEMP:new() + s = ADC:new() + s:init() + obj = {sensor = s} -- initialize the new object + setmetatable(obj, self) -- associate class methods + self.__index = self + return obj +end + +function TEMP:readTemp() + return self.sensor:get() + -- temp_constant = 1 --XXX: Figure this out by testing... + -- return storm.io.get(storm.io[self.pin]) * temp_constant +end + +return TEMP diff --git a/lib/toaster.lua b/lib/toaster.lua new file mode 100644 index 0000000..36c572e --- /dev/null +++ b/lib/toaster.lua @@ -0,0 +1,58 @@ +require("storm") -- libraries for interfacing with the board and kernel +require("cord") -- scheduler / fiber library +Relay = require("relay") +--Temp = require("temp") +---------------------------------------------- +-- Toaster class +-- basic TOASTER functions associated with a shield pin +-- assume cord.enter_loop() is active, as per stormsh +---------------------------------------------- +local TOASTER = {} + +function TOASTER:new(relaypin) + assert(relaypin and storm.io[relaypin], "invalid pin spec") + r = Relay:new(relaypin) + -- t = Temp:new() + obj = {relay = r, targetTemp = 0, state = false, tempSensor = t} + setmetatable(obj, self) -- associate class methods + self.__index = self + return obj +end +function TOASTER:init() + storm.os.invokePeriodically(5*storm.os.SECOND, function() + if self.state == true then + print("Toaster is on!") + if self:getTemp() > self.targetTemp then + self.relay:off() + print("BUT it's too HOT now") + else + self.relay:on() + print("BUT it's too COLD now") + end + else + self.relay:off() + print("Toaster is off!") + end + end) +end +function TOASTER:on() + self.state = true + self.relay:on() +end + +function TOASTER:off() + self.state = false + self.relay:off() +end + +function TOASTER:getTemp() + return 10 + --return self.tempSensor:getTemp() +end + +function TOASTER:setTemp(target) + self.targetTemp = target +end + +return TOASTER + diff --git a/natlib/svcd.c b/natlib/svcd.c index b188a5c..f66a83b 100644 --- a/natlib/svcd.c +++ b/natlib/svcd.c @@ -4,7 +4,6 @@ #define SVCD_SYMBOLS \ { LSTRKEY( "svcd_init"), LFUNCVAL ( svcd_init ) }, - //If this file is defining only specific functions, or if it //is defining the whole thing #define SVCD_PUREC 0 @@ -15,6 +14,8 @@ // advert_received, which you may want to hook into #define MIN_OPT_LEVEL 2 #include "lrodefs.h" +#include +#include static const LUA_REG_TYPE svcd_meta_map[] = { { LSTRKEY( "__index" ), LROVAL ( svcd_meta_map ) }, @@ -30,6 +31,7 @@ static const LUA_REG_TYPE svcd_meta_map[] = // Maintainer: Michael Andersen ///////////////////////////////////////////////////////////// +static int svcd_ndispatch( lua_State *L ); // The anonymous func in init that allows for dynamic binding of advert_received static int svcd_init_adv_received( lua_State *L ) { @@ -93,8 +95,13 @@ static int svcd_init( lua_State *L ) lua_getglobal(L, "SVCD"); printf("Put table at %d\n", lua_gettop(L)); #endif - //Now begins the part that corresponds with the lua init function + + //Override symbols in the lua table with C implementation + lua_pushstring(L, "ndispatch"); + lua_pushlightfunction(L, svcd_ndispatch); + lua_settable(L, 3); + //Now begins the part that corresponds with the lua init function //SVCD.asock lua_pushstring(L, "asock"); lua_pushlightfunction(L, libstorm_net_udpsocket); @@ -183,5 +190,38 @@ static int svcd_init( lua_State *L ) lua_call(L, 3, 0); } + + return 0; +} + +// Lua: storm.n.ndispatch ( pay, srcip, srcport ) +// Dispatches an incoming notification + +static int svcd_ndispatch( lua_State *L ) +{ + // Checks to make sure it is passed 3 parameters + if (lua_gettop(L) != 3) return luaL_error(L, "Expected (pay, srcip, srcport)"); + + size_t parlen; + const char* pay = lua_tolstring(L, -1, &parlen); + uint16_t ivkid = lua_tonumber(L, -1); // changes pay parameter to number and returns + lua_getglobal(L, "SVCD"); // gets table + lua_pushstring(L, "oursubs"); // use oursubs as the key + lua_gettable(L, 5); + char ivkidstr[16]; + sprintf(ivkidstr, "%d", ivkid); + lua_pushstring(L, ivkidstr); + lua_gettable(L, 6); + + size_t size; + const char* item = lua_tolstring(L, 6, &size); + if (!lua_isnil(L, 7)) { + char newstr[3]; + strncpy(newstr, pay, 3); + lua_pushstring(L, item); + lua_pushstring(L, newstr); // pay + lua_call(L, 1, 0); + // item(newstr); + } return 0; } diff --git a/service.lua b/service.lua new file mode 100644 index 0000000..cab12db --- /dev/null +++ b/service.lua @@ -0,0 +1,105 @@ +require "cord" -- scheduler / fiber library + +ipaddr = storm.os.getipaddr() +ipaddrs = string.format("%02x%02x:%02x%02x:%02x%02x:%02x%02x::%02x%02x:%02x%02x:%02x%02x:%02x%02x", + ipaddr[0], + ipaddr[1],ipaddr[2],ipaddr[3],ipaddr[4], + ipaddr[5],ipaddr[6],ipaddr[7],ipaddr[8], + ipaddr[9],ipaddr[10],ipaddr[11],ipaddr[12], + ipaddr[13],ipaddr[14],ipaddr[15]) + +print("ip addr", ipaddrs) +print("node id", storm.os.nodeid()) + +service_announce = 1525 +service_invoke = 1526 + +function pt(x) for k,v in pairs(x) do print("", "", k,v) end end + +function print_msg(msg) + if (type(msg) ~= "table") then + print("Malformed service [type=%s]", type(msg)) + return {} + end + + for k,v in pairs(msg) do + if (k ~= "id") then + if type(v) ~= "table" then + print("", k, v) + else + print("", k) + pt(v) + end + else + print("", k, v) + end + end + + return msg +end + +a_socket = storm.net.udpsocket(service_announce, + function(payload, from, port) + print (string.format("from %s port %d",from,port)) + local msg = storm.mp.unpack(payload) + msg = print_msg(msg) + end) + +local svc_manifest = { + id="FirestormTroopers", + setLed={s="setBool"}, +} + +local svc_msg = storm.mp.pack(svc_manifest) +storm.os.invokePeriodically(2*storm.os.SECOND, + function() + storm.net.sendto( + a_socket, + svc_msg, + "ff02::1", + service_announce) + end) + +storm.io.set_mode(storm.io.OUTPUT, storm.io.GP0) + +function setLed(args) + if args[1] then + storm.io.set(1, storm.io.GP0) + else + storm.io.set(0, storm.io.GP0) + end +end + + +b_socket = storm.net.udpsocket(service_invoke, + function(payload, from, port) + print (string.format("invoke from %s port %d",from,port)) + local msg = storm.mp.unpack(payload) + if (type(msg) ~= "table") then + print ("Invalid format [type=%s]", type(msg)) + return + end + + cmd = msg[1] + args = msg[2] + print("cmd", cmd) + print("args", args) + if (cmd == nil) then + return + end + + if (args == nil) then + args = {} + elseif (type(args) ~= "table") then + args = {args} + end + + if (cmd == "setLed") then + setLed(args) + end + end) + +-- enable a shell +sh = require "stormsh" +sh.start() +cord.enter_loop() -- start event/sleep loop diff --git a/tank/tank.lua b/tank/tank.lua new file mode 100644 index 0000000..387a072 --- /dev/null +++ b/tank/tank.lua @@ -0,0 +1,75 @@ +--[[ + echo client as server + currently set up so you should start one or another functionality at the + stormshell + +--]] + +require "cord" -- scheduler / fiber library + +ipaddr = storm.os.getipaddr() +ipaddrs = string.format("%02x%02x:%02x%02x:%02x%02x:%02x%02x::%02x%02x:%02x%02x:%02x%02x:%02x%02x", + ipaddr[0], + ipaddr[1],ipaddr[2],ipaddr[3],ipaddr[4], + ipaddr[5],ipaddr[6],ipaddr[7],ipaddr[8], + ipaddr[9],ipaddr[10],ipaddr[11],ipaddr[12], + ipaddr[13],ipaddr[14],ipaddr[15]) + +print("ip addr", ipaddrs) +print("node id", storm.os.nodeid()) + +tank_port = 42069 + +relay = storm.io.D2 +buzzer = storm.io.D3 + +storm.io.set_mode(storm.io.OUTPUT, relay, buzzer) + +-- create echo server as handler +server = function() + ssock = storm.net.udpsocket(tank_port, + function(payload, from, port) + print (string.format("from %s port %d",from,port)) + up = storm.mp.unpack(payload) + print (string.format("action: %s", up.action)) + if up.action == "go" then + go() + storm.net.sendto(ssock, payload, from, port) + elseif up.action == "stop" then + stop() + storm.net.sendto(ssock, payload, from, port) + elseif up.action == "beep" then + beep() + storm.net.sendto(ssock, payload, from, port) + else + local reply = {} + reply.action = "NAK" + local packed = storm.mp.pack(reply) + storm.net.sendto(ssock, packed, from, port) + end + end) +end + +go = function() + storm.io.set(1, relay) +end + +stop = function() + storm.io.set(0, relay) +end + +beep = function() + cord.new(function() + storm.io.set(1, buzzer) + cord.await(storm.os.invokeLater, + 500*storm.os.MILLISECOND) + storm.io.set(0, buzzer) + end) +end + +server() -- every node runs the echo server + +-- enable a shell +sh = require "stormsh" +sh.start() +cord.enter_loop() -- start event/sleep loop diff --git a/toaster/adc-sample.lua b/toaster/adc-sample.lua new file mode 100644 index 0000000..4a3af1b --- /dev/null +++ b/toaster/adc-sample.lua @@ -0,0 +1,33 @@ +adc = require "adc" +a = adc:new() +active = false + +cord.new(function() + print "Initializing..." + rv = a:init() + if (rv ~= 0) then + print "Error initializing" + else + print "Done" + active = true + end + end) + +cord.new(function() + local i = 0 + while(active == false) do + cord.await(storm.os.invokeLater,1*storm.os.SECOND) + end + while(active) do + temperature = a:get() + print(i, "Temp:", temperature) + cord.await(storm.os.invokeLater,1*storm.os.SECOND) + i = i + 1 + end + end) + + +-- enable a shell +sh = require "stormsh" +sh.start() +cord.enter_loop() -- start event/sleep loop diff --git a/toaster/adc.lua b/toaster/adc.lua new file mode 100644 index 0000000..42042be --- /dev/null +++ b/toaster/adc.lua @@ -0,0 +1,47 @@ +REG = require("reg") +require("storm") +require("cord") + +ADDR_ADC121 = 0x55*2 + +REG_ADDR_RESULT = 0x00 +REG_ADDR_ALERT = 0x01 +REG_ADDR_CONFIG = 0x02 +REG_ADDR_LIMITL = 0x03 +REG_ADDR_LIMITH = 0x04 +REG_ADDR_HYST = 0x05 +REG_ADDR_CONVL = 0x06 +REG_ADDR_CONVH = 0x07 + +local adc = {} + +function adc:new() + local obj = {port=storm.i2c.EXT, addr = ADDR_ADC121, + reg=REG:new(storm.i2c.EXT, ADDR_ADC121)} + setmetatable(obj, self) + self.__index = self + return obj +end + + +function adc:init() + rv = self.reg:w(REG_ADDR_CONFIG, 0x20); + print ("return value", rv) + if (rv == storm.i2c.OK) then + return 0 + else + return 1 + end +end + +function adc:get() + local arr, val + arr = self.reg:r16(REG_ADDR_RESULT) + if (arr == nil) then + print("Failed to get ADC") + return 0 + end + val = (arr:get(1) * 256) + (arr:get(2)) + return val +end +return adc diff --git a/toaster/i2creg.lua b/toaster/i2creg.lua new file mode 100644 index 0000000..71927a8 --- /dev/null +++ b/toaster/i2creg.lua @@ -0,0 +1,71 @@ +require "cord" +local REG = {} + +-- Create a new I2C register binding +function REG:new(port, address) + obj = {port=port, address=address} + setmetatable(obj, self) + self.__index = self + return obj +end + +-- Read a given register address +function REG:r(reg) + -- TODO: + -- create array with address + local arr = storm.array.create(1, storm.array.UINT8) + arr:set(1,reg) + -- write address + local rv1 = cord.await(storm.i2c.write, self.port + self.address, storm.i2c.START, arr) + if rv1 == storm.i2c.OK then + local rv2 = cord.await(storm.i2c.read, self.port + self.address, storm.i2c.RSTART + storm.i2c.STOP, arr) + return arr:get(1) + else return nil + end + -- read register with RSTART + -- check all return values +end + +-- Read a given register address +function REG:r16(reg) + -- TODO: + -- create array with address + local arr = storm.array.create(2, storm.array.UINT8) + arr:set(1,reg) + -- write address + local rv1 = cord.await(storm.i2c.write, self.port + self.address, storm.i2c.START, arr) + if rv1 == storm.i2c.OK then + -- read register with RSTART + local rv2 = cord.await(storm.i2c.read, self.port + self.address, storm.i2c.RSTART + storm.i2c.STOP, arr) + -- check all return values + return arr + else return nil + end +end + +function REG:w(reg, value) + -- TODO: + -- create array with address and value + -- write + -- check return value + local arr = storm.array.create(2,storm.array.UINT8) + arr:set(1,reg) + arr:set(2, value) + local rv = cord.await(storm.i2c.write, self.port + self.address, storm.i2c.START + storm.i2c.STOP, arr) + return rv +end + +function REG:w16(reg, value1, value2) + -- TODO: + -- create array with address and value + -- write + -- check return value + local arr = storm.array.create(3,storm.array.UINT8) + arr:set(1,reg) + arr:set(2, value1) + arr:set(3, value2) + local rv = cord.await(storm.i2c.write, self.port + self.address, storm.i2c.START + storm.i2c.STOP, arr) + return rv +end + +return REG diff --git a/toaster/temp.lua b/toaster/temp.lua new file mode 100644 index 0000000..4d2bf96 --- /dev/null +++ b/toaster/temp.lua @@ -0,0 +1,102 @@ +REG = require("reg") +require("storm") +require("cord") +TMP006_CONFIG = 0x02 +TMP006_T_AMBIENT = 0x01 +TMP006_MFG_ID = 0xfe +TMP006_DEVICE_ID = 0xff + +--Config register values. +TMP006_CFG_RESET = 0x80 +TMP006_CFG_MODEON = 0x70 +CFG_1SAMPLE = 0x00 +CFG_2SAMPLE = 0x02 +CFG_4SAMPLE = 0x04 +CFG_8SAMPLE = 0x06 +CFG_16SAMPLE = 0x08 +TMP006_CFG_DRDYEN = 0x01 +TMP006_CFG_DRDY = 0x80 + +local TEMP = {} + +function TEMP:new() + local obj = {port=storm.i2c.INT, addr = 0x80, + reg=REG:new(storm.i2c.INT, 0x80)} + setmetatable(obj, self) + self.__index = self + return obj +end + + +function TEMP:init() + --configure the conversion rate (0x02 0x00 = 2 sample/second, 0x04 0x00 = 1 s/s) + self.reg:w16(TMP006_CONFIG, 0x00 + 0x70 + 0x01, 0x00); +end + +function TEMP:getTemp() + --Read ambient temperature + local addr = storm.array.create(1, storm.array.UINT8) + addr:set(1, TMP006_T_AMBIENT) + local rv = cord.await(storm.i2c.write, self.port + self.addr, storm.i2c.START, addr) + if (rv ~= storm.i2c.OK) then + print ("ERROR ON I2C: ",rv) + end + local dat = storm.array.create(2, storm.array.UINT8) + rv = cord.await(storm.i2c.read, self.port + self.addr, storm.i2c.RSTART + storm.i2c.STOP, dat) + if (rv ~= storm.i2c.OK) then + print ("ERROR ON I2C: ",rv) + end + --Converting temperature into Celsius (each LSB = 1/32 Deg. Celsius) + local temperature = dat:get_as(storm.array.INT16_BE, 0)/(32*4) --Divide by 4, datasheet spec + return temperature +end + +function TEMP:getStatus() + -- Read configuration register + local addr = storm.array.create(1, storm.array.UINT8) + addr:set(1, TMP006_CONFIG) + local rv = cord.await(storm.i2c.write, self.port + self.addr, storm.i2c.START, addr) + if (rv ~= storm.i2c.OK) then + print ("ERROR ON I2C: ",rv) + end + local dat = storm.array.create(2, storm.array.UINT8) + rv = cord.await(storm.i2c.read, self.port + self.addr, storm.i2c.RSTART + storm.i2c.STOP, dat) + if (rv ~= storm.i2c.OK) then + print ("ERROR ON I2C: ",rv) + end + --reading 8th bit of configuration, which indicates if conversion is ready + local config = bit.band((dat:get_as(storm.array.INT16_BE, 0)/128), 0x01) + return config +end + +function TEMP:get_MFG_DEV_ID() + --Read Mfg ID, should be 21577 + addr:set(1, TMP006_MFG_ID) + local rv = cord.await(storm.i2c.write, self.port + self.addr, storm.i2c.START, addr) + if (rv ~= storm.i2c.OK) then + print ("ERROR ON I2C: ",rv) + end + local dat = storm.array.create(2, storm.array.UINT8) + rv = cord.await(storm.i2c.read, self.port + self.addr, storm.i2c.RSTART + storm.i2c.STOP, dat) + if (rv ~= storm.i2c.OK) then + print ("ERROR ON I2C: ",rv) + end + local mfg_id = dat:get_as(storm.array.INT16_BE, 0) + + --Read Device ID, should be 103 + addr:set(1, TMP006_DEVICE_ID) + local rv = cord.await(storm.i2c.write, self.port + self.addr, storm.i2c.START, addr) + if (rv ~= storm.i2c.OK) then + print ("ERROR ON I2C: ",rv) + end + local dat = storm.array.create(2, storm.array.UINT8) + rv = cord.await(storm.i2c.read, self.port + self.addr, storm.i2c.RSTART + storm.i2c.STOP, dat) + if (rv ~= storm.i2c.OK) then + print ("ERROR ON I2C: ",rv) + end + local device_id = dat:get_as(storm.array.INT16_BE, 0) + + return mfg_id, device_id +end + +return TEMP