|
@@ -2,8 +2,9 @@
|
|
|
|
|
|
|
|
#include <furi_hal.h>
|
|
#include <furi_hal.h>
|
|
|
#include <stm32wbxx_ll_dma.h>
|
|
#include <stm32wbxx_ll_dma.h>
|
|
|
-#include "string.h"
|
|
|
|
|
|
|
+
|
|
|
#include "audio/wav_player_hal.h"
|
|
#include "audio/wav_player_hal.h"
|
|
|
|
|
+#include "string.h"
|
|
|
|
|
|
|
|
#define TAG "VirtualPortal"
|
|
#define TAG "VirtualPortal"
|
|
|
|
|
|
|
@@ -210,14 +211,12 @@ VirtualPortal* virtual_portal_alloc(NotificationApp* notifications) {
|
|
|
|
|
|
|
|
furi_timer_start(virtual_portal->led_timer, 10);
|
|
furi_timer_start(virtual_portal->led_timer, 10);
|
|
|
|
|
|
|
|
-
|
|
|
|
|
if (furi_hal_speaker_acquire(1000)) {
|
|
if (furi_hal_speaker_acquire(1000)) {
|
|
|
wav_player_speaker_init(8000);
|
|
wav_player_speaker_init(8000);
|
|
|
wav_player_dma_init((uint32_t)virtual_portal->audio_buffer, SAMPLES_COUNT);
|
|
wav_player_dma_init((uint32_t)virtual_portal->audio_buffer, SAMPLES_COUNT);
|
|
|
|
|
|
|
|
furi_hal_interrupt_set_isr(FuriHalInterruptIdDma1Ch1, wav_player_dma_isr, virtual_portal);
|
|
furi_hal_interrupt_set_isr(FuriHalInterruptIdDma1Ch1, wav_player_dma_isr, virtual_portal);
|
|
|
|
|
|
|
|
- wav_player_speaker_start();
|
|
|
|
|
wav_player_dma_start();
|
|
wav_player_dma_start();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -353,8 +352,8 @@ int virtual_portal_reset(VirtualPortal* virtual_portal, uint8_t* message, uint8_
|
|
|
|
|
|
|
|
uint8_t index = 0;
|
|
uint8_t index = 0;
|
|
|
response[index++] = 'R';
|
|
response[index++] = 'R';
|
|
|
- response[index++] = 0x02; // Trap Team Xbox One
|
|
|
|
|
- response[index++] = 0x27; // Trap Team Xbox One
|
|
|
|
|
|
|
+ response[index++] = 0x02; // Trap Team Xbox One
|
|
|
|
|
+ response[index++] = 0x27; // Trap Team Xbox One
|
|
|
|
|
|
|
|
// response[index++] = 0x02; // Swap Force 3DS
|
|
// response[index++] = 0x02; // Swap Force 3DS
|
|
|
// response[index++] = 0x02; // Swap Force 3DS
|
|
// response[index++] = 0x02; // Swap Force 3DS
|
|
@@ -405,12 +404,13 @@ int virtual_portal_m(VirtualPortal* virtual_portal, uint8_t* message, uint8_t* r
|
|
|
// Activate speaker for any non-zero value in the range 01-FF
|
|
// Activate speaker for any non-zero value in the range 01-FF
|
|
|
virtual_portal->speaker = (message[1] != 0);
|
|
virtual_portal->speaker = (message[1] != 0);
|
|
|
if (virtual_portal->speaker) {
|
|
if (virtual_portal->speaker) {
|
|
|
|
|
+ if (!virtual_portal->playing_audio) {
|
|
|
|
|
+ wav_player_speaker_start();
|
|
|
|
|
+ }
|
|
|
virtual_portal->count = 0;
|
|
virtual_portal->count = 0;
|
|
|
virtual_portal->head = virtual_portal->tail = virtual_portal->current_audio_buffer;
|
|
virtual_portal->head = virtual_portal->tail = virtual_portal->current_audio_buffer;
|
|
|
- virtual_portal->playing_audio = false;
|
|
|
|
|
- // wav_player_dma_stop();
|
|
|
|
|
- // wav_player_dma_start();
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ virtual_portal->playing_audio = true;
|
|
|
|
|
+ }
|
|
|
/*
|
|
/*
|
|
|
char display[33] = {0};
|
|
char display[33] = {0};
|
|
|
for(size_t i = 0; i < BLOCK_SIZE; i++) {
|
|
for(size_t i = 0; i < BLOCK_SIZE; i++) {
|
|
@@ -539,7 +539,6 @@ int virtual_portal_write(VirtualPortal* virtual_portal, uint8_t* message, uint8_
|
|
|
|
|
|
|
|
mf_classic_free(data);
|
|
mf_classic_free(data);
|
|
|
|
|
|
|
|
-
|
|
|
|
|
nfc_device_save(nfc_device, furi_string_get_cstr(pof_token->load_path));
|
|
nfc_device_save(nfc_device, furi_string_get_cstr(pof_token->load_path));
|
|
|
|
|
|
|
|
response[0] = 'W';
|
|
response[0] = 'W';
|
|
@@ -588,7 +587,6 @@ void virtual_portal_process_audio_360(
|
|
|
uint8_t* message,
|
|
uint8_t* message,
|
|
|
uint8_t len) {
|
|
uint8_t len) {
|
|
|
for (size_t i = 0; i < len; i++) {
|
|
for (size_t i = 0; i < len; i++) {
|
|
|
-
|
|
|
|
|
int16_t int_16 = (int16_t)g721_decoder(message[i], &virtual_portal->state);
|
|
int16_t int_16 = (int16_t)g721_decoder(message[i], &virtual_portal->state);
|
|
|
|
|
|
|
|
float data = ((float)int_16 / 256.0);
|
|
float data = ((float)int_16 / 256.0);
|
|
@@ -660,14 +658,14 @@ int virtual_portal_process_message(
|
|
|
return virtual_portal_m(virtual_portal, message, response);
|
|
return virtual_portal_m(virtual_portal, message, response);
|
|
|
case 'Q': // Query
|
|
case 'Q': // Query
|
|
|
if (!virtual_portal->active) {
|
|
if (!virtual_portal->active) {
|
|
|
- return 0; // No response if portal is not active
|
|
|
|
|
|
|
+ return 0; // No response if portal is not active
|
|
|
}
|
|
}
|
|
|
return virtual_portal_query(virtual_portal, message, response);
|
|
return virtual_portal_query(virtual_portal, message, response);
|
|
|
case 'R':
|
|
case 'R':
|
|
|
return virtual_portal_reset(virtual_portal, message, response);
|
|
return virtual_portal_reset(virtual_portal, message, response);
|
|
|
case 'S': // Status
|
|
case 'S': // Status
|
|
|
if (!virtual_portal->active) {
|
|
if (!virtual_portal->active) {
|
|
|
- return 0; // No response if portal is not active
|
|
|
|
|
|
|
+ return 0; // No response if portal is not active
|
|
|
}
|
|
}
|
|
|
return virtual_portal_status(virtual_portal, response);
|
|
return virtual_portal_status(virtual_portal, response);
|
|
|
case 'V':
|
|
case 'V':
|
|
@@ -675,7 +673,7 @@ int virtual_portal_process_message(
|
|
|
return 0;
|
|
return 0;
|
|
|
case 'W': // Write
|
|
case 'W': // Write
|
|
|
if (!virtual_portal->active) {
|
|
if (!virtual_portal->active) {
|
|
|
- return 0; // No response if portal is not active
|
|
|
|
|
|
|
+ return 0; // No response if portal is not active
|
|
|
}
|
|
}
|
|
|
return virtual_portal_write(virtual_portal, message, response);
|
|
return virtual_portal_write(virtual_portal, message, response);
|
|
|
case 'Z':
|
|
case 'Z':
|