|
|
@@ -1,9 +1,11 @@
|
|
|
+
|
|
|
+
|
|
|
/**
|
|
|
*
|
|
|
* @author Coolshrimp - CoolshrimpModz.com
|
|
|
*
|
|
|
* @brief FM Radio using the TEA5767 FM radio chip.
|
|
|
- * @version 1.1
|
|
|
+ * @version 0.8
|
|
|
* @date 2023-09-29
|
|
|
*
|
|
|
* @copyright GPLv3
|
|
|
@@ -21,105 +23,71 @@
|
|
|
#include <gui/modules/variable_item_list.h>
|
|
|
#include <notification/notification.h>
|
|
|
#include <notification/notification_messages.h>
|
|
|
-#include <stdbool.h> // for true/false
|
|
|
-#include <stdint.h> // for uint8_t, size_t
|
|
|
-#include <stdio.h> // for snprintf
|
|
|
-#include <math.h> // for fabsf
|
|
|
+#include <string.h>
|
|
|
+#include <stdlib.h>
|
|
|
+
|
|
|
#include "TEA5767/TEA5767.h"
|
|
|
-#include <gui/icon_i.h>
|
|
|
#include "fmradio_controller_icons.h"
|
|
|
|
|
|
-// Define macros for easier management
|
|
|
+// Define a macro for enabling the backlight always on.
|
|
|
#define BACKLIGHT_ALWAYS_ON
|
|
|
-#define TAG "FM_Radio"
|
|
|
|
|
|
-// Declare global variables
|
|
|
+#define TAG "FMRadio"
|
|
|
+
|
|
|
+// Define volume options and names
|
|
|
uint8_t volume_values[] = {0, 1};
|
|
|
char* volume_names[] = {"Un-Muted", "Muted"};
|
|
|
-bool current_volume = 1; // Current volume state
|
|
|
-int* signal_strength; // Signal strength (unused, consider removing or implementing)
|
|
|
+bool current_volume = 0; // Muted or not
|
|
|
+char* current_vol = "Un-Muted"; // Current volume status as text. Changed type to char*
|
|
|
+int* signal_strength;
|
|
|
+int loopcount = 0;
|
|
|
+
|
|
|
uint8_t tea5767_registers[5];
|
|
|
-uint32_t current_station_index = 0; // Default to the first frequency
|
|
|
|
|
|
-// Station struct to hold frequency and station name
|
|
|
-struct Station {
|
|
|
- float frequency;
|
|
|
- char* name;
|
|
|
+// Define values for frequency selection
|
|
|
+float frequency_values[] = {
|
|
|
+ 88.1, 88.9, 89.1, 90.3, 91.5, 91.7, 92.0, 92.5, 94.1, 95.9, 96.3, 96.9,
|
|
|
+ 97.3, 98.1, 98.7, 99.1, 99.9, 100.7, 101.3, 103.9, 104.5, 105.1, 105.5, 106.5,
|
|
|
+ 107.1, 102.7, 105.3
|
|
|
};
|
|
|
|
|
|
-#define NUM_VOLUME_VALUES (sizeof(volume_values) / sizeof(volume_values[0]))
|
|
|
-#define NUM_STATIONS (sizeof(stations) / sizeof(stations[0]))
|
|
|
-
|
|
|
-// Array of Stations
|
|
|
-struct Station stations[] = {
|
|
|
- {88.1, "CIND Indie 88"},
|
|
|
- {88.9, "CIRV Portuguese"},
|
|
|
- {89.5, "CIUT FM"},
|
|
|
- {90.3, "Ici Musique"},
|
|
|
- {91.1, "JAZZ.FM91"},
|
|
|
- {92.5, "KiSS Radio"},
|
|
|
- {93.5, "93.5 Today"},
|
|
|
- {94.1, "CBC Music"},
|
|
|
- {95.9, "KX96"},
|
|
|
- {96.3, "Classical 96.3"},
|
|
|
- {97.3, "Boom 97.3"},
|
|
|
- {98.1, "CHFI"},
|
|
|
- {98.7, "Flow 98.7"},
|
|
|
- {99.1, "CBC Radio 1"},
|
|
|
- {99.9, "99.9 Toronto"},
|
|
|
- {100.7, "CHIN 100.7"},
|
|
|
- {101.3, "CMR Diversity"},
|
|
|
- {101.3, "CMR Hindi Urdu"},
|
|
|
- {101.3, "CMR Punjabi"},
|
|
|
- {101.3, "CMR Tamil"},
|
|
|
- {102.1, "102.1 Edge"},
|
|
|
- {103.5, "Z103.5"},
|
|
|
- {103.9, "Proud FM"},
|
|
|
- {104.5, "CHUM"},
|
|
|
- {105.5, "VIBE1055 FM"},
|
|
|
- {106.5, "106.5 Elmnt"},
|
|
|
- {107.1, "Q107"}
|
|
|
-};
|
|
|
+uint32_t current_frequency_index = 0; // Default to the first frequency
|
|
|
|
|
|
-// Function prototypes for forward declarations
|
|
|
-void elements_button_top_left(Canvas* canvas, const char* str);
|
|
|
-void elements_button_top_right(Canvas* canvas, const char* str);
|
|
|
//lib can only do bottom left/right
|
|
|
void elements_button_top_left(Canvas* canvas, const char* str) {
|
|
|
- const uint8_t button_height = 10; // Define the height of the button
|
|
|
- const uint8_t vertical_offset = 2; // Define the vertical offset of the text
|
|
|
- const uint8_t horizontal_offset = 2; // Define the horizontal offset of the text
|
|
|
- const uint8_t string_width = canvas_string_width(canvas, str);
|
|
|
- const Icon* icon = &I_ButtonUp;
|
|
|
- const uint8_t icon_h_offset = 2;
|
|
|
- const uint8_t icon_width_with_offset = icon->width + icon_h_offset;
|
|
|
- const uint8_t icon_v_offset = icon->height + vertical_offset;
|
|
|
- const uint8_t button_width = string_width + horizontal_offset * 2 + icon_width_with_offset;
|
|
|
+ const uint8_t button_height = 12;
|
|
|
+ const uint8_t vertical_offset = 3;
|
|
|
+ const uint8_t horizontal_offset = 3;
|
|
|
+
|
|
|
+ // You may need to declare or pass 'button_width' here.
|
|
|
+ const uint8_t string_width = canvas_string_width(canvas, str);
|
|
|
+
|
|
|
+ // 'button_width' should be declared or passed here.
|
|
|
+ const uint8_t button_width = string_width + horizontal_offset * 2 + 3;
|
|
|
|
|
|
const uint8_t x = 0;
|
|
|
const uint8_t y = 0 + button_height;
|
|
|
|
|
|
- canvas_draw_box(canvas, x, y - button_height, button_width, button_height); // Draw the button
|
|
|
- canvas_draw_line(canvas, x + button_width + 0, y - button_height, x + button_width + 0, y - 1); // Draw the button border
|
|
|
- canvas_draw_line(canvas, x + button_width + 1, y - button_height, x + button_width + 1, y - 2); // Draw the button border
|
|
|
- canvas_draw_line(canvas, x + button_width + 2, y - button_height, x + button_width + 2, y - 3); // Draw the button border
|
|
|
+ canvas_draw_box(canvas, x, y - button_height, button_width, button_height);
|
|
|
+ canvas_draw_line(canvas, x + button_width + 0, y - button_height, x + button_width + 0, y - 1);
|
|
|
+ canvas_draw_line(canvas, x + button_width + 1, y - button_height, x + button_width + 1, y - 2);
|
|
|
+ canvas_draw_line(canvas, x + button_width + 2, y - button_height, x + button_width + 2, y - 3);
|
|
|
|
|
|
- canvas_invert_color(canvas); // Invert the color of the text and icon
|
|
|
- canvas_draw_icon(canvas, x + horizontal_offset, y - icon_v_offset, &I_ButtonUp); // Draw the icon
|
|
|
- canvas_draw_str(canvas, x + horizontal_offset + icon_width_with_offset, y - vertical_offset, str); // Draw the text
|
|
|
- canvas_invert_color(canvas); // Invert the color of the text and icon
|
|
|
+ canvas_invert_color(canvas);
|
|
|
+ canvas_draw_str(
|
|
|
+ canvas, x + horizontal_offset + 3, y - vertical_offset, str);
|
|
|
+ canvas_invert_color(canvas);
|
|
|
}
|
|
|
|
|
|
void elements_button_top_right(Canvas* canvas, const char* str) {
|
|
|
- const uint8_t button_height = 10;
|
|
|
- const uint8_t vertical_offset = 2;
|
|
|
- const uint8_t horizontal_offset = 2;
|
|
|
+ const uint8_t button_height = 12;
|
|
|
+ const uint8_t vertical_offset = 3;
|
|
|
+ const uint8_t horizontal_offset = 3;
|
|
|
+ // You may need to declare or pass 'button_width' here.
|
|
|
const uint8_t string_width = canvas_string_width(canvas, str);
|
|
|
- const Icon* icon = &I_ButtonDown;
|
|
|
- const uint8_t icon_h_offset = 2;
|
|
|
- const uint8_t icon_width_with_offset = icon->width + icon_h_offset;
|
|
|
- const uint8_t icon_v_offset = icon->height + vertical_offset;
|
|
|
- const uint8_t button_width = string_width + horizontal_offset * 2 + icon_width_with_offset;
|
|
|
+
|
|
|
+ // 'button_width' should be declared or passed here.
|
|
|
+ const uint8_t button_width = string_width + horizontal_offset * 2 + 3;
|
|
|
|
|
|
const uint8_t x = canvas_width(canvas);
|
|
|
const uint8_t y = 0 + button_height;
|
|
|
@@ -131,24 +99,22 @@ void elements_button_top_right(Canvas* canvas, const char* str) {
|
|
|
|
|
|
canvas_invert_color(canvas);
|
|
|
canvas_draw_str(canvas, x - button_width + horizontal_offset, y - vertical_offset, str);
|
|
|
- canvas_draw_icon(
|
|
|
- canvas, x - horizontal_offset - icon->width, y - icon_v_offset, &I_ButtonDown);
|
|
|
canvas_invert_color(canvas);
|
|
|
}
|
|
|
|
|
|
// Enumerations for submenu and view indices
|
|
|
typedef enum {
|
|
|
- MyAppSubmenuIndexConfigure,
|
|
|
- MyAppSubmenuIndexFlipTheWorld,
|
|
|
- MyAppSubmenuIndexAbout,
|
|
|
-} MyAppSubmenuIndex;
|
|
|
+ FMRadioSubmenuIndexConfigure,
|
|
|
+ FMRadioSubmenuIndexFlipTheWorld,
|
|
|
+ FMRadioSubmenuIndexAbout,
|
|
|
+} FMRadioSubmenuIndex;
|
|
|
|
|
|
typedef enum {
|
|
|
- MyAppViewSubmenu,
|
|
|
- MyAppViewConfigure,
|
|
|
- MyAppViewFlipTheWorld,
|
|
|
- MyAppViewAbout,
|
|
|
-} MyAppView;
|
|
|
+ FMRadioViewSubmenu,
|
|
|
+ FMRadioViewConfigure,
|
|
|
+ FMRadioViewFlipTheWorld,
|
|
|
+ FMRadioViewAbout,
|
|
|
+} FMRadioView;
|
|
|
|
|
|
// Define a struct to hold the application's components
|
|
|
typedef struct {
|
|
|
@@ -158,163 +124,167 @@ typedef struct {
|
|
|
VariableItemList* variable_item_list_config;
|
|
|
View* view_flip_the_world;
|
|
|
Widget* widget_about;
|
|
|
-} MyApp;
|
|
|
+} FMRadio;
|
|
|
|
|
|
// Define a model struct for your application
|
|
|
typedef struct {
|
|
|
- uint32_t current_station_index;
|
|
|
+ uint32_t frequency_index;
|
|
|
uint8_t volume_index;
|
|
|
} MyModel;
|
|
|
|
|
|
// Callback for navigation events
|
|
|
|
|
|
-uint32_t my_app_navigation_exit_callback(void* context) {
|
|
|
+uint32_t fmradio_controller_navigation_exit_callback(void* context) {
|
|
|
UNUSED(context);
|
|
|
- uint8_t buffer[5]; // Create a buffer to hold the TEA5767 register values
|
|
|
- tea5767_sleep(buffer); // Call the tea5767_sleep function, passing the buffer as an argument
|
|
|
+ uint8_t buffer[5]; // Create a buffer to hold the TEA5767 register values
|
|
|
+ tea5767_sleep(buffer); // Call the tea5767_sleep function, passing the buffer as an argument
|
|
|
return VIEW_NONE;
|
|
|
}
|
|
|
|
|
|
// Callback for navigating to the submenu
|
|
|
-uint32_t my_app_navigation_submenu_callback(void* context) {
|
|
|
+uint32_t fmradio_controller_navigation_submenu_callback(void* context) {
|
|
|
UNUSED(context);
|
|
|
- return MyAppViewSubmenu;
|
|
|
+ return FMRadioViewSubmenu;
|
|
|
}
|
|
|
|
|
|
// Callback for handling submenu selections
|
|
|
-void my_app_submenu_callback(void* context, uint32_t index) {
|
|
|
- MyApp* app = (MyApp*)context;
|
|
|
+void fmradio_controller_submenu_callback(void* context, uint32_t index) {
|
|
|
+ FMRadio* app = (FMRadio*)context;
|
|
|
switch(index) {
|
|
|
- case MyAppSubmenuIndexConfigure:
|
|
|
- view_dispatcher_switch_to_view(app->view_dispatcher, MyAppViewConfigure);
|
|
|
+ case FMRadioSubmenuIndexConfigure:
|
|
|
+ view_dispatcher_switch_to_view(app->view_dispatcher, FMRadioViewConfigure);
|
|
|
break;
|
|
|
- case MyAppSubmenuIndexFlipTheWorld:
|
|
|
- view_dispatcher_switch_to_view(app->view_dispatcher, MyAppViewFlipTheWorld);
|
|
|
+ case FMRadioSubmenuIndexFlipTheWorld:
|
|
|
+ view_dispatcher_switch_to_view(app->view_dispatcher, FMRadioViewFlipTheWorld);
|
|
|
break;
|
|
|
- case MyAppSubmenuIndexAbout:
|
|
|
- view_dispatcher_switch_to_view(app->view_dispatcher, MyAppViewAbout);
|
|
|
+ case FMRadioSubmenuIndexAbout:
|
|
|
+ view_dispatcher_switch_to_view(app->view_dispatcher, FMRadioViewAbout);
|
|
|
break;
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-bool my_app_view_input_callback(InputEvent* event, void* context) {
|
|
|
+bool fmradio_controller_view_input_callback(InputEvent* event, void* context) {
|
|
|
UNUSED(context);
|
|
|
- if(event->type == InputTypeShort && event->key == InputKeyLeft) {
|
|
|
+ if (event->type == InputTypeShort && event->key == InputKeyLeft) {
|
|
|
tea5767_seekDown();
|
|
|
current_volume = 0;
|
|
|
- return true; // Event was handled
|
|
|
- } else if(event->type == InputTypeShort && event->key == InputKeyRight) {
|
|
|
+ current_vol = "Un-Muted";
|
|
|
+ return true; // Event was handled
|
|
|
+ } else if (event->type == InputTypeShort && event->key == InputKeyRight) {
|
|
|
tea5767_seekUp();
|
|
|
current_volume = 0;
|
|
|
- return true; // Event was handled
|
|
|
- } else if(event->type == InputTypeShort && event->key == InputKeyOk) {
|
|
|
- if(current_volume == 0) {
|
|
|
+ current_vol = "Un-Muted";
|
|
|
+ return true; // Event was handled
|
|
|
+ } else if (event->type == InputTypeShort && event->key == InputKeyOk) {
|
|
|
+ if (current_volume == 0) { // Fixed: == instead of =
|
|
|
tea5767_MuteOn();
|
|
|
current_volume = 1;
|
|
|
+ current_vol = "Muted";
|
|
|
} else {
|
|
|
tea5767_MuteOff();
|
|
|
current_volume = 0;
|
|
|
+ current_vol = "Un-Muted";
|
|
|
}
|
|
|
- return true; // Event was handled
|
|
|
- } else if(event->type == InputTypeShort && event->key == InputKeyUp) {
|
|
|
- // Increment the current station index and loop back if at the end
|
|
|
- current_station_index = (current_station_index + 1) % NUM_STATIONS;
|
|
|
- // Set the new frequency from the stations array
|
|
|
- tea5767_SetFreqMHz(stations[current_station_index].frequency);
|
|
|
+ return true; // Event was handled
|
|
|
+ } else if (event->type == InputTypeShort && event->key == InputKeyUp) {
|
|
|
+ // Increment the current frequency index and loop back if at the end
|
|
|
+ current_frequency_index = (current_frequency_index + 1) % (sizeof(frequency_values) / sizeof(frequency_values[0]));
|
|
|
+ // Set the new frequency
|
|
|
+ tea5767_SetFreqMHz(frequency_values[current_frequency_index]);
|
|
|
current_volume = 0;
|
|
|
- return true; // Event was handled
|
|
|
- } else if(event->type == InputTypeShort && event->key == InputKeyDown) {
|
|
|
- // Decrement the current station index and loop back if at the beginning
|
|
|
- if(current_station_index == 0) {
|
|
|
- current_station_index = NUM_STATIONS - 1;
|
|
|
+ current_vol = "Un-Muted";
|
|
|
+ return true; // Event was handled
|
|
|
+ } else if (event->type == InputTypeShort && event->key == InputKeyDown) {
|
|
|
+ // Decrement the current frequency index and loop back if at the beginning
|
|
|
+ if (current_frequency_index == 0) {
|
|
|
+ current_frequency_index = (sizeof(frequency_values) / sizeof(frequency_values[0])) - 1;
|
|
|
} else {
|
|
|
- current_station_index--;
|
|
|
+ current_frequency_index--;
|
|
|
}
|
|
|
- // Set the new frequency from the stations array
|
|
|
- tea5767_SetFreqMHz(stations[current_station_index].frequency);
|
|
|
+ // Set the new frequency
|
|
|
+ tea5767_SetFreqMHz(frequency_values[current_frequency_index]);
|
|
|
current_volume = 0;
|
|
|
- return true; // Event was handled
|
|
|
+ current_vol = "Un-Muted";
|
|
|
+ return true; // Event was handled
|
|
|
}
|
|
|
- return false; // Event was not handled
|
|
|
+
|
|
|
+ return false; // Event was not handled
|
|
|
}
|
|
|
|
|
|
// Callback for handling frequency changes
|
|
|
-void my_app_frequency_change(VariableItem* item) {
|
|
|
- MyApp* app = variable_item_get_context(item);
|
|
|
+void fmradio_controller_frequency_change(VariableItem* item) {
|
|
|
+ FMRadio* app = variable_item_get_context(item);
|
|
|
uint8_t index = variable_item_get_current_value_index(item);
|
|
|
MyModel* model = view_get_model(app->view_flip_the_world);
|
|
|
- model->current_station_index = index;
|
|
|
+ model->frequency_index = index;
|
|
|
|
|
|
// Display the selected frequency value as text
|
|
|
- char frequency_display[16];
|
|
|
- snprintf(frequency_display, sizeof(frequency_display), "%.1f MHz", (double)stations[(int)index].frequency);
|
|
|
+ char frequency_display[16]; // Adjust the buffer size as needed
|
|
|
+ snprintf(frequency_display, sizeof(frequency_display), "%.1f MHz", (double)frequency_values[index]);
|
|
|
variable_item_set_current_value_text(item, frequency_display);
|
|
|
}
|
|
|
|
|
|
// Callback for handling volume changes
|
|
|
-void my_app_volume_change(VariableItem* item) {
|
|
|
- MyApp* app = variable_item_get_context(item);
|
|
|
+void fmradio_controller_volume_change(VariableItem* item) {
|
|
|
+ FMRadio* app = variable_item_get_context(item);
|
|
|
uint8_t index = variable_item_get_current_value_index(item);
|
|
|
- variable_item_set_current_value_text(
|
|
|
- item, volume_names[index]); // Display the selected volume as text
|
|
|
+ variable_item_set_current_value_text(item, volume_names[index]); // Display the selected volume as text
|
|
|
MyModel* model = view_get_model(app->view_flip_the_world);
|
|
|
model->volume_index = index;
|
|
|
}
|
|
|
|
|
|
-// Declare local buffers for text display
|
|
|
-char frequency_display[64];
|
|
|
-char station_display[256];
|
|
|
-char signal_display[64];
|
|
|
-char volume_display[32];
|
|
|
-
|
|
|
// Callback for drawing the view
|
|
|
-void my_app_view_draw_callback(Canvas* canvas, void* model) {
|
|
|
- (void)model;
|
|
|
+
|
|
|
+void fmradio_controller_view_draw_callback(Canvas* canvas, void* model) {
|
|
|
+ (void)model; // Mark model as unused
|
|
|
+
|
|
|
+ char frequency_display[64];
|
|
|
+ char signal_display[64];
|
|
|
+ char volume_display[32];
|
|
|
|
|
|
+ // tea5767_get_radio_info() populates the info
|
|
|
+ struct RADIO_INFO info;
|
|
|
+ uint8_t buffer[5];
|
|
|
+
|
|
|
// Draw strings on the canvas
|
|
|
- canvas_set_font(canvas, FontPrimary);
|
|
|
- canvas_draw_str(canvas, 33, 10, "FM Radio");
|
|
|
- canvas_draw_icon(canvas,83, 0, &I_RadioSmall);
|
|
|
+ canvas_draw_str(canvas, 45, 10, "FM Radio");
|
|
|
|
|
|
// Draw button prompts
|
|
|
canvas_set_font(canvas, FontSecondary);
|
|
|
- elements_button_top_left(canvas, "Pre"); elements_button_top_right(canvas, "Pre");
|
|
|
- elements_button_left(canvas, "Scan-"); elements_button_center(canvas, "Mute"); elements_button_right(canvas, "Scan+");
|
|
|
-
|
|
|
- struct RADIO_INFO info; // Create a struct to hold the radio info
|
|
|
- uint8_t buffer[5]; // Create a buffer to hold the TEA5767 register values
|
|
|
- if(tea5767_get_radio_info(buffer, &info)) {
|
|
|
+ elements_button_left(canvas, "Scan-");
|
|
|
+ elements_button_right(canvas, "Scan+");
|
|
|
+ elements_button_center(canvas, "Mute");
|
|
|
+ elements_button_top_left(canvas, " Pre");
|
|
|
+ elements_button_top_right(canvas, "Pre ");
|
|
|
+
|
|
|
+
|
|
|
+ if (tea5767_get_radio_info(buffer, &info)) {
|
|
|
snprintf(frequency_display, sizeof(frequency_display), "Frequency: %.1f MHz", (double)info.frequency);
|
|
|
- float tolerance = 0.05f;
|
|
|
- float diff = stations[current_station_index].frequency - info.frequency;
|
|
|
- if(fabsf(diff) < tolerance) {snprintf(station_display, sizeof(station_display), "%s", stations[current_station_index].name);}
|
|
|
- else {station_display[0] = '\0';}
|
|
|
- snprintf(volume_display, sizeof(volume_display), "Status: %s %s", info.muted ? "Playing" : "Muted", info.stereo ? "(Mono)" : "(Stereo)");
|
|
|
- snprintf(signal_display, sizeof(signal_display), "Signal: %d (%s)", info.signalLevel, info.signalQuality);
|
|
|
+ canvas_draw_str(canvas, 10, 25, frequency_display);
|
|
|
+
|
|
|
+ snprintf(signal_display, sizeof(signal_display), "RSSI: %d (%s) %d", info.signalLevel, info.signalQuality, loopcount);
|
|
|
+ canvas_draw_str(canvas, 10, 45, signal_display);
|
|
|
+
|
|
|
+ snprintf(volume_display, sizeof(volume_display), "Status: %s %s", info.muted ? "Playing" : "Muted", info.stereo ? "(Stereo)" : "(Mono)");
|
|
|
+ canvas_draw_str(canvas, 10, 35, volume_display);
|
|
|
} else {
|
|
|
- // Display error message if TEA5767 is not detected
|
|
|
snprintf(frequency_display, sizeof(frequency_display), "TEA5767 Not Detected");
|
|
|
- snprintf(signal_display, sizeof(signal_display), "Pin 15 = SDA | Pin 16 = SLC");
|
|
|
- // Reset frequency_display and volume_display to blank
|
|
|
- station_display[0] = '\0';
|
|
|
- volume_display[0] = '\0';
|
|
|
+ canvas_draw_str(canvas, 10, 25, frequency_display);
|
|
|
+
|
|
|
+ snprintf(signal_display, sizeof(signal_display), "Pin 15 = SDA | Pin 16 = SLC");
|
|
|
+ canvas_draw_str(canvas, 10, 45, signal_display);
|
|
|
}
|
|
|
|
|
|
- // Display the stored values on the 5th loop
|
|
|
- canvas_set_font(canvas, FontPrimary);
|
|
|
- canvas_draw_str(canvas, 10, 20, station_display);
|
|
|
- canvas_set_font(canvas, FontSecondary);
|
|
|
- canvas_draw_str(canvas, 10, 30, frequency_display);
|
|
|
- canvas_draw_str(canvas, 10, 40, volume_display);
|
|
|
- canvas_draw_str(canvas, 10, 49, signal_display);
|
|
|
}
|
|
|
|
|
|
// Allocate memory for the application
|
|
|
-MyApp* my_app_alloc() {
|
|
|
- MyApp* app = (MyApp*)malloc(sizeof(MyApp));
|
|
|
+FMRadio* fmradio_controller_alloc() {
|
|
|
+ FMRadio* app = (FMRadio*)malloc(sizeof(FMRadio));
|
|
|
+
|
|
|
Gui* gui = furi_record_open(RECORD_GUI);
|
|
|
+
|
|
|
// Initialize the view dispatcher
|
|
|
app->view_dispatcher = view_dispatcher_alloc();
|
|
|
view_dispatcher_enable_queue(app->view_dispatcher);
|
|
|
@@ -322,83 +292,84 @@ MyApp* my_app_alloc() {
|
|
|
|
|
|
// Initialize the submenu
|
|
|
app->submenu = submenu_alloc();
|
|
|
- submenu_add_item(app->submenu, "Listen Now", MyAppSubmenuIndexFlipTheWorld, my_app_submenu_callback, app);
|
|
|
- //submenu_add_item(app->submenu, "Config", MyAppSubmenuIndexConfigure, my_app_submenu_callback, app);
|
|
|
- submenu_add_item(app->submenu, "About", MyAppSubmenuIndexAbout, my_app_submenu_callback, app);
|
|
|
- view_set_previous_callback(submenu_get_view(app->submenu), my_app_navigation_exit_callback);
|
|
|
- view_dispatcher_add_view(app->view_dispatcher, MyAppViewSubmenu, submenu_get_view(app->submenu));
|
|
|
- view_dispatcher_switch_to_view(app->view_dispatcher, MyAppViewSubmenu);
|
|
|
+ submenu_add_item(app->submenu,"Listen Now",FMRadioSubmenuIndexFlipTheWorld,fmradio_controller_submenu_callback,app);
|
|
|
+ //submenu_add_item(app->submenu, "Config", FMRadioSubmenuIndexConfigure, fmradio_controller_submenu_callback, app);
|
|
|
+ submenu_add_item(app->submenu, "About", FMRadioSubmenuIndexAbout, fmradio_controller_submenu_callback, app);
|
|
|
+ view_set_previous_callback(submenu_get_view(app->submenu), fmradio_controller_navigation_exit_callback);
|
|
|
+ view_dispatcher_add_view(app->view_dispatcher, FMRadioViewSubmenu, submenu_get_view(app->submenu));
|
|
|
+ view_dispatcher_switch_to_view(app->view_dispatcher, FMRadioViewSubmenu);
|
|
|
|
|
|
// Initialize the variable item list for configuration
|
|
|
app->variable_item_list_config = variable_item_list_alloc();
|
|
|
variable_item_list_reset(app->variable_item_list_config);
|
|
|
|
|
|
// Add frequency configuration
|
|
|
- VariableItem* frequency_item = variable_item_list_add(app->variable_item_list_config, "Freq (MHz)", NUM_STATIONS, my_app_frequency_change, app);
|
|
|
-
|
|
|
- uint32_t current_station_index = 0;
|
|
|
- variable_item_set_current_value_index(frequency_item, current_station_index);
|
|
|
+ VariableItem* frequency_item = variable_item_list_add(app->variable_item_list_config,"Freq (MHz)", COUNT_OF(frequency_values),fmradio_controller_frequency_change,app);
|
|
|
+ uint32_t frequency_index = 0;
|
|
|
+ variable_item_set_current_value_index(frequency_item, frequency_index);
|
|
|
+
|
|
|
// Add volume configuration
|
|
|
- VariableItem* volume_item = variable_item_list_add(app->variable_item_list_config, "Volume", COUNT_OF(volume_values), my_app_volume_change, app);
|
|
|
+ VariableItem* volume_item = variable_item_list_add(app->variable_item_list_config,"Volume", COUNT_OF(volume_values),fmradio_controller_volume_change,app);
|
|
|
uint8_t volume_index = 0;
|
|
|
variable_item_set_current_value_index(volume_item, volume_index);
|
|
|
- view_set_previous_callback(variable_item_list_get_view(app->variable_item_list_config),my_app_navigation_submenu_callback);
|
|
|
- view_dispatcher_add_view(app->view_dispatcher, MyAppViewConfigure, variable_item_list_get_view(app->variable_item_list_config));
|
|
|
-
|
|
|
+ view_set_previous_callback(variable_item_list_get_view(app->variable_item_list_config),fmradio_controller_navigation_submenu_callback);
|
|
|
+ view_dispatcher_add_view(app->view_dispatcher,FMRadioViewConfigure,variable_item_list_get_view(app->variable_item_list_config));
|
|
|
+
|
|
|
// Initialize the view for flipping the world
|
|
|
app->view_flip_the_world = view_alloc();
|
|
|
- view_set_draw_callback(app->view_flip_the_world, my_app_view_draw_callback);
|
|
|
- view_set_input_callback(app->view_flip_the_world, my_app_view_input_callback);
|
|
|
- view_set_previous_callback(app->view_flip_the_world, my_app_navigation_submenu_callback);
|
|
|
+ view_set_draw_callback(app->view_flip_the_world, fmradio_controller_view_draw_callback);
|
|
|
+ view_set_input_callback(app->view_flip_the_world, fmradio_controller_view_input_callback);
|
|
|
+ view_set_previous_callback(app->view_flip_the_world, fmradio_controller_navigation_submenu_callback);
|
|
|
view_allocate_model(app->view_flip_the_world, ViewModelTypeLockFree, sizeof(MyModel));
|
|
|
MyModel* model = view_get_model(app->view_flip_the_world);
|
|
|
- model->current_station_index = current_station_index;
|
|
|
+ model->frequency_index = frequency_index;
|
|
|
model->volume_index = volume_index;
|
|
|
- view_dispatcher_add_view(app->view_dispatcher, MyAppViewFlipTheWorld, app->view_flip_the_world);
|
|
|
-
|
|
|
+
|
|
|
+ view_dispatcher_add_view(app->view_dispatcher, FMRadioViewFlipTheWorld, app->view_flip_the_world);
|
|
|
+
|
|
|
// Initialize the widget for displaying information about the app
|
|
|
app->widget_about = widget_alloc();
|
|
|
- widget_add_text_scroll_element(app->widget_about, 0, 0, 128, 64,
|
|
|
- "FM Radio (v1.1)\n"
|
|
|
- "---\n"
|
|
|
- "Created By Coolshrimp\n\n"
|
|
|
- "Up = Preset Up\n"
|
|
|
- "Down = Preset Down\n"
|
|
|
- "Left = Seek Down\n"
|
|
|
- "Right = Seek Up\n"
|
|
|
- "OK = Toggle Mute");
|
|
|
-
|
|
|
- view_set_previous_callback(widget_get_view(app->widget_about), my_app_navigation_submenu_callback);
|
|
|
- view_dispatcher_add_view(app->view_dispatcher, MyAppViewAbout, widget_get_view(app->widget_about));
|
|
|
+ widget_add_text_scroll_element(app->widget_about,0,0,128,64,"FM Radio. (v0.8)\n---\n Created By Coolshrimp\n\nUp = Preset Up\nDown = Preset Down\nLeft = Seek Down \nRight = Seek Up \n OK = Toggle Mute");
|
|
|
+ view_set_previous_callback(widget_get_view(app->widget_about), fmradio_controller_navigation_submenu_callback);
|
|
|
+ view_dispatcher_add_view(app->view_dispatcher, FMRadioViewAbout, widget_get_view(app->widget_about));
|
|
|
+
|
|
|
app->notifications = furi_record_open(RECORD_NOTIFICATION);
|
|
|
+
|
|
|
#ifdef BACKLIGHT_ALWAYS_ON
|
|
|
notification_message(app->notifications, &sequence_display_backlight_enforce_on);
|
|
|
#endif
|
|
|
+
|
|
|
return app;
|
|
|
}
|
|
|
+
|
|
|
// Free memory used by the application
|
|
|
-void my_app_free(MyApp* app) {
|
|
|
+void fmradio_controller_free(FMRadio* app) {
|
|
|
#ifdef BACKLIGHT_ALWAYS_ON
|
|
|
notification_message(app->notifications, &sequence_display_backlight_enforce_auto);
|
|
|
#endif
|
|
|
furi_record_close(RECORD_NOTIFICATION);
|
|
|
- view_dispatcher_remove_view(app->view_dispatcher, MyAppViewAbout);
|
|
|
+
|
|
|
+ view_dispatcher_remove_view(app->view_dispatcher, FMRadioViewAbout);
|
|
|
widget_free(app->widget_about);
|
|
|
- view_dispatcher_remove_view(app->view_dispatcher, MyAppViewFlipTheWorld);
|
|
|
+ view_dispatcher_remove_view(app->view_dispatcher, FMRadioViewFlipTheWorld);
|
|
|
view_free(app->view_flip_the_world);
|
|
|
- view_dispatcher_remove_view(app->view_dispatcher, MyAppViewConfigure);
|
|
|
+ view_dispatcher_remove_view(app->view_dispatcher, FMRadioViewConfigure);
|
|
|
variable_item_list_free(app->variable_item_list_config);
|
|
|
- view_dispatcher_remove_view(app->view_dispatcher, MyAppViewSubmenu);
|
|
|
+ view_dispatcher_remove_view(app->view_dispatcher, FMRadioViewSubmenu);
|
|
|
submenu_free(app->submenu);
|
|
|
view_dispatcher_free(app->view_dispatcher);
|
|
|
furi_record_close(RECORD_GUI);
|
|
|
+
|
|
|
free(app);
|
|
|
}
|
|
|
+
|
|
|
// Main function to start the application
|
|
|
-int32_t my_fm_radio(void* p) {
|
|
|
+int32_t fmradio_controller_app(void* p) {
|
|
|
UNUSED(p);
|
|
|
- MyApp* app = my_app_alloc();
|
|
|
+
|
|
|
+ FMRadio* app = fmradio_controller_alloc();
|
|
|
view_dispatcher_run(app->view_dispatcher);
|
|
|
- my_app_free(app);
|
|
|
+
|
|
|
+ fmradio_controller_free(app);
|
|
|
return 0;
|
|
|
}
|