This commit is contained in:
Willy-JL
2023-05-31 18:49:42 +01:00
parent 92ee646b10
commit 499049dc46
18 changed files with 137 additions and 105 deletions

View File

@@ -5,11 +5,11 @@ App(
entry_point="camera_app",
cdefines=["APP_CAMERA"],
requires=["gui"],
stack_size=8*1024,
stack_size=8 * 1024,
order=1,
fap_icon="icon.png",
fap_icon="icon.png",
fap_category="GPIO",
fap_description="ESP32-CAM live feed and photo capture, use left/right for orientation/mode, up/down for brightness and center for saving a screenshot. [Unplug the USB cable to test with Mayhem]",
fap_author="Z4urce",
fap_weburl="https://github.com/Z4urce/flipper-camera"
fap_description="ESP32-CAM live feed and photo capture, use left/right for orientation/mode, up/down for brightness and center for saving a screenshot. [Unplug the USB cable to test with Mayhem]",
fap_author="Z4urce",
fap_weburl="https://github.com/Z4urce/flipper-camera",
)

View File

@@ -1,6 +1,5 @@
#include "camera.h"
static void camera_view_draw_callback(Canvas* canvas, void* _model) {
UartDumpModel* model = _model;
@@ -20,8 +19,7 @@ static void camera_view_draw_callback(Canvas* canvas, void* _model) {
}
}
if (!model->initialized){
if(!model->initialized) {
/*if(!model->marauderInitialized)
{
// Init marauder into stream mode
@@ -74,22 +72,26 @@ static void save_image(void* context) {
get_timefilename(file_name);
// this functions open a file, using write access and creates new file if not exist.
bool result = storage_file_open(file, furi_string_get_cstr(file_name), FSAM_WRITE, FSOM_OPEN_ALWAYS);
bool result =
storage_file_open(file, furi_string_get_cstr(file_name), FSAM_WRITE, FSOM_OPEN_ALWAYS);
//bool result = storage_file_open(file, EXT_PATH("DCIM/test.bmp"), FSAM_WRITE, FSOM_OPEN_ALWAYS);
furi_string_free(file_name);
if (result){
if(result) {
storage_file_write(file, bitmap_header, BITMAP_HEADER_LENGTH);
with_view_model(app->view, UartDumpModel * model, {
int8_t row_buffer[ROW_BUFFER_LENGTH];
for (size_t i = 64; i > 0; --i) {
for (size_t j = 0; j < ROW_BUFFER_LENGTH; ++j){
row_buffer[j] = model->pixels[((i-1)*ROW_BUFFER_LENGTH) + j];
with_view_model(
app->view,
UartDumpModel * model,
{
int8_t row_buffer[ROW_BUFFER_LENGTH];
for(size_t i = 64; i > 0; --i) {
for(size_t j = 0; j < ROW_BUFFER_LENGTH; ++j) {
row_buffer[j] = model->pixels[((i - 1) * ROW_BUFFER_LENGTH) + j];
}
storage_file_write(file, row_buffer, ROW_BUFFER_LENGTH);
}
storage_file_write(file, row_buffer, ROW_BUFFER_LENGTH);
}
}, false);
},
false);
}
// Closing the "file descriptor"
@@ -102,21 +104,17 @@ static void save_image(void* context) {
}
static bool camera_view_input_callback(InputEvent* event, void* context) {
if (event->type == InputTypePress){
if(event->type == InputTypePress) {
uint8_t data[1];
if (event->key == InputKeyUp){
if(event->key == InputKeyUp) {
data[0] = 'C';
}
else if (event->key == InputKeyDown){
} else if(event->key == InputKeyDown) {
data[0] = 'c';
}
else if (event->key == InputKeyRight){
} else if(event->key == InputKeyRight) {
data[0] = '>';
}
else if (event->key == InputKeyLeft){
} else if(event->key == InputKeyLeft) {
data[0] = '<';
}
else if (event->key == InputKeyOk){
} else if(event->key == InputKeyOk) {
save_image(context);
}
furi_hal_uart_tx(FuriHalUartIdUSART1, data, 1);
@@ -141,36 +139,39 @@ static void camera_on_irq_cb(UartIrqEvent ev, uint8_t data, void* context) {
}
static void process_ringbuffer(UartDumpModel* model, uint8_t byte) {
//// 1. Phase: filling the ringbuffer
if (model->ringbuffer_index == 0 && byte != 'Y'){ // First char has to be 'Y' in the buffer.
if(model->ringbuffer_index == 0 && byte != 'Y') { // First char has to be 'Y' in the buffer.
return;
}
if (model->ringbuffer_index == 1 && byte != ':'){ // Second char has to be ':' in the buffer or reset.
if(model->ringbuffer_index == 1 &&
byte != ':') { // Second char has to be ':' in the buffer or reset.
model->ringbuffer_index = 0;
process_ringbuffer(model, byte);
return;
}
model->row_ringbuffer[model->ringbuffer_index] = byte; // Assign current byte to the ringbuffer;
model->row_ringbuffer[model->ringbuffer_index] =
byte; // Assign current byte to the ringbuffer;
++model->ringbuffer_index; // Increment the ringbuffer index
if (model->ringbuffer_index < RING_BUFFER_LENGTH){ // Let's wait 'till the buffer fills.
if(model->ringbuffer_index < RING_BUFFER_LENGTH) { // Let's wait 'till the buffer fills.
return;
}
//// 2. Phase: flushing the ringbuffer to the framebuffer
model->ringbuffer_index = 0; // Let's reset the ringbuffer
model->initialized = true; // We've successfully established the connection
size_t row_start_index = model->row_ringbuffer[2] * ROW_BUFFER_LENGTH; // Third char will determine the row number
size_t row_start_index =
model->row_ringbuffer[2] * ROW_BUFFER_LENGTH; // Third char will determine the row number
if (row_start_index > LAST_ROW_INDEX){ // Failsafe
if(row_start_index > LAST_ROW_INDEX) { // Failsafe
row_start_index = 0;
}
for (size_t i = 0; i < ROW_BUFFER_LENGTH; ++i) {
model->pixels[row_start_index + i] = model->row_ringbuffer[i+3]; // Writing the remaining 16 bytes into the frame buffer
for(size_t i = 0; i < ROW_BUFFER_LENGTH; ++i) {
model->pixels[row_start_index + i] =
model->row_ringbuffer[i + 3]; // Writing the remaining 16 bytes into the frame buffer
}
}
@@ -195,7 +196,8 @@ static int32_t camera_worker(void* context) {
//furi_hal_uart_tx(FuriHalUartIdUSART1, data, length);
with_view_model(
app->view,
UartDumpModel * model, {
UartDumpModel * model,
{
for(size_t i = 0; i < length; i++) {
process_ringbuffer(model, data[i]);
}
@@ -205,7 +207,8 @@ static int32_t camera_worker(void* context) {
} while(length > 0);
notification_message(app->notification, &sequence_notification);
with_view_model(app->view, UartDumpModel * model, { UNUSED(model); }, true);
with_view_model(
app->view, UartDumpModel * model, { UNUSED(model); }, true);
}
}
@@ -260,8 +263,7 @@ static UartEchoApp* camera_app_alloc() {
furi_delay_ms(200);
furi_hal_power_enable_external_3_3v();
furi_hal_power_enable_otg();
for(int i=0;i<2;i++)
{
for(int i = 0; i < 2; i++) {
furi_delay_ms(500);
furi_hal_uart_tx(FuriHalUartIdUSART1, (uint8_t[1]){'c'}, 1);
}

View File

@@ -26,7 +26,8 @@
#define FRAME_WIDTH 128
#define FRAME_HEIGTH 64
#define FRAME_BIT_DEPTH 1
#define FRAME_BUFFER_LENGTH (FRAME_WIDTH * FRAME_HEIGTH * FRAME_BIT_DEPTH / 8) // 128*64*1 / 8 = 1024
#define FRAME_BUFFER_LENGTH \
(FRAME_WIDTH * FRAME_HEIGTH * FRAME_BIT_DEPTH / 8) // 128*64*1 / 8 = 1024
#define ROW_BUFFER_LENGTH (FRAME_WIDTH / 8) // 128/8 = 16
#define LAST_ROW_INDEX (FRAME_BUFFER_LENGTH - ROW_BUFFER_LENGTH) // 1024 - 16 = 1008
#define RING_BUFFER_LENGTH (ROW_BUFFER_LENGTH + 3) // ROW_BUFFER_LENGTH + Header => 16 + 3 = 19
@@ -34,17 +35,35 @@
#define IMAGE_FILE_DIRECTORY_PATH EXT_PATH("DCIM")
static const unsigned char bitmap_header[BITMAP_HEADER_LENGTH] = {
0x42, 0x4D, 0x3E, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00,
0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x40, 0x00,
0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF,
0xFF, 0x00
};
0x42, 0x4D, 0x3E, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x28, 0x00,
0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00};
const uint8_t _I_DolphinCommon_56x48_0[] = {0x01,0x00,0xdf,0x00,0x00,0x1f,0xfe,0x0e,0x05,0x3f,0x04,0x06,0x78,0x06,0x30,0x20,0xf8,0x00,0xc6,0x12,0x1c,0x04,0x0c,0x0a,0x38,0x08,0x08,0x0c,0x60,0xc0,0x21,0xe0,0x04,0x0a,0x18,0x02,0x1b,0x00,0x18,0xa3,0x00,0x21,0x90,0x01,0x8a,0x20,0x02,0x19,0x80,0x18,0x80,0x64,0x09,0x20,0x89,0x81,0x8c,0x3e,0x41,0xe2,0x80,0x50,0x00,0x43,0x08,0x01,0x0c,0xfc,0x68,0x40,0x61,0xc0,0x50,0x30,0x00,0x63,0xa0,0x7f,0x80,0xc4,0x41,0x19,0x07,0xff,0x02,0x06,0x18,0x24,0x03,0x41,0xf3,0x2b,0x10,0x19,0x38,0x10,0x30,0x31,0x7f,0xe0,0x34,0x08,0x30,0x19,0x60,0x80,0x65,0x86,0x0a,0x4c,0x0c,0x30,0x81,0xb9,0x41,0xa0,0x54,0x08,0xc7,0xe2,0x06,0x8a,0x18,0x25,0x02,0x21,0x0f,0x19,0x88,0xd8,0x6e,0x1b,0x01,0xd1,0x1b,0x86,0x39,0x66,0x3a,0xa4,0x1a,0x50,0x06,0x48,0x18,0x18,0xd0,0x03,0x01,0x41,0x98,0xcc,0x60,0x39,0x01,0x49,0x2d,0x06,0x03,0x50,0xf8,0x40,0x3e,0x02,0xc1,0x82,0x86,0xc7,0xfe,0x0f,0x28,0x2c,0x91,0xd2,0x90,0x9a,0x18,0x19,0x3e,0x6d,0x73,0x12,0x16,0x00,0x32,0x49,0x72,0xc0,0x7e,0x5d,0x44,0xba,0x2c,0x08,0xa4,0xc8,0x82,0x06,0x17,0xe0,0x81,0x90,0x2a,0x40,0x61,0xe1,0xa2,0x44,0x0c,0x76,0x2b,0xe8,0x89,0x26,0x43,0x83,0x31,0x8c,0x78,0x0c,0xb0,0x48,0x10,0x1a,0xe0,0x00,0x63,};
const uint8_t _I_DolphinCommon_56x48_0[] = {
0x01, 0x00, 0xdf, 0x00, 0x00, 0x1f, 0xfe, 0x0e, 0x05, 0x3f, 0x04, 0x06, 0x78, 0x06, 0x30, 0x20,
0xf8, 0x00, 0xc6, 0x12, 0x1c, 0x04, 0x0c, 0x0a, 0x38, 0x08, 0x08, 0x0c, 0x60, 0xc0, 0x21, 0xe0,
0x04, 0x0a, 0x18, 0x02, 0x1b, 0x00, 0x18, 0xa3, 0x00, 0x21, 0x90, 0x01, 0x8a, 0x20, 0x02, 0x19,
0x80, 0x18, 0x80, 0x64, 0x09, 0x20, 0x89, 0x81, 0x8c, 0x3e, 0x41, 0xe2, 0x80, 0x50, 0x00, 0x43,
0x08, 0x01, 0x0c, 0xfc, 0x68, 0x40, 0x61, 0xc0, 0x50, 0x30, 0x00, 0x63, 0xa0, 0x7f, 0x80, 0xc4,
0x41, 0x19, 0x07, 0xff, 0x02, 0x06, 0x18, 0x24, 0x03, 0x41, 0xf3, 0x2b, 0x10, 0x19, 0x38, 0x10,
0x30, 0x31, 0x7f, 0xe0, 0x34, 0x08, 0x30, 0x19, 0x60, 0x80, 0x65, 0x86, 0x0a, 0x4c, 0x0c, 0x30,
0x81, 0xb9, 0x41, 0xa0, 0x54, 0x08, 0xc7, 0xe2, 0x06, 0x8a, 0x18, 0x25, 0x02, 0x21, 0x0f, 0x19,
0x88, 0xd8, 0x6e, 0x1b, 0x01, 0xd1, 0x1b, 0x86, 0x39, 0x66, 0x3a, 0xa4, 0x1a, 0x50, 0x06, 0x48,
0x18, 0x18, 0xd0, 0x03, 0x01, 0x41, 0x98, 0xcc, 0x60, 0x39, 0x01, 0x49, 0x2d, 0x06, 0x03, 0x50,
0xf8, 0x40, 0x3e, 0x02, 0xc1, 0x82, 0x86, 0xc7, 0xfe, 0x0f, 0x28, 0x2c, 0x91, 0xd2, 0x90, 0x9a,
0x18, 0x19, 0x3e, 0x6d, 0x73, 0x12, 0x16, 0x00, 0x32, 0x49, 0x72, 0xc0, 0x7e, 0x5d, 0x44, 0xba,
0x2c, 0x08, 0xa4, 0xc8, 0x82, 0x06, 0x17, 0xe0, 0x81, 0x90, 0x2a, 0x40, 0x61, 0xe1, 0xa2, 0x44,
0x0c, 0x76, 0x2b, 0xe8, 0x89, 0x26, 0x43, 0x83, 0x31, 0x8c, 0x78, 0x0c, 0xb0, 0x48, 0x10, 0x1a,
0xe0, 0x00, 0x63,
};
const uint8_t* const _I_DolphinCommon_56x48[] = {_I_DolphinCommon_56x48_0};
const Icon I_DolphinCommon_56x48 = {.width=56,.height=48,.frame_count=1,.frame_rate=0,.frames=_I_DolphinCommon_56x48};
const Icon I_DolphinCommon_56x48 = {
.width = 56,
.height = 48,
.frame_count = 1,
.frame_rate = 0,
.frames = _I_DolphinCommon_56x48};
typedef struct UartDumpModel UartDumpModel;

View File

@@ -9,5 +9,5 @@ App(
order=2,
fap_icon="wifi_10px.png",
fap_category="GPIO",
fap_description="ESP32-CAM version of Marauder. Includes all functionality from the original plus some options to trigger the camera and flashlight. [Unplug the USB cable to test with Mayhem]"
fap_description="ESP32-CAM version of Marauder. Includes all functionality from the original plus some options to trigger the camera and flashlight. [Unplug the USB cable to test with Mayhem]",
)

View File

@@ -82,7 +82,8 @@ void wifi_marauder_scene_console_output_on_enter(void* context) {
}
// If it is a sniff function, open the pcap file for recording
if(app->ok_to_save_pcaps && strncmp("sniff", app->selected_tx_string, strlen("sniff")) == 0) {
if(app->ok_to_save_pcaps &&
strncmp("sniff", app->selected_tx_string, strlen("sniff")) == 0) {
app->is_writing_pcap = true;
wifi_marauder_create_pcap_file(app);
}

View File

@@ -112,18 +112,23 @@ void wifi_marauder_scene_log_viewer_on_enter(void* context) {
app->open_log_file_page = 0;
app->open_log_file_num_pages = 0;
bool saved_logs_exist = false;
if (!app->has_saved_logs_this_session && furi_string_empty(app->text_box_store)) {
if(!app->has_saved_logs_this_session && furi_string_empty(app->text_box_store)) {
// no commands sent yet this session, find last saved log
if (storage_dir_open(app->log_file, MARAUDER_APP_FOLDER_LOGS)) {
if(storage_dir_open(app->log_file, MARAUDER_APP_FOLDER_LOGS)) {
char name[70];
char lastname[70];
while (storage_dir_read(app->log_file, NULL, name, sizeof(name))) {
while(storage_dir_read(app->log_file, NULL, name, sizeof(name))) {
// keep reading directory until last file is reached
strlcpy(lastname, name, sizeof(lastname));
saved_logs_exist = true;
}
if (saved_logs_exist) {
snprintf(app->log_file_path, sizeof(app->log_file_path), "%s/%s", MARAUDER_APP_FOLDER_LOGS, lastname);
if(saved_logs_exist) {
snprintf(
app->log_file_path,
sizeof(app->log_file_path),
"%s/%s",
MARAUDER_APP_FOLDER_LOGS,
lastname);
}
}
storage_dir_close(app->log_file);

View File

@@ -111,7 +111,7 @@ const WifiMarauderItem items[NUM_MENU_ITEMS] = {
TOGGLE_ARGS,
FOCUS_CONSOLE_END,
NO_TIP},
{"Camera",
{"Camera",
{"photo", "flashlight"},
2,
{"photo", "flashlight"},

View File

@@ -163,8 +163,7 @@ int32_t wifi_marauder_app(void* p) {
furi_delay_ms(200);
furi_hal_power_enable_external_3_3v();
furi_hal_power_enable_otg();
for(int i=0;i<2;i++)
{
for(int i = 0; i < 2; i++) {
furi_delay_ms(500);
furi_hal_uart_tx(FuriHalUartIdUSART1, (uint8_t[1]){'w'}, 1);
}

View File

@@ -36,7 +36,8 @@ void uart_terminal_scene_console_output_on_enter(void* context) {
app->text_box_store_strlen = 0;
// app->show_stopscan_tip in the if is just a hack to get the help displayed since there is no commands in this app
if(app->show_stopscan_tip || 0 == strncmp("help", app->selected_tx_string, strlen("help"))) {
if(app->show_stopscan_tip ||
0 == strncmp("help", app->selected_tx_string, strlen("help"))) {
const char* help_msg =
"Morse Flasher for\nMayhem Fin\n\nBased on UART terminal by\ncool4uma, which is a\nmodified WiFi Marauder\ncompanion by 0xchocolate\n\n";
furi_string_cat_str(app->text_box_store, help_msg);

View File

@@ -27,7 +27,14 @@ const UART_TerminalItem items[NUM_MENU_ITEMS] = {
{"Quick message",
{"SOS", "CQD", "VVV", "Eureka", "E.T ph...", "what h...", "Mayhem", "Flipper"},
8,
{"sos", "cqd", "vvv", "eureka", "e.t. phone home", "what hath god wrought!", "let the mayhem begin", "flipper zero in da housa"},
{"sos",
"cqd",
"vvv",
"eureka",
"e.t. phone home",
"what hath god wrought!",
"let the mayhem begin",
"flipper zero in da housa"},
NO_ARGS,
FOCUS_CONSOLE_END,
NO_TIP},

View File

@@ -58,7 +58,9 @@ UART_TerminalApp* uart_terminal_app_alloc() {
app->text_input = uart_text_input_alloc();
view_dispatcher_add_view(
app->view_dispatcher, UART_TerminalAppViewTextInput, uart_text_input_get_view(app->text_input));
app->view_dispatcher,
UART_TerminalAppViewTextInput,
uart_text_input_get_view(app->text_input));
scene_manager_next_scene(app->scene_manager, UART_TerminalSceneStart);
@@ -95,8 +97,7 @@ int32_t uart_terminal_app(void* p) {
furi_delay_ms(200);
furi_hal_power_enable_external_3_3v();
furi_hal_power_enable_otg();
for(int i=0;i<2;i++)
{
for(int i = 0; i < 2; i++) {
furi_delay_ms(500);
furi_hal_uart_tx(FuriHalUartIdUSART1, (uint8_t[1]){'.'}, 1);
}

View File

@@ -71,7 +71,7 @@ UART_TerminalUart* uart_terminal_uart_init(UART_TerminalApp* app) {
furi_hal_uart_set_irq_cb(UART_CH, uart_terminal_uart_on_irq_cb, uart);*/
uart->app = app;
uart->rx_stream = furi_stream_buffer_alloc(RX_BUF_SIZE, 1);
uart->rx_stream = furi_stream_buffer_alloc(RX_BUF_SIZE, 1);
uart->rx_thread = furi_thread_alloc();
furi_thread_set_name(uart->rx_thread, "UART_TerminalUartRxThread");
furi_thread_set_stack_size(uart->rx_thread, 1024);

View File

@@ -5,11 +5,11 @@ App(
entry_point="uart_echo_app",
cdefines=["APP_QRCODE"],
requires=["gui"],
stack_size=8*1024,
stack_size=8 * 1024,
order=1,
fap_icon="icon.png",
fap_category="GPIO",
fap_description="ESP32-CAM Motion detection. It generates a beep when motion is detected. Can be extended to trigger more stuff in the code. [Unplug the USB cable to test with Mayhem]",
fap_author="eried",
fap_weburl="https://flipper.ried.cl"
fap_icon="icon.png",
fap_category="GPIO",
fap_description="ESP32-CAM Motion detection. It generates a beep when motion is detected. Can be extended to trigger more stuff in the code. [Unplug the USB cable to test with Mayhem]",
fap_author="eried",
fap_weburl="https://flipper.ried.cl",
)

View File

@@ -52,7 +52,7 @@ static void uart_echo_on_irq_cb(UartIrqEvent ev, uint8_t data, void* context) {
static void uart_echo_push_to_list(UartDumpModel* model, void* context, const char data) {
// Alarm sound
if(data == '!'){
if(data == '!') {
UartEchoApp* app = context;
notification_message(app->notification, &sequence_alarm);
}
@@ -185,8 +185,7 @@ static UartEchoApp* uart_echo_app_alloc() {
furi_delay_ms(200);
furi_hal_power_enable_external_3_3v();
furi_hal_power_enable_otg();
for(int i=0;i<2;i++)
{
for(int i = 0; i < 2; i++) {
furi_delay_ms(500);
furi_hal_uart_tx(FuriHalUartIdUSART1, (uint8_t[1]){'m'}, 1);
}

View File

@@ -5,11 +5,11 @@ App(
entry_point="uart_echo_app",
cdefines=["APP_QRCODE"],
requires=["gui"],
stack_size=8*1024,
stack_size=8 * 1024,
order=1,
fap_icon="icon.png",
fap_category="GPIO",
fap_description="ESP32-CAM simple app to start a remote camera. [Unplug the USB cable to test with Mayhem]",
fap_author="eried",
fap_weburl="https://flipper.ried.cl"
fap_icon="icon.png",
fap_category="GPIO",
fap_description="ESP32-CAM simple app to start a remote camera. [Unplug the USB cable to test with Mayhem]",
fap_author="eried",
fap_weburl="https://flipper.ried.cl",
)

View File

@@ -179,8 +179,7 @@ static UartEchoApp* uart_echo_app_alloc() {
furi_delay_ms(200);
furi_hal_power_enable_external_3_3v();
furi_hal_power_enable_otg();
for(int i=0;i<2;i++)
{
for(int i = 0; i < 2; i++) {
furi_delay_ms(500);
furi_hal_uart_tx(FuriHalUartIdUSART1, (uint8_t[1]){'n'}, 1);
}

View File

@@ -5,11 +5,11 @@ App(
entry_point="uart_echo_app",
cdefines=["APP_QRCODE"],
requires=["gui"],
stack_size=8*1024,
stack_size=8 * 1024,
order=1,
fap_icon="icon.png",
fap_category="GPIO",
fap_description="ESP32-CAM simple app to show a payload from QR codes. Can be extended to trigger more stuff in the code. [Unplug the USB cable to test with Mayhem]",
fap_author="eried",
fap_weburl="https://flipper.ried.cl"
fap_icon="icon.png",
fap_category="GPIO",
fap_description="ESP32-CAM simple app to show a payload from QR codes. Can be extended to trigger more stuff in the code. [Unplug the USB cable to test with Mayhem]",
fap_author="eried",
fap_weburl="https://flipper.ried.cl",
)

View File

@@ -179,8 +179,7 @@ static UartEchoApp* uart_echo_app_alloc() {
furi_delay_ms(200);
furi_hal_power_enable_external_3_3v();
furi_hal_power_enable_otg();
for(int i=0;i<2;i++)
{
for(int i = 0; i < 2; i++) {
furi_delay_ms(500);
furi_hal_uart_tx(FuriHalUartIdUSART1, (uint8_t[1]){'q'}, 1);
}