فهرست منبع

convert Yo Button patterns to state machine version. These probably don't need nested functions (ambiguous if closures) so should be reworked

etisab 10 سال پیش
والد
کامیت
6a7acd2b6b
1فایلهای تغییر یافته به همراه50 افزوده شده و 100 حذف شده
  1. 50 100
      rebuild/led.lua

+ 50 - 100
rebuild/led.lua

@@ -1,7 +1,5 @@
 local LED_PIN = 1
 local MAX_DUTY = 1023
-local HEART_BEAT_IDX = 1
-local TRIPLE_BLINK_IDX = 1
 local TIMER = TIMERS.led
 local Q = {}
 
@@ -11,15 +9,9 @@ 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
@@ -46,15 +38,6 @@ function pattern(params, trans_func)
   return callback
 end
 
-function enqueue(pattern)
-  debug_message('enqueue')
-  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
@@ -65,36 +48,24 @@ function next_pattern()
   end
 end
 
+function enqueue(pattern)
+  debug_message('enqueue')
+  table.insert(Q, pattern)
+  if not tmr.state(TIMER) then
+    next_pattern()
+  end
+end
+
 function kill()
   Q = {}
   tmr.unregister(TIMER)
   pwm.setduty(LED_PIN, 0)
 end
 
-
-
-
-
-function q_blink()
-  print('q_blink')
-
-  local params = {interval=1000, duty=0}
-  local transition = function(p)
-    if params.duty == 0 then
-      params.duty = MAX_DUTY
-    else
-      params.duty = 0
-    end
-
-    return params
-  end
-
-  enqueue(pattern(params, transition))
-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
@@ -109,6 +80,7 @@ end
 
 function q_fade_out()
   local params = {interval=2, duty=MAX_DUTY}
+
   local transition = function(params)
     if params.duty <= 0 then
       return nil
@@ -121,67 +93,45 @@ function q_fade_out()
   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)
+function q_triple_blink()
+  local params = {interval=50, duty=MAX_DUTY, reps = 3}
+
+  local transition = function(params)
+    if params.reps <= 0 then
+      return nil
+    elseif params.interval == 50 then
+      params.interval = 200
+      params.duty = 0
+      params.reps = params.reps - 1
+    else
+      params.interval = 50
+      params.duty = MAX_DUTY
+    end
+
+    return params
+  end
+
+  enqueue(pattern(params, transition))
+end
+
+function q_heart_beat()
+  local params = {interval=40, duty=MAX_DUTY, index = 1}
+
+  local transition = function(params)
+    local intervals = {40, 200, 40, 900}
+
+    params.index = params.index + 1
+    if params.index > 4 then
+      params.index = 1
+    end
+
+    params.interval = intervals[params.index]
+    params.duty = (params.index % 2) * MAX_DUTY
+
+    return params
+  end
+
+  enqueue(pattern(params, transition))
+end
 
 init(TIMER)