2016-06-18 19:35:22 +02:00
-- Main Module
2016-06-19 00:30:09 +02:00
function startSetupMode ( )
tmr.stop ( 0 )
tmr.stop ( 1 )
-- start the webserver module
mydofile ( " webserver " )
2016-06-19 00:08:21 +02:00
2016-06-18 19:46:23 +02:00
wifi.setmode ( wifi.SOFTAP )
2016-06-19 00:08:21 +02:00
cfg = { }
cfg.ssid = " wordclock "
cfg.pwd = " wordclock "
wifi.ap . config ( cfg )
2016-06-19 17:48:39 +02:00
-- Write the buffer to the LEDs
local color = string.char ( 0 , 128 , 0 )
local white = string.char ( 0 , 0 , 0 )
local ledBuf = white : rep ( 6 ) .. color .. white : rep ( 7 ) .. color : rep ( 3 ) .. white : rep ( 44 ) .. color : rep ( 3 ) .. white : rep ( 50 )
2016-07-03 18:41:32 +02:00
ws2812.write ( ledBuf )
2016-06-19 17:48:39 +02:00
color = nil
white = nil
ledBuf = nil
2016-06-19 00:08:21 +02:00
print ( " Waiting in access point >wordclock< for Clients " )
2016-06-18 19:46:23 +02:00
print ( " Please visit 192.168.4.1 " )
startWebServer ( )
2016-06-19 17:48:39 +02:00
collectgarbage ( )
2016-06-18 19:46:23 +02:00
end
2016-05-04 23:23:49 +02:00
2016-06-19 00:08:21 +02:00
function syncTimeFromInternet ( )
--ptbtime1.ptb.de
sntp.sync ( sntpserverhostname ,
function ( sec , usec , server )
print ( ' sync ' , sec , usec , server )
2016-07-03 18:41:32 +02:00
displayTime ( )
2016-06-19 00:08:21 +02:00
end ,
function ( )
print ( ' failed! ' )
end
)
end
2016-06-19 18:14:28 +02:00
function displayTime ( )
2016-12-30 14:16:19 +01:00
sec , usec = rtctime.get ( )
-- Handle lazy programmer:
if ( timezoneoffset == nil ) then
timezoneoffset = 0
end
2016-06-19 18:14:28 +02:00
time = getTime ( sec , timezoneoffset )
words = display_timestat ( time.hour , time.minute )
2016-12-14 19:36:59 +01:00
2018-01-28 14:11:14 +01:00
local charactersOfTime = display_countcharacters_de ( words )
2018-01-28 14:23:01 +01:00
local wordsOfTime = display_countwords_de ( words )
2017-03-01 18:55:18 +01:00
ledBuf = generateLEDs ( words , color , color1 , color2 , color3 , color4 ,
2017-03-01 19:47:21 +01:00
charactersOfTime )
2016-12-14 20:15:25 +01:00
2018-01-28 14:23:01 +01:00
print ( " Local time : " .. time.year .. " - " .. time.month .. " - " .. time.day .. " " .. time.hour .. " : " .. time.minute .. " : " .. time.second .. " in " .. charactersOfTime .. " chars " .. wordsOfTime .. " words " )
2017-03-01 19:44:23 +01:00
2018-12-23 23:51:56 +01:00
--if lines 4 to 6 are inverted due to hardware-fuckup, unfuck it here
if ( ( inv46 ~= nil ) and ( inv46 == " on " ) ) then
2018-12-24 00:15:52 +01:00
tempstring = ledBuf : sub ( 1 , 99 ) -- first 33 leds
2018-12-23 23:51:56 +01:00
rowend = { 44 , 55 , 66 }
for _ , startled in ipairs ( rowend ) do
for i = 0 , 10 do
2018-12-24 00:15:52 +01:00
tempstring = tempstring .. ledBuf : sub ( ( startled - i ) * 3 - 2 , ( startled - i ) * 3 )
2018-12-23 23:51:56 +01:00
end
end
2018-12-24 00:15:52 +01:00
tempstring = tempstring .. ledBuf : sub ( ( 67 * 3 ) - 2 , ledBuf : len ( ) )
ws2812.write ( tempstring )
tempstring = nil
2018-12-23 23:51:56 +01:00
else
ws2812.write ( ledBuf )
2018-12-24 00:15:52 +01:00
ledBuf = nil
2018-12-23 23:51:56 +01:00
end
2016-06-19 18:14:28 +02:00
-- Used for debugging
if ( clockdebug ~= nil ) then
for key , value in pairs ( words ) do
if ( value > 0 ) then
print ( key , value )
end
end
end
-- cleanup
2018-12-24 00:15:52 +01:00
2016-06-19 18:14:28 +02:00
words = nil
time = nil
collectgarbage ( )
end
2016-06-19 00:30:09 +02:00
function normalOperation ( )
2016-06-19 22:48:44 +02:00
-- use default color, if nothing is defined
if ( color == nil ) then
-- Color is defined as GREEN, RED, BLUE
color = string.char ( 0 , 0 , 250 )
end
2016-06-19 00:30:09 +02:00
connect_counter = 0
-- Wait to be connect to the WiFi access point.
2016-06-19 17:48:39 +02:00
tmr.alarm ( 0 , 1000 , 1 , function ( )
2016-06-19 00:30:09 +02:00
connect_counter = connect_counter + 1
if wifi.sta . status ( ) ~= 5 then
2016-06-19 17:48:39 +02:00
print ( connect_counter .. " /60 Connecting to AP... " )
2016-06-19 00:30:09 +02:00
if ( connect_counter % 2 == 0 ) then
2017-03-01 19:53:55 +01:00
local wlanColor = string.char ( ( connect_counter % 6 ) * 20 , ( connect_counter % 5 ) * 20 , ( connect_counter % 3 ) * 20 )
local space = string.char ( 0 , 0 , 0 )
local buf = space : rep ( 6 ) .. wlanColor .. space : rep ( 4 )
buf = buf .. space : rep ( 3 ) .. wlanColor : rep ( 3 )
ws2812.write ( buf )
2016-06-19 00:30:09 +02:00
else
2016-07-03 18:41:32 +02:00
ws2812.write ( string.char ( 0 , 0 , 0 ) : rep ( 114 ) )
2016-06-19 00:30:09 +02:00
end
else
tmr.stop ( 0 )
print ( ' IP: ' , wifi.sta . getip ( ) )
2016-06-19 17:48:39 +02:00
-- Here the WLAN is found, and something is done
print ( " Solving dependencies " )
local dependModules = { " timecore " , " wordclock " , " displayword " }
for _ , mod in pairs ( dependModules ) do
print ( " Loading " .. mod )
mydofile ( mod )
end
2016-06-19 00:30:09 +02:00
tmr.alarm ( 2 , 500 , 0 , function ( )
syncTimeFromInternet ( )
end )
tmr.alarm ( 3 , 2000 , 0 , function ( )
2016-12-30 14:16:19 +01:00
print ( " Start webserver... " )
2016-06-19 00:30:09 +02:00
mydofile ( " webserver " )
startWebServer ( )
end )
2016-06-19 18:14:28 +02:00
displayTime ( )
2016-06-19 17:48:39 +02:00
-- Start the time Thread
tmr.alarm ( 1 , 20000 , 1 , function ( )
2016-06-19 18:14:28 +02:00
displayTime ( )
2019-04-19 23:54:32 +02:00
collectgarbage ( )
2016-06-19 17:48:39 +02:00
end )
2016-06-19 00:30:09 +02:00
end
-- when no wifi available, open an accesspoint and ask the user
2016-06-19 17:48:39 +02:00
if ( connect_counter >= 60 ) then -- 300 is 30 sec in 100ms cycle
startSetupMode ( )
2016-06-19 00:30:09 +02:00
end
2016-06-18 19:46:23 +02:00
end )
2016-06-19 00:08:21 +02:00
2016-06-19 00:30:09 +02:00
end
2016-05-04 23:23:49 +02:00
2016-07-03 18:41:32 +02:00
-------------------main program -----------------------------
ws2812.init ( ) -- WS2812 LEDs initialized on GPIO2
2016-05-04 23:23:49 +02:00
2016-06-19 00:08:21 +02:00
if ( file.open ( " config.lua " ) ) then
2016-06-19 00:30:09 +02:00
--- Normal operation
2016-06-19 00:08:21 +02:00
wifi.setmode ( wifi.STATION )
dofile ( " config.lua " )
2016-06-19 00:30:09 +02:00
normalOperation ( )
2016-06-19 00:08:21 +02:00
else
2016-06-19 00:30:09 +02:00
-- Logic for inital setup
2016-06-19 00:08:21 +02:00
startSetupMode ( )
2016-06-19 17:04:30 +02:00
end
2019-04-19 22:05:00 +02:00
----------- button ---------
gpio.mode ( 3 , gpio.INPUT )
btnCounter = 0
-- Start the time Thread
tmr.alarm ( 4 , 500 , 1 , function ( )
if ( gpio.read ( 3 ) == 0 ) then
tmr.stop ( 1 ) -- stop the LED thread
print ( " Button pressed " .. tostring ( btnCounter ) )
btnCounter = btnCounter + 5
local ledBuf = string.char ( 128 , 0 , 0 ) : rep ( btnCounter ) .. string.char ( 0 , 0 , 0 ) : rep ( 110 - btnCounter )
ws2812.write ( ledBuf )
if ( btnCounter >= 110 ) then
file.remove ( " config.lua " )
node.restart ( )
end
end
end )