Eric Betts 11 месяцев назад
Родитель
Сommit
91e201a82d
1 измененных файлов с 41 добавлено и 9 удалено
  1. 41 9
      virtual_portal.c

+ 41 - 9
virtual_portal.c

@@ -40,6 +40,7 @@ uint8_t virtual_portal_next_sequence(VirtualPortal* virtual_portal) {
 }
 
 int virtual_portal_activate(VirtualPortal* virtual_portal, uint8_t* message, uint8_t* response) {
+    FURI_LOG_D(TAG, "process %c", message[0]);
     virtual_portal->active = (message[1] == 1);
 
     response[0] = message[0];
@@ -50,7 +51,7 @@ int virtual_portal_activate(VirtualPortal* virtual_portal, uint8_t* message, uin
 }
 
 int virtual_portal_reset(VirtualPortal* virtual_portal, uint8_t* message, uint8_t* response) {
-    UNUSED(message);
+    FURI_LOG_D(TAG, "process %c", message[0]);
     virtual_portal->active = false;
     virtual_portal->sequence_number = 0;
 
@@ -117,14 +118,14 @@ int virtual_portal_m(VirtualPortal* virtual_portal, uint8_t* message, uint8_t* r
     return index;
 }
 
-int virtual_portal_j(VirtualPortal* virtual_portal, uint8_t* message, uint8_t* response) {
+int virtual_portal_l(VirtualPortal* virtual_portal, uint8_t* message, uint8_t* response) {
     UNUSED(virtual_portal);
 
     char display[33] = {0};
     for(size_t i = 0; i < BLOCK_SIZE; i++) {
         snprintf(display + (i * 2), sizeof(display), "%02x", message[i]);
     }
-    FURI_LOG_I(TAG, "J %s", display);
+    FURI_LOG_I(TAG, "L %s", display);
 
     uint8_t side = message[1]; // 0: left, 2: right
     uint8_t brightness = 0;
@@ -151,6 +152,39 @@ int virtual_portal_j(VirtualPortal* virtual_portal, uint8_t* message, uint8_t* r
     return index;
 }
 
+int virtual_portal_j(VirtualPortal* virtual_portal, uint8_t* message, uint8_t* response) {
+    UNUSED(virtual_portal);
+
+    char display[33] = {0};
+    for(size_t i = 0; i < BLOCK_SIZE; i++) {
+        snprintf(display + (i * 2), sizeof(display), "%02x", message[i]);
+    }
+    FURI_LOG_I(TAG, "J %s", display);
+
+    uint8_t side = message[1]; // 0: left, 2: right
+    uint8_t r = message[2]; // 0: left, 2: right
+    uint8_t g = message[3]; // 0: left, 2: right
+    uint8_t b = message[4]; // 0: left, 2: right
+    uint16_t delay = message[6] << 8 | message[5];
+    switch(side) {
+    case 0:
+    case 2:
+        furi_hal_light_set(LightRed, r);
+        furi_hal_light_set(LightGreen, g);
+        furi_hal_light_set(LightBlue, b);
+        break;
+    }
+
+    // Delay response
+    // furi_delay_ms(delay); // causes issues
+    UNUSED(delay);
+
+    // https://marijnkneppers.dev/posts/reverse-engineering-skylanders-toys-to-life-mechanics/
+    size_t index = 0;
+    response[index++] = 'J';
+    return index;
+}
+
 int virtual_portal_query(VirtualPortal* virtual_portal, uint8_t* message, uint8_t* response) {
     int index = message[1];
     int blockNum = message[2];
@@ -217,30 +251,28 @@ int virtual_portal_process_message(
     memset(response, 0, 32);
     switch(message[0]) {
     case 'A':
-        FURI_LOG_D(TAG, "process %c", message[0]);
         return virtual_portal_activate(virtual_portal, message, response);
     case 'C': //Ring color R G B
+        furi_hal_light_set(LightRed, message[1]);
+        furi_hal_light_set(LightGreen, message[2]);
+        furi_hal_light_set(LightBlue, message[3]);
         return 0;
     case 'J':
         // https://github.com/flyandi/flipper_zero_rgb_led
         return virtual_portal_j(virtual_portal, message, response);
     case 'L':
-        return 0; //No response
+        return virtual_portal_l(virtual_portal, message, response);
     case 'M':
         return virtual_portal_m(virtual_portal, message, response);
     case 'Q': //Query
-        FURI_LOG_D(TAG, "process %c", message[0]);
         return virtual_portal_query(virtual_portal, message, response);
     case 'R':
-        FURI_LOG_D(TAG, "process %c", message[0]);
         return virtual_portal_reset(virtual_portal, message, response);
     case 'S': //Status
-        FURI_LOG_D(TAG, "process %c", message[0]);
         return virtual_portal_status(virtual_portal, response);
     case 'V':
         return 0;
     case 'W': //Write
-        FURI_LOG_D(TAG, "process %c", message[0]);
         return virtual_portal_write(virtual_portal, message, response);
     case 'Z':
         return 0;