Sanjay Govind 10 месяцев назад
Родитель
Сommit
0b21a49322
2 измененных файлов с 23 добавлено и 13 удалено
  1. 13 9
      virtual_portal.c
  2. 10 4
      virtual_portal.h

+ 13 - 9
virtual_portal.c

@@ -46,16 +46,20 @@ static int32_t pof_thread_worker(void* context) {
             }
             if(flags & EventLed) {
                 start_time = now;
-                duration = virtual_portal->delay;
-                target_r = virtual_portal->r;
-                target_g = virtual_portal->g;
-                target_b = virtual_portal->b;
+                duration = virtual_portal->left.delay;
+                target_r = virtual_portal->left.r;
+                target_g = virtual_portal->left.g;
+                target_b = virtual_portal->left.b;
             }
             if (elapsed < duration) {
-                t_phase = fmin(elapsed / duration, 1);
+                t_phase = fminf((float)elapsed / (float)duration, 1);
                 furi_hal_light_set(LightRed, lerp(last_r, target_r, t_phase));
                 furi_hal_light_set(LightBlue, lerp(last_g, target_g, t_phase));
                 furi_hal_light_set(LightGreen, lerp(last_b, target_b, t_phase));
+            } else {
+                last_r = target_r;
+                last_g = target_g;
+                last_b = target_b;
             }
         }
     }
@@ -331,10 +335,10 @@ int virtual_portal_j(VirtualPortal* virtual_portal, uint8_t* message, uint8_t* r
     case 0:
     case 2:
         // virtaul_portal_set_leds(r, g, b);
-        virtual_portal->r = r;
-        virtual_portal->g = g;
-        virtual_portal->b = b;
-        virtual_portal->delay = delay;
+        virtual_portal->left.r = r;
+        virtual_portal->left.g = g;
+        virtual_portal->left.b = b;
+        virtual_portal->left.delay = delay;
         furi_thread_flags_set(furi_thread_get_id(virtual_portal->thread), EventLed);
         break;
     }

+ 10 - 4
virtual_portal.h

@@ -25,6 +25,13 @@ typedef enum {
                EventTxImmediate | EventLed,
 } PoFEvent;
 
+typedef struct {
+    uint8_t r;
+    uint8_t g;
+    uint8_t b;
+    uint16_t delay;
+} VirtualPortalLed;
+
 typedef struct {
     PoFToken* tokens[POF_TOKEN_LIMIT];
     uint8_t sequence_number;
@@ -33,10 +40,9 @@ typedef struct {
     NotificationApp* notifications;
     PoFType type;
     FuriThread* thread;
-    uint8_t r;
-    uint8_t g;
-    uint8_t b;
-    uint16_t delay;
+    VirtualPortalLed left;
+    VirtualPortalLed right;
+    VirtualPortalLed trap;
 } VirtualPortal;
 
 VirtualPortal* virtual_portal_alloc(NotificationApp* notifications);