| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 |
- local LED_PIN = 1
- local MAX_DUTY = 1023
- local HEART_BEAT_IDX = 1
- local TRIPLE_BLINK_IDX = 1
- local TIMER = TIMERS.led
- local Q = {}
- local debug_message = debug_message
- local pwm = pwm
- local tmr = tmr
- local table = table
- local next = next
- local tostring = tostring
- local print = print
- local pairs = pairs
- module(...)
- local function init()
- debug_message('led.init')
- --handle timer, take exclusive control
- tmr.unregister(TIMER)
- --init pins
- pwm.setup(LED_PIN, 500, 0)
- pwm.start(LED_PIN)
- pwm.stop(LED_PIN)
- end
- -- params must contain duty and interval
- function pattern(params, trans_func)
- local params = params
- debug_message('pattern')
- for k,v in pairs(params) do print(k,v) end
- function callback()
- if params and params.duty ~= nil then
- pwm.setduty(LED_PIN, params.duty)
- tmr.alarm(TIMER, params.interval, tmr.ALARM_SINGLE, callback)
- params = trans_func(params)
- else
- next_pattern()
- end
- end
- return callback
- end
- function enqueue(pattern)
- debug_message('enqueue')
- for k,v in pairs(Q) do print(k,v) end
- table.insert(Q, pattern)
- -- debug_message('tmr.state ' .. tostring(tmr.state(TIMER)))
- -- if not tmr.state(TIMER) then
- -- next_pattern()
- -- end
- end
- function next_pattern()
- debug_message('next_pattern')
- if next(Q) then
- debug_message('has next')
- local next_p = table.remove(Q, 1) -- how expensive is this?
- next_p()
- end
- end
- function kill()
- Q = {}
- tmr.unregister(TIMER)
- pwm.setduty(LED_PIN, 0)
- end
- -- built-in conveniences specific to Yo Button
- function q_fade_in()
- local params = {interval=2, duty=0}
- local transition = function(params)
- if params.duty >= 1023 then
- return nil
- else
- params.duty = params.duty + 1
- return params
- end
- end
- enqueue(pattern(params, transition))
- end
- function q_fade_out()
- local params = {interval=2, duty=MAX_DUTY}
- local transition = function(params)
- if params.duty <= 0 then
- return nil
- else
- params.duty = params.duty - 1
- return params
- end
- end
- enqueue(pattern(params, transition))
- end
- -- local function fade_in()
- -- local current_brightness = pwm.getduty(LED_PIN)
- -- if current_brightness < MAX_DUTY then
- -- current_brightness = current_brightness + 1
- -- pwm.setduty(LED_PIN, current_brightness)
- -- tmr.alarm(TIMER, 2, tmr.ALARM_SINGLE, fade_in)
- -- else
- -- next_pattern()
- -- end
- -- end
- -- local function fade_out()
- -- local current_brightness = pwm.getduty(LED_PIN)
- -- if current_brightness > 0 then
- -- current_brightness = current_brightness - 1
- -- pwm.setduty(LED_PIN, current_brightness)
- -- tmr.alarm(TIMER, 2, tmr.ALARM_SINGLE, fade_out)
- -- else
- -- next_pattern()
- -- end
- -- end
- -- local function heart_beat()
- -- local intervals = {40, 200, 40, 900} --alternating, millisec
- -- local current_brightness = pwm.getduty(LED_PIN)
- -- current_brightness = MAX_DUTY - current_brightness
- -- pwm.setduty(LED_PIN, current_brightness)
- -- tmr.alarm(TIMER, intervals[HEART_BEAT_IDX], tmr.ALARM_SINGLE, heart_beat)
- -- HEART_BEAT_IDX = HEART_BEAT_IDX + 1
- -- if HEART_BEAT_IDX > table.getn(intervals) then
- -- HEART_BEAT_IDX = 1
- -- end
- -- -- must call next_pattern() yourself
- -- end
- -- local function triple_blink()
- -- local intervals = {200, 50, 200, 50, 200, 50, 200} --alternating, millisec
- -- local current_brightness = pwm.getduty(LED_PIN)
- -- current_brightness = MAX_DUTY - current_brightness
- -- pwm.setduty(LED_PIN, current_brightness)
-
- -- TRIPLE_BLINK_IDX = TRIPLE_BLINK_IDX + 1
- -- if TRIPLE_BLINK_IDX > table.getn(intervals) then
- -- TRIPLE_BLINK_IDX = 1
- -- pwm.setduty(LED_PIN, 0)
- -- next_pattern()
- -- else
- -- tmr.alarm(TIMER, intervals[TRIPLE_BLINK_IDX], tmr.ALARM_SINGLE, triple_blink)
- -- end
- -- end
- -- interface --
- -- q_fade_in = enqueue(fade_in)
- -- q_fade_out = enqueue(fade_out)
- -- q_heart_beat = enqueue(heart_beat)
- -- q_triple_blink = enqueue(triple_blink)
- init(TIMER)
|