DarkMorford пре 5 година
родитељ
комит
792b8d93d1
3 измењених фајлова са 46 додато и 31 уклоњено
  1. 1 1
      code/boot.py
  2. 41 29
      code/main.py
  3. 4 1
      code/quadrature.py

+ 1 - 1
code/boot.py

@@ -17,7 +17,7 @@ del ujson
 
 # Define input handler
 import quadrature
-input_handler = quadrature.Encoder(0, 4)
+input_handler = quadrature.Encoder(CONFIG['pins']['encoder_A'], CONFIG['pins']['encoder_B'])
 del quadrature
 
 # Set up LED pins

+ 41 - 29
code/main.py

@@ -1,40 +1,45 @@
-from enum import Enum, auto
+import button
 import machine
+from machine import Pin
 import network
 import urequests as requests
 
-class ButtonState(Enum):
-    IDLE = auto()
-    FWD_1 = auto()
-    FWD_2 = auto()
-    FWD_RDY = auto()
-    REV_1 = auto()
-    REV_2 = auto()
-    REV_RDY = auto()
+BTN_IDLE = 0
+BTN_FWD_1 = 1
+BTN_FWD_2 = 2
+BTN_FWD_RDY = 3
+BTN_REV_1 = 4
+BTN_REV_2 = 5
+BTN_REV_RDY = 6
 
 def check_forward_1(handler):
-    if handler.total_change > 30:
+    if handler.total_change > 100:
         led_red2.on()
         handler.reset()
-        return ButtonState.FWD_2
-    return ButtonState.FWD_1
+        return BTN_FWD_2
+    return BTN_FWD_1
 
 def check_forward_2(handler):
     global button_triggered
-    if handler.total_change > 30 and wifi.isconnected():
+    if handler.total_change > 150 and wifi.isconnected():
         led_green.on()
         button_triggered = False
-        return ButtonState.FWD_RDY
-    return ButtonState.FWD_2
+        print('Button armed')
+        return BTN_FWD_RDY
+    return BTN_FWD_2
 
 def check_forward_trigger(handler):
-    if (button_triggered):
+    if (THE_BUTTON.pressed):
         # Ping overlay server
+        requests.get('http://192.168.0.210:42069/rdp')
         led_red1.off()
         led_red2.off()
         led_green.off()
-        return ButtonState.IDLE
-    return ButtonState.FWD_RDY
+        activity_timeout.deinit()
+        machine.lightsleep(5)
+        THE_BUTTON.reset()
+        return BTN_IDLE
+    return BTN_FWD_RDY
 
 button_triggered = False
 def button_handler(pin):
@@ -43,8 +48,12 @@ def button_handler(pin):
 
 def time_up(timer):
     global current_state, current_pos
-    current_state = ButtonState.IDLE
+    print('Timeout exceeded, resetting')
+    current_state = BTN_IDLE
     current_pos = 0
+    led_red1.off()
+    led_red2.off()
+    led_green.off()
     input_handler.reset()
 
 def dummy_cb(*args, **kwargs):
@@ -52,33 +61,36 @@ def dummy_cb(*args, **kwargs):
 
 def get_state_handler(state):
     handler_map = {
-        ButtonState.FWD_1: check_forward_1,
-        ButtonState.FWD_2: check_forward_2,
-        ButtonState.FWD_RDY: check_forward_trigger
+        BTN_FWD_1: check_forward_1,
+        BTN_FWD_2: check_forward_2,
+        BTN_FWD_RDY: check_forward_trigger
     }
     return handler_map.get(state, dummy_cb)
 
+btn_pin = Pin(CONFIG['pins']['play_dat'], Pin.IN, Pin.PULL_UP)
+THE_BUTTON = button.Button(btn_pin)
+
 activity_timeout = machine.Timer(-1)
 current_pos = input_handler.total_change
-current_state = ButtonState.IDLE
+current_state = BTN_IDLE
 
 while True:
-    while current_state == ButtonState.IDLE:
+    while current_state == BTN_IDLE:
         machine.lightsleep(CONFIG['logic']['sleep_time'] * 1000)
         if input_handler.total_change - current_pos > CONFIG['logic']['wake_threshold']:
-            current_state = ButtonState.FWD_1
+            current_state = BTN_FWD_1
         elif current_pos - input_handler.total_change > CONFIG['logic']['wake_threshold']:
-            current_state = ButtonState.REV_1
+            current_state = BTN_REV_1
 
     wifi = network.WLAN(network.STA_IF)
     wifi.active(True)
-    wifi.connect(config['wifi']['ssid'], config['wifi']['password'])
+    wifi.connect(CONFIG['wifi']['ssid'], CONFIG['wifi']['password'])
     led_red1.on()
     activity_timeout.init(mode=machine.Timer.ONE_SHOT, callback=time_up,
                           period=CONFIG['logic']['active_time'] * 1000)
     input_handler.reset()
-    while current_state != ButtonState.IDLE:
-        machine.lightSleep(100)
+    while current_state != BTN_IDLE:
+        machine.lightsleep(100)
         handler_func = get_state_handler(current_state)
         current_state = handler_func(input_handler)
     wifi.active(False)

+ 4 - 1
code/quadrature.py

@@ -1,3 +1,4 @@
+import machine
 from machine import Pin
 import sys
 
@@ -21,10 +22,11 @@ class Encoder:
         self._total_change = 0
 
     def _irq_cb(self, input_pin):
-        print('IRQ handler called')
+        interrupt_mask = machine.disable_irq()
         current_value = (self.channel_a.value() * 2) + self.channel_b.value()
         if self._previous_value == None:
             self._previous_value = current_value
+            machine.enable_irq(interrupt_mask)
             return
         try:
             change_amount = self._increment_grid[self._previous_value][current_value]
@@ -32,6 +34,7 @@ class Encoder:
         except TypeError:
             print('Detected invalid encoder state! Can the system keep up?', file=sys.stderr)
         self._previous_value = current_value
+        machine.enable_irq(interrupt_mask)
 
     def _configure_channel(self, pin):
         p = pin if isinstance(pin, Pin) else Pin(pin, Pin.IN, pull=Pin.PULL_UP)