|
|
@@ -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;
|