From 05871e992b8d7777108c1a84fd565ea379afb2bb Mon Sep 17 00:00:00 2001 From: Nikita Kitaev Date: Wed, 4 Feb 2015 21:38:35 -0800 Subject: [PATCH 01/16] Initial tank server app --- tank/tank.lua | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 tank/tank.lua 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 From e2f5a1d83c332230803316a7d4b4a070353e5951 Mon Sep 17 00:00:00 2001 From: "jennifer.dai@berkeley.edu" Date: Mon, 16 Feb 2015 12:50:40 -0800 Subject: [PATCH 02/16] basic lab 3 test broadcast --- app/testing_broadcast.lua | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 app/testing_broadcast.lua diff --git a/app/testing_broadcast.lua b/app/testing_broadcast.lua new file mode 100644 index 0000000..8599fe8 --- /dev/null +++ b/app/testing_broadcast.lua @@ -0,0 +1,9 @@ +require "cord" +sock = storm.net.udpsocket(1525, function(payload, from, port) end) +local svc_manifest = {id="what"} +local msg = storm.mp.pack(svc_manifest) + storm.os.invokePeriodically(5*storm.os.SECOND, function() + storm.net.sendto(sock, msg, "ff02::1", 1525) +end) +cord.enter_loop() + From 9143ea137b34562c819a841dca87d00b91458f6f Mon Sep 17 00:00:00 2001 From: "jennifer.dai@berkeley.edu" Date: Sun, 22 Feb 2015 09:44:44 -0800 Subject: [PATCH 03/16] temp sensor testing --- lib/ourtemp.lua | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 lib/ourtemp.lua 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 From 2f2658e2493953a9549d0aafd97859f5f9a394ad Mon Sep 17 00:00:00 2001 From: Nikita Kitaev Date: Sun, 22 Feb 2015 10:41:02 -0800 Subject: [PATCH 04/16] Basic service code --- service.lua | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 service.lua 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 From 7d9dea5b88d582a404f7c30e17877f97af7b897d Mon Sep 17 00:00:00 2001 From: "jennifer.dai@berkeley.edu" Date: Sun, 22 Feb 2015 11:01:20 -0800 Subject: [PATCH 05/16] relay lib --- lib/relay.lua | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 lib/relay.lua 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 + From 9e861a0ef78a59a3ccc692d62005da8c4cfb46c8 Mon Sep 17 00:00:00 2001 From: nalnaji Date: Sun, 22 Feb 2015 11:22:29 -0800 Subject: [PATCH 06/16] changing testing broad --- app/testing_broadcast.lua | 210 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 210 insertions(+) diff --git a/app/testing_broadcast.lua b/app/testing_broadcast.lua index 8599fe8..6918af5 100644 --- a/app/testing_broadcast.lua +++ b/app/testing_broadcast.lua @@ -3,7 +3,217 @@ sock = storm.net.udpsocket(1525, function(payload, from, port) end) local svc_manifest = {id="what"} local msg = storm.mp.pack(svc_manifest) storm.os.invokePeriodically(5*storm.os.SECOND, function() +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) +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) +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) +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) +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) +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) storm.net.sendto(sock, msg, "ff02::1", 1525) end) +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) cord.enter_loop() From 043030cfa3aa9b3a83dc2f8a5c8f4ea948cac372 Mon Sep 17 00:00:00 2001 From: "jennifer.dai@berkeley.edu" Date: Sun, 22 Feb 2015 11:58:41 -0800 Subject: [PATCH 07/16] testing_broadcast update --- app/testing_broadcast.lua | 193 ++------------------------------------ 1 file changed, 8 insertions(+), 185 deletions(-) diff --git a/app/testing_broadcast.lua b/app/testing_broadcast.lua index 6918af5..5c21823 100644 --- a/app/testing_broadcast.lua +++ b/app/testing_broadcast.lua @@ -1,8 +1,6 @@ require "cord" -sock = storm.net.udpsocket(1525, function(payload, from, port) end) +-- sock = storm.net.udpsocket(1525, function(payload, from, port) end) local svc_manifest = {id="what"} -local msg = storm.mp.pack(svc_manifest) - storm.os.invokePeriodically(5*storm.os.SECOND, function() function pt(x) for k,v in pairs(x) do print("", "", k,v) end end function print_msg(msg) @@ -33,187 +31,12 @@ a_socket = storm.net.udpsocket(1525, local msg = storm.mp.unpack(payload) msg = print_msg(msg) end) -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) -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) -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) -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) -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) - storm.net.sendto(sock, msg, "ff02::1", 1525) -end) -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 msg = storm.mp.pack(svc_manifest) + storm.os.invokePeriodically(5*storm.os.SECOND, function() + storm.net.sendto(a_socket, msg, "ff02::1", 1525) + print("PLEASE") + end) +sh = require "stormsh" +sh.start() cord.enter_loop() From f7e7f2399a993db764a44904e0c6dbdbce53a520 Mon Sep 17 00:00:00 2001 From: "jennifer.dai@berkeley.edu" Date: Sun, 22 Feb 2015 12:19:20 -0800 Subject: [PATCH 08/16] added toggling temp --- app/testing_broadcast.lua | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/app/testing_broadcast.lua b/app/testing_broadcast.lua index 5c21823..901ff5b 100644 --- a/app/testing_broadcast.lua +++ b/app/testing_broadcast.lua @@ -32,10 +32,28 @@ a_socket = storm.net.udpsocket(1525, 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) - print("PLEASE") - end) +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() From 475d3d7519f512803bf72e7edb4d63d487f4d72a Mon Sep 17 00:00:00 2001 From: "jennifer.dai@berkeley.edu" Date: Sun, 22 Feb 2015 14:18:21 -0800 Subject: [PATCH 09/16] our temp.lua file --- lib/temp.lua | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 lib/temp.lua 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 From a8ac87a4fc324173feeaee46fbe9e66fde516f7e Mon Sep 17 00:00:00 2001 From: nalnaji Date: Sun, 22 Feb 2015 15:40:58 -0800 Subject: [PATCH 10/16] services --- app/service.lua | 110 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 app/service.lua 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 From 0696cc78a7f65fc3ae358592aae73a82f7f2f4c5 Mon Sep 17 00:00:00 2001 From: nalnaji Date: Sun, 22 Feb 2015 15:41:45 -0800 Subject: [PATCH 11/16] TOASTEEERRRRRR --- lib/toaster.lua | 58 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 lib/toaster.lua 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 + From e34c21ddb181e872ff09563c8cd337196cc32f71 Mon Sep 17 00:00:00 2001 From: Nikita Kitaev Date: Sun, 22 Feb 2015 15:46:12 -0800 Subject: [PATCH 12/16] Initial ADC library and sample app --- toaster/adc-sample.lua | 33 +++++++++++++ toaster/adc.lua | 47 +++++++++++++++++++ toaster/i2creg.lua | 71 ++++++++++++++++++++++++++++ toaster/temp.lua | 102 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 253 insertions(+) create mode 100644 toaster/adc-sample.lua create mode 100644 toaster/adc.lua create mode 100644 toaster/i2creg.lua create mode 100644 toaster/temp.lua 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 From 687e2f5def1d6258a4e4ceef79be2dfde6b2debf Mon Sep 17 00:00:00 2001 From: "jennifer.dai@berkeley.edu" Date: Thu, 26 Feb 2015 16:08:02 -0800 Subject: [PATCH 13/16] wait what happened to my old one --- natlib/svcd.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 53 insertions(+), 2 deletions(-) diff --git a/natlib/svcd.c b/natlib/svcd.c index b188a5c..bc69efc 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,49 @@ 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 ) +{ + printf("%s\n", "hello"); + // Checks to make sure it is passed 3 parameters + if (lua_gettop(L) != 3) return luaL_error(L, "Expected (pay, srcip, srcport)"); + + // Get first parameter + // char pay[8]; + // copy the first parameter to pay variable + // lua_checkstring(L, 1); // checks to make sure pay is a string + size_t parlen = lua_objlen(L, -1); + 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); + lua_pushnumber(L, ivkid); + lua_gettable(L, 6); + + size_t size = lua_objlen(L, 6); + const char* item = lua_tolstring(L, 6, &size); + // const char* subs = lua_tolstring(L, 5, &size); // gets the entire array oursubs as a string + if (!lua_isnil(L, 6)) {// && subs[ivkid] == nil like don't i need to check whether the particular elemnt ins null? do i do && string is longer than ivkid + char newstr[3]; + strncpy(newstr, pay, 3); + lua_pushstring(L, item); + lua_pushstring(L, newstr); // pay + lua_call(L, 1, 0); + // item(newstr); + } + // PUSH copied result IT BACK ON STACK?? + // what does the construct [] () even mean i cant find it online +//if SVCD.oursubs[ivkid] ~= nil then + // SVCD.oursubs[ivkid](string.sub(pay,3)) + + #if 0 + #endif return 0; } From 4a79d9a723a3285d09ff267bff28b9bf695a8e7e Mon Sep 17 00:00:00 2001 From: "jennifer.dai@berkeley.edu" Date: Thu, 26 Feb 2015 16:24:52 -0800 Subject: [PATCH 14/16] get rid of comments --- natlib/svcd.c | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/natlib/svcd.c b/natlib/svcd.c index bc69efc..dcee0d5 100644 --- a/natlib/svcd.c +++ b/natlib/svcd.c @@ -203,10 +203,6 @@ 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)"); - // Get first parameter - // char pay[8]; - // copy the first parameter to pay variable - // lua_checkstring(L, 1); // checks to make sure pay is a string size_t parlen = lua_objlen(L, -1); const char* pay = lua_tolstring(L, -1, &parlen); uint16_t ivkid = lua_tonumber(L, -1); // changes pay parameter to number and returns @@ -218,8 +214,7 @@ static int svcd_ndispatch( lua_State *L ) size_t size = lua_objlen(L, 6); const char* item = lua_tolstring(L, 6, &size); - // const char* subs = lua_tolstring(L, 5, &size); // gets the entire array oursubs as a string - if (!lua_isnil(L, 6)) {// && subs[ivkid] == nil like don't i need to check whether the particular elemnt ins null? do i do && string is longer than ivkid + if (!lua_isnil(L, 6)) { char newstr[3]; strncpy(newstr, pay, 3); lua_pushstring(L, item); @@ -227,12 +222,5 @@ static int svcd_ndispatch( lua_State *L ) lua_call(L, 1, 0); // item(newstr); } - // PUSH copied result IT BACK ON STACK?? - // what does the construct [] () even mean i cant find it online -//if SVCD.oursubs[ivkid] ~= nil then - // SVCD.oursubs[ivkid](string.sub(pay,3)) - - #if 0 - #endif return 0; } From d3da97f9e82335e44be1c719c81c2e519265dd0b Mon Sep 17 00:00:00 2001 From: "jennifer.dai@berkeley.edu" Date: Thu, 26 Feb 2015 20:20:51 -0800 Subject: [PATCH 15/16] now it actually works --- natlib/svcd.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/natlib/svcd.c b/natlib/svcd.c index dcee0d5..4e5c177 100644 --- a/natlib/svcd.c +++ b/natlib/svcd.c @@ -199,7 +199,6 @@ static int svcd_init( lua_State *L ) static int svcd_ndispatch( lua_State *L ) { - printf("%s\n", "hello"); // Checks to make sure it is passed 3 parameters if (lua_gettop(L) != 3) return luaL_error(L, "Expected (pay, srcip, srcport)"); @@ -209,7 +208,9 @@ static int svcd_ndispatch( lua_State *L ) lua_getglobal(L, "SVCD"); // gets table lua_pushstring(L, "oursubs"); // use oursubs as the key lua_gettable(L, 5); - lua_pushnumber(L, ivkid); + char ivkidstr[16]; + sprintf(ivkidstr, "%d", ivkid); + lua_pushstring(L, ivkidstr); lua_gettable(L, 6); size_t size = lua_objlen(L, 6); From 3923b043ace8a762fd79bb390285b7be2cb7e84b Mon Sep 17 00:00:00 2001 From: Jennifer Dai Date: Sat, 28 Feb 2015 20:27:53 -0800 Subject: [PATCH 16/16] Update svcd.c --- natlib/svcd.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/natlib/svcd.c b/natlib/svcd.c index 4e5c177..f66a83b 100644 --- a/natlib/svcd.c +++ b/natlib/svcd.c @@ -202,7 +202,7 @@ 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 = lua_objlen(L, -1); + 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 @@ -213,9 +213,9 @@ static int svcd_ndispatch( lua_State *L ) lua_pushstring(L, ivkidstr); lua_gettable(L, 6); - size_t size = lua_objlen(L, 6); + size_t size; const char* item = lua_tolstring(L, 6, &size); - if (!lua_isnil(L, 6)) { + if (!lua_isnil(L, 7)) { char newstr[3]; strncpy(newstr, pay, 3); lua_pushstring(L, item);