[FL-2627] Flipper applications: SDK, build and debug system (#1387)
* Added support for running applications from SD card (FAPs - Flipper Application Packages) * Added plugin_dist target for fbt to build FAPs * All apps of type FlipperAppType.EXTERNAL and FlipperAppType.PLUGIN are built as FAPs by default * Updated VSCode configuration for new fbt features - re-deploy stock configuration to use them * Added debugging support for FAPs with fbt debug & VSCode * Added public firmware API with automated versioning Co-authored-by: hedger <hedger@users.noreply.github.com> Co-authored-by: SG <who.just.the.doctor@gmail.com> Co-authored-by: あく <alleteam@gmail.com>
This commit is contained in:
12
applications/services/notification/application.fam
Normal file
12
applications/services/notification/application.fam
Normal file
@@ -0,0 +1,12 @@
|
||||
App(
|
||||
appid="notification",
|
||||
name="NotificationSrv",
|
||||
apptype=FlipperAppType.SERVICE,
|
||||
entry_point="notification_srv",
|
||||
cdefines=["SRV_NOTIFICATION"],
|
||||
requires=["input"],
|
||||
provides=["notification_settings"],
|
||||
stack_size=int(1.5 * 1024),
|
||||
order=100,
|
||||
sdk_headers=["notification.h", "notification_messages.h"],
|
||||
)
|
110
applications/services/notification/notification.h
Normal file
110
applications/services/notification/notification.h
Normal file
@@ -0,0 +1,110 @@
|
||||
#pragma once
|
||||
#include "stdint.h"
|
||||
#include "stdbool.h"
|
||||
#include <furi_hal_resources.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define RECORD_NOTIFICATION "notification"
|
||||
|
||||
typedef struct NotificationApp NotificationApp;
|
||||
typedef struct {
|
||||
float frequency;
|
||||
float volume;
|
||||
} NotificationMessageDataSound;
|
||||
|
||||
typedef struct {
|
||||
uint8_t value;
|
||||
} NotificationMessageDataLed;
|
||||
|
||||
typedef struct {
|
||||
bool on;
|
||||
} NotificationMessageDataVibro;
|
||||
|
||||
typedef struct {
|
||||
uint32_t length;
|
||||
} NotificationMessageDataDelay;
|
||||
|
||||
typedef struct {
|
||||
float speaker_volume;
|
||||
bool vibro;
|
||||
float display_brightness;
|
||||
} NotificationMessageDataForcedSettings;
|
||||
|
||||
typedef struct {
|
||||
uint16_t on_time;
|
||||
uint16_t period;
|
||||
Light color;
|
||||
} NotificationMessageDataLedBlink;
|
||||
|
||||
typedef union {
|
||||
NotificationMessageDataSound sound;
|
||||
NotificationMessageDataLed led;
|
||||
NotificationMessageDataLedBlink led_blink;
|
||||
NotificationMessageDataVibro vibro;
|
||||
NotificationMessageDataDelay delay;
|
||||
NotificationMessageDataForcedSettings forced_settings;
|
||||
} NotificationMessageData;
|
||||
|
||||
typedef enum {
|
||||
NotificationMessageTypeVibro,
|
||||
|
||||
NotificationMessageTypeSoundOn,
|
||||
NotificationMessageTypeSoundOff,
|
||||
|
||||
NotificationMessageTypeLedRed,
|
||||
NotificationMessageTypeLedGreen,
|
||||
NotificationMessageTypeLedBlue,
|
||||
|
||||
NotificationMessageTypeLedBlinkStart,
|
||||
NotificationMessageTypeLedBlinkStop,
|
||||
NotificationMessageTypeLedBlinkColor,
|
||||
|
||||
NotificationMessageTypeDelay,
|
||||
|
||||
NotificationMessageTypeLedDisplayBacklight,
|
||||
NotificationMessageTypeLedDisplayBacklightEnforceOn,
|
||||
NotificationMessageTypeLedDisplayBacklightEnforceAuto,
|
||||
|
||||
NotificationMessageTypeDoNotReset,
|
||||
|
||||
NotificationMessageTypeForceSpeakerVolumeSetting,
|
||||
NotificationMessageTypeForceVibroSetting,
|
||||
NotificationMessageTypeForceDisplayBrightnessSetting,
|
||||
|
||||
NotificationMessageTypeLedBrightnessSettingApply,
|
||||
} NotificationMessageType;
|
||||
|
||||
typedef struct {
|
||||
NotificationMessageType type;
|
||||
NotificationMessageData data;
|
||||
} NotificationMessage;
|
||||
|
||||
typedef const NotificationMessage* NotificationSequence[];
|
||||
|
||||
void notification_message(NotificationApp* app, const NotificationSequence* sequence);
|
||||
void notification_message_block(NotificationApp* app, const NotificationSequence* sequence);
|
||||
|
||||
/**
|
||||
* @brief Send internal (apply to permanent layer) notification message. Think twice before use.
|
||||
*
|
||||
* @param app notification record content
|
||||
* @param sequence notification sequence
|
||||
*/
|
||||
void notification_internal_message(NotificationApp* app, const NotificationSequence* sequence);
|
||||
|
||||
/**
|
||||
* @brief Send internal (apply to permanent layer) notification message and wait for notification end. Think twice before use.
|
||||
*
|
||||
* @param app notification record content
|
||||
* @param sequence notification sequence
|
||||
*/
|
||||
void notification_internal_message_block(
|
||||
NotificationApp* app,
|
||||
const NotificationSequence* sequence);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
562
applications/services/notification/notification_app.c
Normal file
562
applications/services/notification/notification_app.c
Normal file
@@ -0,0 +1,562 @@
|
||||
#include "furi_hal_light.h"
|
||||
#include <furi.h>
|
||||
#include <furi_hal.h>
|
||||
#include <storage/storage.h>
|
||||
#include <input/input.h>
|
||||
#include "notification.h"
|
||||
#include "notification_messages.h"
|
||||
#include "notification_app.h"
|
||||
|
||||
#define TAG "NotificationSrv"
|
||||
|
||||
static const uint8_t minimal_delay = 100;
|
||||
static const uint8_t led_off_values[NOTIFICATION_LED_COUNT] = {0x00, 0x00, 0x00};
|
||||
|
||||
static const uint8_t reset_red_mask = 1 << 0;
|
||||
static const uint8_t reset_green_mask = 1 << 1;
|
||||
static const uint8_t reset_blue_mask = 1 << 2;
|
||||
static const uint8_t reset_vibro_mask = 1 << 3;
|
||||
static const uint8_t reset_sound_mask = 1 << 4;
|
||||
static const uint8_t reset_display_mask = 1 << 5;
|
||||
static const uint8_t reset_blink_mask = 1 << 6;
|
||||
|
||||
void notification_vibro_on();
|
||||
void notification_vibro_off();
|
||||
void notification_sound_on(float pwm, float freq);
|
||||
void notification_sound_off();
|
||||
|
||||
uint8_t notification_settings_get_display_brightness(NotificationApp* app, uint8_t value);
|
||||
uint8_t notification_settings_get_rgb_led_brightness(NotificationApp* app, uint8_t value);
|
||||
uint32_t notification_settings_display_off_delay_ticks(NotificationApp* app);
|
||||
|
||||
void notification_message_save_settings(NotificationApp* app) {
|
||||
NotificationAppMessage m = {
|
||||
.type = SaveSettingsMessage, .back_event = furi_event_flag_alloc()};
|
||||
furi_check(furi_message_queue_put(app->queue, &m, FuriWaitForever) == FuriStatusOk);
|
||||
furi_event_flag_wait(
|
||||
m.back_event, NOTIFICATION_EVENT_COMPLETE, FuriFlagWaitAny, FuriWaitForever);
|
||||
furi_event_flag_free(m.back_event);
|
||||
};
|
||||
|
||||
// internal layer
|
||||
void notification_apply_internal_led_layer(NotificationLedLayer* layer, uint8_t layer_value) {
|
||||
furi_assert(layer);
|
||||
furi_assert(layer->index < LayerMAX);
|
||||
|
||||
// set value
|
||||
layer->value[LayerInternal] = layer_value;
|
||||
|
||||
// apply if current layer is internal
|
||||
if(layer->index == LayerInternal) {
|
||||
furi_hal_light_set(layer->light, layer->value[LayerInternal]);
|
||||
}
|
||||
}
|
||||
|
||||
bool notification_is_any_led_layer_internal_and_not_empty(NotificationApp* app) {
|
||||
bool result = false;
|
||||
if((app->led[0].index == LayerInternal) || (app->led[1].index == LayerInternal) ||
|
||||
(app->led[2].index == LayerInternal)) {
|
||||
if((app->led[0].value[LayerInternal] != 0x00) ||
|
||||
(app->led[1].value[LayerInternal] != 0x00) ||
|
||||
(app->led[2].value[LayerInternal] != 0x00)) {
|
||||
result = true;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// notification layer
|
||||
void notification_apply_notification_led_layer(
|
||||
NotificationLedLayer* layer,
|
||||
const uint8_t layer_value) {
|
||||
furi_assert(layer);
|
||||
furi_assert(layer->index < LayerMAX);
|
||||
|
||||
// set value
|
||||
layer->index = LayerNotification;
|
||||
// set layer
|
||||
layer->value[LayerNotification] = layer_value;
|
||||
// apply
|
||||
furi_hal_light_set(layer->light, layer->value[LayerNotification]);
|
||||
}
|
||||
|
||||
void notification_reset_notification_led_layer(NotificationLedLayer* layer) {
|
||||
furi_assert(layer);
|
||||
furi_assert(layer->index < LayerMAX);
|
||||
|
||||
// set value
|
||||
layer->value[LayerNotification] = 0;
|
||||
// set layer
|
||||
layer->index = LayerInternal;
|
||||
|
||||
// apply
|
||||
furi_hal_light_set(layer->light, layer->value[LayerInternal]);
|
||||
}
|
||||
|
||||
void notification_reset_notification_layer(NotificationApp* app, uint8_t reset_mask) {
|
||||
if(reset_mask & reset_blink_mask) {
|
||||
furi_hal_light_blink_stop();
|
||||
}
|
||||
if(reset_mask & reset_red_mask) {
|
||||
notification_reset_notification_led_layer(&app->led[0]);
|
||||
}
|
||||
if(reset_mask & reset_green_mask) {
|
||||
notification_reset_notification_led_layer(&app->led[1]);
|
||||
}
|
||||
if(reset_mask & reset_blue_mask) {
|
||||
notification_reset_notification_led_layer(&app->led[2]);
|
||||
}
|
||||
if(reset_mask & reset_vibro_mask) {
|
||||
notification_vibro_off();
|
||||
}
|
||||
if(reset_mask & reset_sound_mask) {
|
||||
notification_sound_off();
|
||||
}
|
||||
if(reset_mask & reset_display_mask) {
|
||||
furi_timer_start(app->display_timer, notification_settings_display_off_delay_ticks(app));
|
||||
}
|
||||
}
|
||||
|
||||
static void notification_apply_notification_leds(NotificationApp* app, const uint8_t* values) {
|
||||
for(uint8_t i = 0; i < NOTIFICATION_LED_COUNT; i++) {
|
||||
notification_apply_notification_led_layer(
|
||||
&app->led[i], notification_settings_get_rgb_led_brightness(app, values[i]));
|
||||
}
|
||||
}
|
||||
|
||||
// settings
|
||||
uint8_t notification_settings_get_display_brightness(NotificationApp* app, uint8_t value) {
|
||||
return (value * app->settings.display_brightness);
|
||||
}
|
||||
|
||||
uint8_t notification_settings_get_rgb_led_brightness(NotificationApp* app, uint8_t value) {
|
||||
return (value * app->settings.led_brightness);
|
||||
}
|
||||
|
||||
uint32_t notification_settings_display_off_delay_ticks(NotificationApp* app) {
|
||||
return (
|
||||
(float)(app->settings.display_off_delay_ms) /
|
||||
(1000.0f / furi_kernel_get_tick_frequency()));
|
||||
}
|
||||
|
||||
// generics
|
||||
void notification_vibro_on() {
|
||||
furi_hal_vibro_on(true);
|
||||
}
|
||||
|
||||
void notification_vibro_off() {
|
||||
furi_hal_vibro_on(false);
|
||||
}
|
||||
|
||||
void notification_sound_on(float freq, float volume) {
|
||||
furi_hal_speaker_start(freq, volume);
|
||||
}
|
||||
|
||||
void notification_sound_off() {
|
||||
furi_hal_speaker_stop();
|
||||
}
|
||||
|
||||
// display timer
|
||||
static void notification_display_timer(void* ctx) {
|
||||
furi_assert(ctx);
|
||||
NotificationApp* app = ctx;
|
||||
notification_message(app, &sequence_display_backlight_off);
|
||||
}
|
||||
|
||||
// message processing
|
||||
void notification_process_notification_message(
|
||||
NotificationApp* app,
|
||||
NotificationAppMessage* message) {
|
||||
uint32_t notification_message_index = 0;
|
||||
const NotificationMessage* notification_message;
|
||||
notification_message = (*message->sequence)[notification_message_index];
|
||||
|
||||
bool led_active = false;
|
||||
uint8_t led_values[NOTIFICATION_LED_COUNT] = {0x00, 0x00, 0x00};
|
||||
bool reset_notifications = true;
|
||||
float speaker_volume_setting = app->settings.speaker_volume;
|
||||
bool vibro_setting = app->settings.vibro_on;
|
||||
float display_brightness_setting = app->settings.display_brightness;
|
||||
|
||||
uint8_t reset_mask = 0;
|
||||
|
||||
while(notification_message != NULL) {
|
||||
switch(notification_message->type) {
|
||||
case NotificationMessageTypeLedDisplayBacklight:
|
||||
// if on - switch on and start timer
|
||||
// if off - switch off and stop timer
|
||||
// on timer - switch off
|
||||
if(notification_message->data.led.value > 0x00) {
|
||||
notification_apply_notification_led_layer(
|
||||
&app->display,
|
||||
notification_message->data.led.value * display_brightness_setting);
|
||||
} else {
|
||||
notification_reset_notification_led_layer(&app->display);
|
||||
if(furi_timer_is_running(app->display_timer)) {
|
||||
furi_timer_stop(app->display_timer);
|
||||
}
|
||||
}
|
||||
reset_mask |= reset_display_mask;
|
||||
break;
|
||||
case NotificationMessageTypeLedDisplayBacklightEnforceOn:
|
||||
furi_assert(app->display_led_lock < UINT8_MAX);
|
||||
app->display_led_lock++;
|
||||
if(app->display_led_lock == 1) {
|
||||
notification_apply_internal_led_layer(
|
||||
&app->display,
|
||||
notification_message->data.led.value * display_brightness_setting);
|
||||
}
|
||||
break;
|
||||
case NotificationMessageTypeLedDisplayBacklightEnforceAuto:
|
||||
furi_assert(app->display_led_lock > 0);
|
||||
app->display_led_lock--;
|
||||
if(app->display_led_lock == 0) {
|
||||
notification_apply_internal_led_layer(
|
||||
&app->display,
|
||||
notification_message->data.led.value * display_brightness_setting);
|
||||
}
|
||||
break;
|
||||
case NotificationMessageTypeLedRed:
|
||||
// store and send on delay or after seq
|
||||
led_active = true;
|
||||
led_values[0] = notification_message->data.led.value;
|
||||
app->led[0].value_last[LayerNotification] = led_values[0];
|
||||
reset_mask |= reset_red_mask;
|
||||
break;
|
||||
case NotificationMessageTypeLedGreen:
|
||||
// store and send on delay or after seq
|
||||
led_active = true;
|
||||
led_values[1] = notification_message->data.led.value;
|
||||
app->led[1].value_last[LayerNotification] = led_values[1];
|
||||
reset_mask |= reset_green_mask;
|
||||
break;
|
||||
case NotificationMessageTypeLedBlue:
|
||||
// store and send on delay or after seq
|
||||
led_active = true;
|
||||
led_values[2] = notification_message->data.led.value;
|
||||
app->led[2].value_last[LayerNotification] = led_values[2];
|
||||
reset_mask |= reset_blue_mask;
|
||||
break;
|
||||
case NotificationMessageTypeLedBlinkStart:
|
||||
// store and send on delay or after seq
|
||||
led_active = true;
|
||||
furi_hal_light_blink_start(
|
||||
notification_message->data.led_blink.color,
|
||||
app->settings.led_brightness * 255,
|
||||
notification_message->data.led_blink.on_time,
|
||||
notification_message->data.led_blink.period);
|
||||
reset_mask |= reset_blink_mask;
|
||||
reset_mask |= reset_red_mask;
|
||||
reset_mask |= reset_green_mask;
|
||||
reset_mask |= reset_blue_mask;
|
||||
break;
|
||||
case NotificationMessageTypeLedBlinkColor:
|
||||
led_active = true;
|
||||
furi_hal_light_blink_set_color(notification_message->data.led_blink.color);
|
||||
break;
|
||||
case NotificationMessageTypeLedBlinkStop:
|
||||
furi_hal_light_blink_stop();
|
||||
reset_mask &= ~reset_blink_mask;
|
||||
reset_mask |= reset_red_mask;
|
||||
reset_mask |= reset_green_mask;
|
||||
reset_mask |= reset_blue_mask;
|
||||
break;
|
||||
case NotificationMessageTypeVibro:
|
||||
if(notification_message->data.vibro.on) {
|
||||
if(vibro_setting) notification_vibro_on();
|
||||
} else {
|
||||
notification_vibro_off();
|
||||
}
|
||||
reset_mask |= reset_vibro_mask;
|
||||
break;
|
||||
case NotificationMessageTypeSoundOn:
|
||||
notification_sound_on(
|
||||
notification_message->data.sound.frequency,
|
||||
notification_message->data.sound.volume * speaker_volume_setting);
|
||||
reset_mask |= reset_sound_mask;
|
||||
break;
|
||||
case NotificationMessageTypeSoundOff:
|
||||
notification_sound_off();
|
||||
reset_mask |= reset_sound_mask;
|
||||
break;
|
||||
case NotificationMessageTypeDelay:
|
||||
if(led_active) {
|
||||
if(notification_is_any_led_layer_internal_and_not_empty(app)) {
|
||||
notification_apply_notification_leds(app, led_off_values);
|
||||
furi_delay_ms(minimal_delay);
|
||||
}
|
||||
|
||||
led_active = false;
|
||||
|
||||
notification_apply_notification_leds(app, led_values);
|
||||
reset_mask |= reset_red_mask;
|
||||
reset_mask |= reset_green_mask;
|
||||
reset_mask |= reset_blue_mask;
|
||||
}
|
||||
|
||||
furi_delay_ms(notification_message->data.delay.length);
|
||||
break;
|
||||
case NotificationMessageTypeDoNotReset:
|
||||
reset_notifications = false;
|
||||
break;
|
||||
case NotificationMessageTypeForceSpeakerVolumeSetting:
|
||||
speaker_volume_setting = notification_message->data.forced_settings.speaker_volume;
|
||||
break;
|
||||
case NotificationMessageTypeForceVibroSetting:
|
||||
vibro_setting = notification_message->data.forced_settings.vibro;
|
||||
break;
|
||||
case NotificationMessageTypeForceDisplayBrightnessSetting:
|
||||
display_brightness_setting =
|
||||
notification_message->data.forced_settings.display_brightness;
|
||||
break;
|
||||
case NotificationMessageTypeLedBrightnessSettingApply:
|
||||
led_active = true;
|
||||
for(uint8_t i = 0; i < NOTIFICATION_LED_COUNT; i++) {
|
||||
led_values[i] = app->led[i].value_last[LayerNotification];
|
||||
}
|
||||
reset_mask |= reset_red_mask;
|
||||
reset_mask |= reset_green_mask;
|
||||
reset_mask |= reset_blue_mask;
|
||||
break;
|
||||
}
|
||||
notification_message_index++;
|
||||
notification_message = (*message->sequence)[notification_message_index];
|
||||
};
|
||||
|
||||
// send and do minimal delay
|
||||
if(led_active) {
|
||||
bool need_minimal_delay = false;
|
||||
if(notification_is_any_led_layer_internal_and_not_empty(app)) {
|
||||
need_minimal_delay = true;
|
||||
}
|
||||
|
||||
notification_apply_notification_leds(app, led_values);
|
||||
reset_mask |= reset_red_mask;
|
||||
reset_mask |= reset_green_mask;
|
||||
reset_mask |= reset_blue_mask;
|
||||
|
||||
if((need_minimal_delay) && (reset_notifications)) {
|
||||
notification_apply_notification_leds(app, led_off_values);
|
||||
furi_delay_ms(minimal_delay);
|
||||
}
|
||||
}
|
||||
|
||||
if(reset_notifications) {
|
||||
notification_reset_notification_layer(app, reset_mask);
|
||||
}
|
||||
}
|
||||
|
||||
void notification_process_internal_message(NotificationApp* app, NotificationAppMessage* message) {
|
||||
uint32_t notification_message_index = 0;
|
||||
const NotificationMessage* notification_message;
|
||||
notification_message = (*message->sequence)[notification_message_index];
|
||||
|
||||
while(notification_message != NULL) {
|
||||
switch(notification_message->type) {
|
||||
case NotificationMessageTypeLedDisplayBacklight:
|
||||
notification_apply_internal_led_layer(
|
||||
&app->display,
|
||||
notification_settings_get_display_brightness(
|
||||
app, notification_message->data.led.value));
|
||||
break;
|
||||
case NotificationMessageTypeLedRed:
|
||||
app->led[0].value_last[LayerInternal] = notification_message->data.led.value;
|
||||
notification_apply_internal_led_layer(
|
||||
&app->led[0],
|
||||
notification_settings_get_rgb_led_brightness(
|
||||
app, notification_message->data.led.value));
|
||||
break;
|
||||
case NotificationMessageTypeLedGreen:
|
||||
app->led[1].value_last[LayerInternal] = notification_message->data.led.value;
|
||||
notification_apply_internal_led_layer(
|
||||
&app->led[1],
|
||||
notification_settings_get_rgb_led_brightness(
|
||||
app, notification_message->data.led.value));
|
||||
break;
|
||||
case NotificationMessageTypeLedBlue:
|
||||
app->led[2].value_last[LayerInternal] = notification_message->data.led.value;
|
||||
notification_apply_internal_led_layer(
|
||||
&app->led[2],
|
||||
notification_settings_get_rgb_led_brightness(
|
||||
app, notification_message->data.led.value));
|
||||
break;
|
||||
case NotificationMessageTypeLedBrightnessSettingApply:
|
||||
for(uint8_t i = 0; i < NOTIFICATION_LED_COUNT; i++) {
|
||||
uint8_t new_val = notification_settings_get_rgb_led_brightness(
|
||||
app, app->led[i].value_last[LayerInternal]);
|
||||
notification_apply_internal_led_layer(&app->led[i], new_val);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
notification_message_index++;
|
||||
notification_message = (*message->sequence)[notification_message_index];
|
||||
}
|
||||
}
|
||||
|
||||
static bool notification_load_settings(NotificationApp* app) {
|
||||
NotificationSettings settings;
|
||||
File* file = storage_file_alloc(furi_record_open(RECORD_STORAGE));
|
||||
const size_t settings_size = sizeof(NotificationSettings);
|
||||
|
||||
FURI_LOG_I(TAG, "loading settings from \"%s\"", NOTIFICATION_SETTINGS_PATH);
|
||||
bool fs_result =
|
||||
storage_file_open(file, NOTIFICATION_SETTINGS_PATH, FSAM_READ, FSOM_OPEN_EXISTING);
|
||||
|
||||
if(fs_result) {
|
||||
uint16_t bytes_count = storage_file_read(file, &settings, settings_size);
|
||||
|
||||
if(bytes_count != settings_size) {
|
||||
fs_result = false;
|
||||
}
|
||||
}
|
||||
|
||||
if(fs_result) {
|
||||
FURI_LOG_I(TAG, "load success");
|
||||
|
||||
if(settings.version != NOTIFICATION_SETTINGS_VERSION) {
|
||||
FURI_LOG_E(
|
||||
TAG, "version(%d != %d) mismatch", settings.version, NOTIFICATION_SETTINGS_VERSION);
|
||||
} else {
|
||||
furi_kernel_lock();
|
||||
memcpy(&app->settings, &settings, settings_size);
|
||||
furi_kernel_unlock();
|
||||
}
|
||||
} else {
|
||||
FURI_LOG_E(TAG, "load failed, %s", storage_file_get_error_desc(file));
|
||||
}
|
||||
|
||||
storage_file_close(file);
|
||||
storage_file_free(file);
|
||||
furi_record_close(RECORD_STORAGE);
|
||||
|
||||
return fs_result;
|
||||
};
|
||||
|
||||
static bool notification_save_settings(NotificationApp* app) {
|
||||
NotificationSettings settings;
|
||||
File* file = storage_file_alloc(furi_record_open(RECORD_STORAGE));
|
||||
const size_t settings_size = sizeof(NotificationSettings);
|
||||
|
||||
FURI_LOG_I(TAG, "saving settings to \"%s\"", NOTIFICATION_SETTINGS_PATH);
|
||||
|
||||
furi_kernel_lock();
|
||||
memcpy(&settings, &app->settings, settings_size);
|
||||
furi_kernel_unlock();
|
||||
|
||||
bool fs_result =
|
||||
storage_file_open(file, NOTIFICATION_SETTINGS_PATH, FSAM_WRITE, FSOM_CREATE_ALWAYS);
|
||||
|
||||
if(fs_result) {
|
||||
uint16_t bytes_count = storage_file_write(file, &settings, settings_size);
|
||||
|
||||
if(bytes_count != settings_size) {
|
||||
fs_result = false;
|
||||
}
|
||||
}
|
||||
|
||||
if(fs_result) {
|
||||
FURI_LOG_I(TAG, "save success");
|
||||
} else {
|
||||
FURI_LOG_E(TAG, "save failed, %s", storage_file_get_error_desc(file));
|
||||
}
|
||||
|
||||
storage_file_close(file);
|
||||
storage_file_free(file);
|
||||
furi_record_close(RECORD_STORAGE);
|
||||
|
||||
return fs_result;
|
||||
};
|
||||
|
||||
static void input_event_callback(const void* value, void* context) {
|
||||
furi_assert(value);
|
||||
furi_assert(context);
|
||||
NotificationApp* app = context;
|
||||
notification_message(app, &sequence_display_backlight_on);
|
||||
}
|
||||
|
||||
// App alloc
|
||||
static NotificationApp* notification_app_alloc() {
|
||||
NotificationApp* app = malloc(sizeof(NotificationApp));
|
||||
app->queue = furi_message_queue_alloc(8, sizeof(NotificationAppMessage));
|
||||
app->display_timer = furi_timer_alloc(notification_display_timer, FuriTimerTypeOnce, app);
|
||||
|
||||
app->settings.speaker_volume = 1.0f;
|
||||
app->settings.display_brightness = 1.0f;
|
||||
app->settings.led_brightness = 1.0f;
|
||||
app->settings.display_off_delay_ms = 30000;
|
||||
app->settings.vibro_on = true;
|
||||
|
||||
app->display.value[LayerInternal] = 0x00;
|
||||
app->display.value[LayerNotification] = 0x00;
|
||||
app->display.index = LayerInternal;
|
||||
app->display.light = LightBacklight;
|
||||
|
||||
app->led[0].value[LayerInternal] = 0x00;
|
||||
app->led[0].value[LayerNotification] = 0x00;
|
||||
app->led[0].index = LayerInternal;
|
||||
app->led[0].light = LightRed;
|
||||
|
||||
app->led[1].value[LayerInternal] = 0x00;
|
||||
app->led[1].value[LayerNotification] = 0x00;
|
||||
app->led[1].index = LayerInternal;
|
||||
app->led[1].light = LightGreen;
|
||||
|
||||
app->led[2].value[LayerInternal] = 0x00;
|
||||
app->led[2].value[LayerNotification] = 0x00;
|
||||
app->led[2].index = LayerInternal;
|
||||
app->led[2].light = LightBlue;
|
||||
|
||||
app->settings.version = NOTIFICATION_SETTINGS_VERSION;
|
||||
|
||||
// display backlight control
|
||||
app->event_record = furi_record_open(RECORD_INPUT_EVENTS);
|
||||
furi_pubsub_subscribe(app->event_record, input_event_callback, app);
|
||||
notification_message(app, &sequence_display_backlight_on);
|
||||
|
||||
return app;
|
||||
};
|
||||
|
||||
// App
|
||||
int32_t notification_srv(void* p) {
|
||||
UNUSED(p);
|
||||
NotificationApp* app = notification_app_alloc();
|
||||
|
||||
if(!notification_load_settings(app)) {
|
||||
notification_save_settings(app);
|
||||
}
|
||||
|
||||
notification_vibro_off();
|
||||
notification_sound_off();
|
||||
notification_apply_internal_led_layer(&app->display, 0x00);
|
||||
notification_apply_internal_led_layer(&app->led[0], 0x00);
|
||||
notification_apply_internal_led_layer(&app->led[1], 0x00);
|
||||
notification_apply_internal_led_layer(&app->led[2], 0x00);
|
||||
|
||||
furi_record_create(RECORD_NOTIFICATION, app);
|
||||
|
||||
NotificationAppMessage message;
|
||||
while(1) {
|
||||
furi_check(furi_message_queue_get(app->queue, &message, FuriWaitForever) == FuriStatusOk);
|
||||
|
||||
switch(message.type) {
|
||||
case NotificationLayerMessage:
|
||||
notification_process_notification_message(app, &message);
|
||||
break;
|
||||
case InternalLayerMessage:
|
||||
notification_process_internal_message(app, &message);
|
||||
break;
|
||||
case SaveSettingsMessage:
|
||||
notification_save_settings(app);
|
||||
break;
|
||||
}
|
||||
|
||||
if(message.back_event != NULL) {
|
||||
furi_event_flag_set(message.back_event, NOTIFICATION_EVENT_COMPLETE);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
};
|
59
applications/services/notification/notification_app.h
Normal file
59
applications/services/notification/notification_app.h
Normal file
@@ -0,0 +1,59 @@
|
||||
#include <furi.h>
|
||||
#include <furi_hal.h>
|
||||
#include "notification.h"
|
||||
#include "notification_messages.h"
|
||||
#include "notification_settings_filename.h"
|
||||
|
||||
#define NOTIFICATION_LED_COUNT 3
|
||||
#define NOTIFICATION_EVENT_COMPLETE 0x00000001U
|
||||
|
||||
typedef enum {
|
||||
NotificationLayerMessage,
|
||||
InternalLayerMessage,
|
||||
SaveSettingsMessage,
|
||||
} NotificationAppMessageType;
|
||||
|
||||
typedef struct {
|
||||
const NotificationSequence* sequence;
|
||||
NotificationAppMessageType type;
|
||||
FuriEventFlag* back_event;
|
||||
} NotificationAppMessage;
|
||||
|
||||
typedef enum {
|
||||
LayerInternal = 0,
|
||||
LayerNotification = 1,
|
||||
LayerMAX = 2,
|
||||
} NotificationLedLayerIndex;
|
||||
|
||||
typedef struct {
|
||||
uint8_t value_last[LayerMAX];
|
||||
uint8_t value[LayerMAX];
|
||||
NotificationLedLayerIndex index;
|
||||
Light light;
|
||||
} NotificationLedLayer;
|
||||
|
||||
#define NOTIFICATION_SETTINGS_VERSION 0x01
|
||||
#define NOTIFICATION_SETTINGS_PATH INT_PATH(NOTIFICATION_SETTINGS_FILE_NAME)
|
||||
|
||||
typedef struct {
|
||||
uint8_t version;
|
||||
float display_brightness;
|
||||
float led_brightness;
|
||||
float speaker_volume;
|
||||
uint32_t display_off_delay_ms;
|
||||
bool vibro_on;
|
||||
} NotificationSettings;
|
||||
|
||||
struct NotificationApp {
|
||||
FuriMessageQueue* queue;
|
||||
FuriPubSub* event_record;
|
||||
FuriTimer* display_timer;
|
||||
|
||||
NotificationLedLayer display;
|
||||
NotificationLedLayer led[NOTIFICATION_LED_COUNT];
|
||||
uint8_t display_led_lock;
|
||||
|
||||
NotificationSettings settings;
|
||||
};
|
||||
|
||||
void notification_message_save_settings(NotificationApp* app);
|
39
applications/services/notification/notification_app_api.c
Normal file
39
applications/services/notification/notification_app_api.c
Normal file
@@ -0,0 +1,39 @@
|
||||
#include <furi.h>
|
||||
#include <furi_hal.h>
|
||||
#include "notification.h"
|
||||
#include "notification_messages.h"
|
||||
#include "notification_app.h"
|
||||
|
||||
void notification_message(NotificationApp* app, const NotificationSequence* sequence) {
|
||||
NotificationAppMessage m = {
|
||||
.type = NotificationLayerMessage, .sequence = sequence, .back_event = NULL};
|
||||
furi_check(furi_message_queue_put(app->queue, &m, FuriWaitForever) == FuriStatusOk);
|
||||
};
|
||||
|
||||
void notification_internal_message(NotificationApp* app, const NotificationSequence* sequence) {
|
||||
NotificationAppMessage m = {
|
||||
.type = InternalLayerMessage, .sequence = sequence, .back_event = NULL};
|
||||
furi_check(furi_message_queue_put(app->queue, &m, FuriWaitForever) == FuriStatusOk);
|
||||
};
|
||||
|
||||
void notification_message_block(NotificationApp* app, const NotificationSequence* sequence) {
|
||||
NotificationAppMessage m = {
|
||||
.type = NotificationLayerMessage,
|
||||
.sequence = sequence,
|
||||
.back_event = furi_event_flag_alloc()};
|
||||
furi_check(furi_message_queue_put(app->queue, &m, FuriWaitForever) == FuriStatusOk);
|
||||
furi_event_flag_wait(
|
||||
m.back_event, NOTIFICATION_EVENT_COMPLETE, FuriFlagWaitAny, FuriWaitForever);
|
||||
furi_event_flag_free(m.back_event);
|
||||
};
|
||||
|
||||
void notification_internal_message_block(
|
||||
NotificationApp* app,
|
||||
const NotificationSequence* sequence) {
|
||||
NotificationAppMessage m = {
|
||||
.type = InternalLayerMessage, .sequence = sequence, .back_event = furi_event_flag_alloc()};
|
||||
furi_check(furi_message_queue_put(app->queue, &m, FuriWaitForever) == FuriStatusOk);
|
||||
furi_event_flag_wait(
|
||||
m.back_event, NOTIFICATION_EVENT_COMPLETE, FuriFlagWaitAny, FuriWaitForever);
|
||||
furi_event_flag_free(m.back_event);
|
||||
};
|
568
applications/services/notification/notification_messages.c
Normal file
568
applications/services/notification/notification_messages.c
Normal file
@@ -0,0 +1,568 @@
|
||||
#include "furi_hal_resources.h"
|
||||
#include "notification.h"
|
||||
#include "notification_messages_notes.h"
|
||||
#include <stddef.h>
|
||||
|
||||
/*********************************** Messages **********************************/
|
||||
|
||||
/** Display: backlight wakeup */
|
||||
const NotificationMessage message_display_backlight_on = {
|
||||
.type = NotificationMessageTypeLedDisplayBacklight,
|
||||
.data.led.value = 0xFF,
|
||||
};
|
||||
|
||||
/** Display: backlight force off */
|
||||
const NotificationMessage message_display_backlight_off = {
|
||||
.type = NotificationMessageTypeLedDisplayBacklight,
|
||||
.data.led.value = 0x00,
|
||||
};
|
||||
|
||||
/** Display: backlight always on */
|
||||
const NotificationMessage message_display_backlight_enforce_on = {
|
||||
.type = NotificationMessageTypeLedDisplayBacklightEnforceOn,
|
||||
.data.led.value = 0xFF,
|
||||
};
|
||||
|
||||
/** Display: automatic backlight management, with configured timeout */
|
||||
const NotificationMessage message_display_backlight_enforce_auto = {
|
||||
.type = NotificationMessageTypeLedDisplayBacklightEnforceAuto,
|
||||
.data.led.value = 0x00,
|
||||
};
|
||||
|
||||
// Led ON
|
||||
const NotificationMessage message_red_255 = {
|
||||
.type = NotificationMessageTypeLedRed,
|
||||
.data.led.value = 0xFF,
|
||||
};
|
||||
|
||||
const NotificationMessage message_green_255 = {
|
||||
.type = NotificationMessageTypeLedGreen,
|
||||
.data.led.value = 0xFF,
|
||||
};
|
||||
|
||||
const NotificationMessage message_blue_255 = {
|
||||
.type = NotificationMessageTypeLedBlue,
|
||||
.data.led.value = 0xFF,
|
||||
};
|
||||
|
||||
// Led OFF
|
||||
const NotificationMessage message_red_0 = {
|
||||
.type = NotificationMessageTypeLedRed,
|
||||
.data.led.value = 0x00,
|
||||
};
|
||||
|
||||
const NotificationMessage message_green_0 = {
|
||||
.type = NotificationMessageTypeLedGreen,
|
||||
.data.led.value = 0x00,
|
||||
};
|
||||
|
||||
const NotificationMessage message_blue_0 = {
|
||||
.type = NotificationMessageTypeLedBlue,
|
||||
.data.led.value = 0x00,
|
||||
};
|
||||
|
||||
const NotificationMessage message_blink_start_10 = {
|
||||
.type = NotificationMessageTypeLedBlinkStart,
|
||||
.data.led_blink.color = 0,
|
||||
.data.led_blink.on_time = 10,
|
||||
.data.led_blink.period = 100,
|
||||
};
|
||||
|
||||
const NotificationMessage message_blink_start_100 = {
|
||||
.type = NotificationMessageTypeLedBlinkStart,
|
||||
.data.led_blink.color = 0,
|
||||
.data.led_blink.on_time = 100,
|
||||
.data.led_blink.period = 1000,
|
||||
};
|
||||
|
||||
const NotificationMessage message_blink_stop = {
|
||||
.type = NotificationMessageTypeLedBlinkStop,
|
||||
};
|
||||
|
||||
const NotificationMessage message_blink_set_color_red = {
|
||||
.type = NotificationMessageTypeLedBlinkColor,
|
||||
.data.led_blink.color = LightRed,
|
||||
};
|
||||
|
||||
const NotificationMessage message_blink_set_color_green = {
|
||||
.type = NotificationMessageTypeLedBlinkColor,
|
||||
.data.led_blink.color = LightGreen,
|
||||
};
|
||||
|
||||
const NotificationMessage message_blink_set_color_blue = {
|
||||
.type = NotificationMessageTypeLedBlinkColor,
|
||||
.data.led_blink.color = LightBlue,
|
||||
};
|
||||
|
||||
const NotificationMessage message_blink_set_color_cyan = {
|
||||
.type = NotificationMessageTypeLedBlinkColor,
|
||||
.data.led_blink.color = LightBlue | LightGreen,
|
||||
};
|
||||
|
||||
const NotificationMessage message_blink_set_color_magenta = {
|
||||
.type = NotificationMessageTypeLedBlinkColor,
|
||||
.data.led_blink.color = LightBlue | LightRed,
|
||||
};
|
||||
|
||||
const NotificationMessage message_blink_set_color_yellow = {
|
||||
.type = NotificationMessageTypeLedBlinkColor,
|
||||
.data.led_blink.color = LightGreen | LightRed,
|
||||
};
|
||||
|
||||
const NotificationMessage message_blink_set_color_white = {
|
||||
.type = NotificationMessageTypeLedBlinkColor,
|
||||
.data.led_blink.color = LightRed | LightGreen | LightBlue,
|
||||
};
|
||||
|
||||
// Delay
|
||||
const NotificationMessage message_delay_1 = {
|
||||
.type = NotificationMessageTypeDelay,
|
||||
.data.delay.length = 1,
|
||||
};
|
||||
|
||||
const NotificationMessage message_delay_10 = {
|
||||
.type = NotificationMessageTypeDelay,
|
||||
.data.delay.length = 10,
|
||||
};
|
||||
|
||||
const NotificationMessage message_delay_25 = {
|
||||
.type = NotificationMessageTypeDelay,
|
||||
.data.delay.length = 25,
|
||||
};
|
||||
|
||||
const NotificationMessage message_delay_50 = {
|
||||
.type = NotificationMessageTypeDelay,
|
||||
.data.delay.length = 50,
|
||||
};
|
||||
|
||||
const NotificationMessage message_delay_100 = {
|
||||
.type = NotificationMessageTypeDelay,
|
||||
.data.delay.length = 100,
|
||||
};
|
||||
|
||||
const NotificationMessage message_delay_250 = {
|
||||
.type = NotificationMessageTypeDelay,
|
||||
.data.delay.length = 250,
|
||||
};
|
||||
|
||||
const NotificationMessage message_delay_500 = {
|
||||
.type = NotificationMessageTypeDelay,
|
||||
.data.delay.length = 500,
|
||||
};
|
||||
|
||||
const NotificationMessage message_delay_1000 = {
|
||||
.type = NotificationMessageTypeDelay,
|
||||
.data.delay.length = 1000,
|
||||
};
|
||||
|
||||
// Sound
|
||||
const NotificationMessage message_sound_off = {
|
||||
.type = NotificationMessageTypeSoundOff,
|
||||
};
|
||||
|
||||
// Vibro
|
||||
const NotificationMessage message_vibro_on = {
|
||||
.type = NotificationMessageTypeVibro,
|
||||
.data.vibro.on = true,
|
||||
};
|
||||
|
||||
const NotificationMessage message_vibro_off = {
|
||||
.type = NotificationMessageTypeVibro,
|
||||
.data.vibro.on = false,
|
||||
};
|
||||
|
||||
// Reset
|
||||
const NotificationMessage message_do_not_reset = {
|
||||
.type = NotificationMessageTypeDoNotReset,
|
||||
};
|
||||
|
||||
// Override user settings
|
||||
const NotificationMessage message_force_speaker_volume_setting_1f = {
|
||||
.type = NotificationMessageTypeForceSpeakerVolumeSetting,
|
||||
.data.forced_settings.speaker_volume = 1.0f,
|
||||
};
|
||||
|
||||
const NotificationMessage message_force_vibro_setting_on = {
|
||||
.type = NotificationMessageTypeForceVibroSetting,
|
||||
.data.forced_settings.vibro = true,
|
||||
};
|
||||
|
||||
const NotificationMessage message_force_vibro_setting_off = {
|
||||
.type = NotificationMessageTypeForceVibroSetting,
|
||||
.data.forced_settings.vibro = false,
|
||||
};
|
||||
|
||||
const NotificationMessage message_force_display_brightness_setting_1f = {
|
||||
.type = NotificationMessageTypeForceDisplayBrightnessSetting,
|
||||
.data.forced_settings.display_brightness = 1.0f,
|
||||
};
|
||||
|
||||
/****************************** Message sequences ******************************/
|
||||
|
||||
// Reset
|
||||
const NotificationSequence sequence_reset_red = {
|
||||
&message_red_0,
|
||||
NULL,
|
||||
};
|
||||
|
||||
const NotificationSequence sequence_reset_green = {
|
||||
&message_green_0,
|
||||
NULL,
|
||||
};
|
||||
|
||||
const NotificationSequence sequence_reset_blue = {
|
||||
&message_blue_0,
|
||||
NULL,
|
||||
};
|
||||
|
||||
const NotificationSequence sequence_reset_rgb = {
|
||||
&message_red_0,
|
||||
&message_blue_0,
|
||||
&message_green_0,
|
||||
NULL,
|
||||
};
|
||||
|
||||
const NotificationSequence sequence_reset_display = {
|
||||
&message_display_backlight_off,
|
||||
NULL,
|
||||
};
|
||||
|
||||
const NotificationSequence sequence_reset_sound = {
|
||||
&message_sound_off,
|
||||
NULL,
|
||||
};
|
||||
|
||||
const NotificationSequence sequence_reset_vibro = {
|
||||
&message_vibro_off,
|
||||
NULL,
|
||||
};
|
||||
|
||||
// Vibro
|
||||
const NotificationSequence sequence_set_vibro_on = {
|
||||
&message_vibro_on,
|
||||
&message_do_not_reset,
|
||||
NULL,
|
||||
};
|
||||
|
||||
// Display
|
||||
const NotificationSequence sequence_display_backlight_on = {
|
||||
&message_display_backlight_on,
|
||||
NULL,
|
||||
};
|
||||
|
||||
const NotificationSequence sequence_display_backlight_off = {
|
||||
&message_display_backlight_off,
|
||||
NULL,
|
||||
};
|
||||
|
||||
/** Display: backlight always on lock */
|
||||
const NotificationSequence sequence_display_backlight_enforce_on = {
|
||||
&message_display_backlight_enforce_on,
|
||||
NULL,
|
||||
};
|
||||
|
||||
/** Display: backlight always on unlock */
|
||||
const NotificationSequence sequence_display_backlight_enforce_auto = {
|
||||
&message_display_backlight_enforce_auto,
|
||||
NULL,
|
||||
};
|
||||
|
||||
const NotificationSequence sequence_display_backlight_off_delay_1000 = {
|
||||
&message_delay_1000,
|
||||
&message_display_backlight_off,
|
||||
NULL,
|
||||
};
|
||||
|
||||
// Charging
|
||||
const NotificationSequence sequence_charging = {
|
||||
&message_red_255,
|
||||
&message_green_0,
|
||||
NULL,
|
||||
};
|
||||
|
||||
const NotificationSequence sequence_charged = {
|
||||
&message_green_255,
|
||||
&message_red_0,
|
||||
NULL,
|
||||
};
|
||||
|
||||
const NotificationSequence sequence_not_charging = {
|
||||
&message_red_0,
|
||||
&message_green_0,
|
||||
NULL,
|
||||
};
|
||||
|
||||
// Light up
|
||||
const NotificationSequence sequence_set_only_red_255 = {
|
||||
&message_red_255,
|
||||
&message_green_0,
|
||||
&message_blue_0,
|
||||
&message_do_not_reset,
|
||||
NULL,
|
||||
};
|
||||
|
||||
const NotificationSequence sequence_set_only_green_255 = {
|
||||
&message_red_0,
|
||||
&message_green_255,
|
||||
&message_blue_0,
|
||||
&message_do_not_reset,
|
||||
NULL,
|
||||
};
|
||||
|
||||
const NotificationSequence sequence_set_only_blue_255 = {
|
||||
&message_red_0,
|
||||
&message_green_0,
|
||||
&message_blue_255,
|
||||
&message_do_not_reset,
|
||||
NULL,
|
||||
};
|
||||
|
||||
const NotificationSequence sequence_set_red_255 = {
|
||||
&message_red_255,
|
||||
&message_do_not_reset,
|
||||
NULL,
|
||||
};
|
||||
|
||||
const NotificationSequence sequence_set_green_255 = {
|
||||
&message_green_255,
|
||||
&message_do_not_reset,
|
||||
NULL,
|
||||
};
|
||||
|
||||
const NotificationSequence sequence_set_blue_255 = {
|
||||
&message_blue_255,
|
||||
&message_do_not_reset,
|
||||
NULL,
|
||||
};
|
||||
|
||||
// Solid colors
|
||||
const NotificationSequence sequence_solid_yellow = {
|
||||
&message_red_255,
|
||||
&message_green_255,
|
||||
&message_blue_0,
|
||||
&message_do_not_reset,
|
||||
NULL,
|
||||
};
|
||||
|
||||
// Blink
|
||||
const NotificationSequence sequence_blink_blue_10 = {
|
||||
&message_blue_255,
|
||||
&message_delay_10,
|
||||
NULL,
|
||||
};
|
||||
|
||||
const NotificationSequence sequence_blink_red_10 = {
|
||||
&message_red_255,
|
||||
&message_delay_10,
|
||||
NULL,
|
||||
};
|
||||
|
||||
const NotificationSequence sequence_blink_green_10 = {
|
||||
&message_green_255,
|
||||
&message_delay_10,
|
||||
NULL,
|
||||
};
|
||||
|
||||
const NotificationSequence sequence_blink_yellow_10 = {
|
||||
&message_red_255,
|
||||
&message_green_255,
|
||||
&message_delay_10,
|
||||
NULL,
|
||||
};
|
||||
|
||||
const NotificationSequence sequence_blink_cyan_10 = {
|
||||
&message_green_255,
|
||||
&message_blue_255,
|
||||
&message_delay_10,
|
||||
NULL,
|
||||
};
|
||||
|
||||
const NotificationSequence sequence_blink_magenta_10 = {
|
||||
&message_red_255,
|
||||
&message_blue_255,
|
||||
&message_delay_10,
|
||||
NULL,
|
||||
};
|
||||
|
||||
const NotificationSequence sequence_blink_red_100 = {
|
||||
&message_red_255,
|
||||
&message_delay_100,
|
||||
NULL,
|
||||
};
|
||||
|
||||
const NotificationSequence sequence_blink_green_100 = {
|
||||
&message_green_255,
|
||||
&message_delay_100,
|
||||
NULL,
|
||||
};
|
||||
|
||||
const NotificationSequence sequence_blink_blue_100 = {
|
||||
&message_blue_255,
|
||||
&message_delay_100,
|
||||
NULL,
|
||||
};
|
||||
|
||||
const NotificationSequence sequence_blink_yellow_100 = {
|
||||
&message_red_255,
|
||||
&message_green_255,
|
||||
&message_delay_100,
|
||||
NULL,
|
||||
};
|
||||
|
||||
const NotificationSequence sequence_blink_cyan_100 = {
|
||||
&message_green_255,
|
||||
&message_blue_255,
|
||||
&message_delay_100,
|
||||
NULL,
|
||||
};
|
||||
|
||||
const NotificationSequence sequence_blink_magenta_100 = {
|
||||
&message_red_255,
|
||||
&message_blue_255,
|
||||
&message_delay_100,
|
||||
NULL,
|
||||
};
|
||||
|
||||
const NotificationSequence sequence_blink_white_100 = {
|
||||
&message_red_255,
|
||||
&message_green_255,
|
||||
&message_blue_255,
|
||||
&message_delay_100,
|
||||
NULL,
|
||||
};
|
||||
|
||||
// Hardware blink
|
||||
const NotificationSequence sequence_blink_start_blue = {
|
||||
&message_blink_start_10,
|
||||
&message_blink_set_color_blue,
|
||||
&message_do_not_reset,
|
||||
NULL,
|
||||
};
|
||||
|
||||
const NotificationSequence sequence_blink_start_red = {
|
||||
&message_blink_start_10,
|
||||
&message_blink_set_color_red,
|
||||
&message_do_not_reset,
|
||||
NULL,
|
||||
};
|
||||
|
||||
const NotificationSequence sequence_blink_start_green = {
|
||||
&message_blink_start_10,
|
||||
&message_blink_set_color_green,
|
||||
&message_do_not_reset,
|
||||
NULL,
|
||||
};
|
||||
|
||||
const NotificationSequence sequence_blink_start_yellow = {
|
||||
&message_blink_start_10,
|
||||
&message_blink_set_color_yellow,
|
||||
&message_do_not_reset,
|
||||
NULL,
|
||||
};
|
||||
|
||||
const NotificationSequence sequence_blink_start_cyan = {
|
||||
&message_blink_start_10,
|
||||
&message_blink_set_color_cyan,
|
||||
&message_do_not_reset,
|
||||
NULL,
|
||||
};
|
||||
|
||||
const NotificationSequence sequence_blink_start_magenta = {
|
||||
&message_blink_start_10,
|
||||
&message_blink_set_color_magenta,
|
||||
&message_do_not_reset,
|
||||
NULL,
|
||||
};
|
||||
|
||||
const NotificationSequence sequence_blink_stop = {
|
||||
&message_blink_stop,
|
||||
NULL,
|
||||
};
|
||||
|
||||
//General
|
||||
const NotificationSequence sequence_single_vibro = {
|
||||
&message_vibro_on,
|
||||
&message_delay_100,
|
||||
&message_vibro_off,
|
||||
NULL,
|
||||
};
|
||||
|
||||
const NotificationSequence sequence_double_vibro = {
|
||||
&message_vibro_on,
|
||||
&message_delay_100,
|
||||
&message_vibro_off,
|
||||
&message_delay_100,
|
||||
&message_vibro_on,
|
||||
&message_delay_100,
|
||||
&message_vibro_off,
|
||||
NULL,
|
||||
};
|
||||
|
||||
const NotificationSequence sequence_success = {
|
||||
&message_display_backlight_on,
|
||||
&message_green_255,
|
||||
&message_vibro_on,
|
||||
&message_note_c5,
|
||||
&message_delay_50,
|
||||
&message_vibro_off,
|
||||
&message_note_e5,
|
||||
&message_delay_50,
|
||||
&message_note_g5,
|
||||
&message_delay_50,
|
||||
&message_note_c6,
|
||||
&message_delay_50,
|
||||
&message_sound_off,
|
||||
NULL,
|
||||
};
|
||||
|
||||
const NotificationSequence sequence_error = {
|
||||
&message_display_backlight_on,
|
||||
&message_red_255,
|
||||
&message_vibro_on,
|
||||
&message_note_c5,
|
||||
&message_delay_100,
|
||||
&message_vibro_off,
|
||||
&message_sound_off,
|
||||
&message_delay_100,
|
||||
&message_vibro_on,
|
||||
&message_note_c5,
|
||||
&message_delay_100,
|
||||
&message_vibro_off,
|
||||
&message_sound_off,
|
||||
NULL,
|
||||
};
|
||||
|
||||
const NotificationSequence sequence_audiovisual_alert = {
|
||||
&message_force_speaker_volume_setting_1f,
|
||||
&message_force_vibro_setting_on,
|
||||
&message_force_display_brightness_setting_1f,
|
||||
&message_vibro_on,
|
||||
|
||||
&message_display_backlight_on,
|
||||
&message_note_c7,
|
||||
&message_delay_250,
|
||||
|
||||
&message_display_backlight_off,
|
||||
&message_note_c4,
|
||||
&message_delay_250,
|
||||
|
||||
&message_display_backlight_on,
|
||||
&message_note_c7,
|
||||
&message_delay_250,
|
||||
|
||||
&message_display_backlight_off,
|
||||
&message_note_c4,
|
||||
&message_delay_250,
|
||||
|
||||
&message_display_backlight_on,
|
||||
&message_note_c7,
|
||||
&message_delay_250,
|
||||
|
||||
&message_display_backlight_off,
|
||||
&message_note_c4,
|
||||
&message_delay_250,
|
||||
|
||||
&message_sound_off,
|
||||
&message_vibro_off,
|
||||
NULL,
|
||||
};
|
143
applications/services/notification/notification_messages.h
Normal file
143
applications/services/notification/notification_messages.h
Normal file
@@ -0,0 +1,143 @@
|
||||
#pragma once
|
||||
#include "notification.h"
|
||||
#include "notification_messages_notes.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*********************************** Messages **********************************/
|
||||
|
||||
// Display
|
||||
extern const NotificationMessage message_display_backlight_on;
|
||||
extern const NotificationMessage message_display_backlight_off;
|
||||
extern const NotificationMessage message_display_backlight_enforce_on;
|
||||
extern const NotificationMessage message_display_backlight_enforce_auto;
|
||||
|
||||
// Led ON
|
||||
extern const NotificationMessage message_red_255;
|
||||
extern const NotificationMessage message_green_255;
|
||||
extern const NotificationMessage message_blue_255;
|
||||
|
||||
// Led OFF
|
||||
extern const NotificationMessage message_red_0;
|
||||
extern const NotificationMessage message_green_0;
|
||||
extern const NotificationMessage message_blue_0;
|
||||
|
||||
// Led hardware blink control
|
||||
extern const NotificationMessage message_blink_start_10;
|
||||
extern const NotificationMessage message_blink_start_100;
|
||||
extern const NotificationMessage message_blink_stop;
|
||||
|
||||
extern const NotificationMessage message_blink_set_color_red;
|
||||
extern const NotificationMessage message_blink_set_color_green;
|
||||
extern const NotificationMessage message_blink_set_color_blue;
|
||||
extern const NotificationMessage message_blink_set_color_cyan;
|
||||
extern const NotificationMessage message_blink_set_color_magenta;
|
||||
extern const NotificationMessage message_blink_set_color_yellow;
|
||||
extern const NotificationMessage message_blink_set_color_white;
|
||||
|
||||
// Delay
|
||||
extern const NotificationMessage message_delay_1;
|
||||
extern const NotificationMessage message_delay_10;
|
||||
extern const NotificationMessage message_delay_25;
|
||||
extern const NotificationMessage message_delay_50;
|
||||
extern const NotificationMessage message_delay_100;
|
||||
extern const NotificationMessage message_delay_250;
|
||||
extern const NotificationMessage message_delay_500;
|
||||
extern const NotificationMessage message_delay_1000;
|
||||
|
||||
// Sound
|
||||
extern const NotificationMessage message_sound_off;
|
||||
|
||||
// Vibro
|
||||
extern const NotificationMessage message_vibro_on;
|
||||
extern const NotificationMessage message_vibro_off;
|
||||
|
||||
// Reset
|
||||
extern const NotificationMessage message_do_not_reset;
|
||||
|
||||
// Override user settings
|
||||
extern const NotificationMessage message_force_speaker_volume_setting_1f;
|
||||
extern const NotificationMessage message_force_vibro_setting_on;
|
||||
extern const NotificationMessage message_force_vibro_setting_off;
|
||||
extern const NotificationMessage message_force_display_brightness_setting_1f;
|
||||
|
||||
/****************************** Message sequences ******************************/
|
||||
|
||||
// Reset
|
||||
extern const NotificationSequence sequence_reset_red;
|
||||
extern const NotificationSequence sequence_reset_green;
|
||||
extern const NotificationSequence sequence_reset_blue;
|
||||
extern const NotificationSequence sequence_reset_rgb;
|
||||
extern const NotificationSequence sequence_reset_display;
|
||||
extern const NotificationSequence sequence_reset_sound;
|
||||
extern const NotificationSequence sequence_reset_vibro;
|
||||
|
||||
// Vibro
|
||||
extern const NotificationSequence sequence_set_vibro_on;
|
||||
|
||||
// Display
|
||||
/** Display: backlight wakeup */
|
||||
extern const NotificationSequence sequence_display_backlight_on;
|
||||
/** Display: backlight force off */
|
||||
extern const NotificationSequence sequence_display_backlight_off;
|
||||
/** Display: backlight force off after a delay of 1000ms */
|
||||
extern const NotificationSequence sequence_display_backlight_off_delay_1000;
|
||||
|
||||
/** Display: backlight always on lock */
|
||||
extern const NotificationSequence sequence_display_backlight_enforce_on;
|
||||
/** Display: backlight always on unlock */
|
||||
extern const NotificationSequence sequence_display_backlight_enforce_auto;
|
||||
|
||||
// Charging
|
||||
extern const NotificationSequence sequence_charging;
|
||||
extern const NotificationSequence sequence_charged;
|
||||
extern const NotificationSequence sequence_not_charging;
|
||||
|
||||
// Light up
|
||||
extern const NotificationSequence sequence_set_only_red_255;
|
||||
extern const NotificationSequence sequence_set_only_green_255;
|
||||
extern const NotificationSequence sequence_set_only_blue_255;
|
||||
extern const NotificationSequence sequence_set_red_255;
|
||||
extern const NotificationSequence sequence_set_green_255;
|
||||
extern const NotificationSequence sequence_set_blue_255;
|
||||
|
||||
// Solid colors
|
||||
extern const NotificationSequence sequence_solid_yellow;
|
||||
|
||||
// Blink
|
||||
extern const NotificationSequence sequence_blink_blue_10;
|
||||
extern const NotificationSequence sequence_blink_red_10;
|
||||
extern const NotificationSequence sequence_blink_green_10;
|
||||
extern const NotificationSequence sequence_blink_yellow_10;
|
||||
extern const NotificationSequence sequence_blink_cyan_10;
|
||||
extern const NotificationSequence sequence_blink_magenta_10;
|
||||
|
||||
extern const NotificationSequence sequence_blink_red_100;
|
||||
extern const NotificationSequence sequence_blink_green_100;
|
||||
extern const NotificationSequence sequence_blink_blue_100;
|
||||
extern const NotificationSequence sequence_blink_yellow_100;
|
||||
extern const NotificationSequence sequence_blink_cyan_100;
|
||||
extern const NotificationSequence sequence_blink_magenta_100;
|
||||
extern const NotificationSequence sequence_blink_white_100;
|
||||
|
||||
// Hardware blink
|
||||
extern const NotificationSequence sequence_blink_start_blue;
|
||||
extern const NotificationSequence sequence_blink_start_red;
|
||||
extern const NotificationSequence sequence_blink_start_green;
|
||||
extern const NotificationSequence sequence_blink_start_yellow;
|
||||
extern const NotificationSequence sequence_blink_start_cyan;
|
||||
extern const NotificationSequence sequence_blink_start_magenta;
|
||||
extern const NotificationSequence sequence_blink_stop;
|
||||
|
||||
// General
|
||||
extern const NotificationSequence sequence_single_vibro;
|
||||
extern const NotificationSequence sequence_double_vibro;
|
||||
extern const NotificationSequence sequence_success;
|
||||
extern const NotificationSequence sequence_error;
|
||||
extern const NotificationSequence sequence_audiovisual_alert;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
573
applications/services/notification/notification_messages_notes.c
Normal file
573
applications/services/notification/notification_messages_notes.c
Normal file
@@ -0,0 +1,573 @@
|
||||
#include "notification.h"
|
||||
|
||||
/*
|
||||
Python script for note messages generation
|
||||
|
||||
# coding: utf-8
|
||||
# Python script for note messages generation
|
||||
from typing import List
|
||||
|
||||
note_names: List = ['c', 'cs', 'd', 'ds', 'e', 'f', 'fs', 'g', 'gs', 'a', 'as', 'b']
|
||||
base_note: float = 16.3515979
|
||||
cf: float = 2 ** (1.0 / 12)
|
||||
|
||||
note: float = base_note
|
||||
for octave in range(9):
|
||||
for name in note_names:
|
||||
print(f"const NotificationMessage message_note_{name}{octave}" + " = {\n"
|
||||
"\t.type = NotificationMessageTypeSoundOn,\n"
|
||||
f"\t.data.sound.frequency = {round(note, 2)}f,\n"
|
||||
"\t.data.sound.volume = 1.0f,\n"
|
||||
"};")
|
||||
note = note * cf
|
||||
|
||||
for octave in range(9):
|
||||
for name in note_names:
|
||||
print(f"extern const NotificationMessage message_note_{name}{octave};")
|
||||
*/
|
||||
|
||||
const NotificationMessage message_click = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 1.0f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_c0 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 16.35f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_cs0 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 17.32f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_d0 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 18.35f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_ds0 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 19.45f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_e0 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 20.6f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_f0 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 21.83f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_fs0 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 23.12f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_g0 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 24.5f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_gs0 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 25.96f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_a0 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 27.5f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_as0 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 29.14f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_b0 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 30.87f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_c1 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 32.7f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_cs1 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 34.65f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_d1 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 36.71f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_ds1 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 38.89f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_e1 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 41.2f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_f1 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 43.65f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_fs1 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 46.25f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_g1 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 49.0f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_gs1 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 51.91f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_a1 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 55.0f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_as1 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 58.27f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_b1 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 61.74f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_c2 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 65.41f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_cs2 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 69.3f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_d2 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 73.42f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_ds2 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 77.78f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_e2 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 82.41f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_f2 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 87.31f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_fs2 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 92.5f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_g2 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 98.0f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_gs2 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 103.83f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_a2 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 110.0f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_as2 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 116.54f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_b2 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 123.47f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_c3 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 130.81f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_cs3 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 138.59f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_d3 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 146.83f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_ds3 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 155.56f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_e3 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 164.81f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_f3 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 174.61f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_fs3 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 185.0f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_g3 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 196.0f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_gs3 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 207.65f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_a3 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 220.0f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_as3 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 233.08f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_b3 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 246.94f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_c4 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 261.63f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_cs4 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 277.18f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_d4 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 293.66f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_ds4 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 311.13f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_e4 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 329.63f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_f4 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 349.23f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_fs4 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 369.99f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_g4 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 392.0f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_gs4 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 415.3f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_a4 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 440.0f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_as4 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 466.16f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_b4 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 493.88f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_c5 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 523.25f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_cs5 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 554.37f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_d5 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 587.33f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_ds5 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 622.25f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_e5 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 659.26f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_f5 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 698.46f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_fs5 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 739.99f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_g5 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 783.99f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_gs5 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 830.61f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_a5 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 880.0f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_as5 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 932.33f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_b5 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 987.77f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_c6 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 1046.5f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_cs6 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 1108.73f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_d6 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 1174.66f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_ds6 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 1244.51f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_e6 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 1318.51f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_f6 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 1396.91f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_fs6 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 1479.98f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_g6 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 1567.98f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_gs6 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 1661.22f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_a6 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 1760.0f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_as6 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 1864.66f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_b6 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 1975.53f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_c7 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 2093.0f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_cs7 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 2217.46f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_d7 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 2349.32f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_ds7 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 2489.02f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_e7 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 2637.02f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_f7 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 2793.83f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_fs7 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 2959.96f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_g7 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 3135.96f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_gs7 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 3322.44f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_a7 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 3520.0f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_as7 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 3729.31f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_b7 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 3951.07f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_c8 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 4186.01f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_cs8 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 4434.92f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_d8 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 4698.64f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_ds8 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 4978.03f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_e8 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 5274.04f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_f8 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 5587.65f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_fs8 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 5919.91f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_g8 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 6271.93f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_gs8 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 6644.88f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_a8 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 7040.0f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_as8 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 7458.62f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
||||
const NotificationMessage message_note_b8 = {
|
||||
.type = NotificationMessageTypeSoundOn,
|
||||
.data.sound.frequency = 7902.13f,
|
||||
.data.sound.volume = 1.0f,
|
||||
};
|
120
applications/services/notification/notification_messages_notes.h
Normal file
120
applications/services/notification/notification_messages_notes.h
Normal file
@@ -0,0 +1,120 @@
|
||||
#pragma once
|
||||
#include "notification.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern const NotificationMessage message_click;
|
||||
extern const NotificationMessage message_note_c0;
|
||||
extern const NotificationMessage message_note_cs0;
|
||||
extern const NotificationMessage message_note_d0;
|
||||
extern const NotificationMessage message_note_ds0;
|
||||
extern const NotificationMessage message_note_e0;
|
||||
extern const NotificationMessage message_note_f0;
|
||||
extern const NotificationMessage message_note_fs0;
|
||||
extern const NotificationMessage message_note_g0;
|
||||
extern const NotificationMessage message_note_gs0;
|
||||
extern const NotificationMessage message_note_a0;
|
||||
extern const NotificationMessage message_note_as0;
|
||||
extern const NotificationMessage message_note_b0;
|
||||
extern const NotificationMessage message_note_c1;
|
||||
extern const NotificationMessage message_note_cs1;
|
||||
extern const NotificationMessage message_note_d1;
|
||||
extern const NotificationMessage message_note_ds1;
|
||||
extern const NotificationMessage message_note_e1;
|
||||
extern const NotificationMessage message_note_f1;
|
||||
extern const NotificationMessage message_note_fs1;
|
||||
extern const NotificationMessage message_note_g1;
|
||||
extern const NotificationMessage message_note_gs1;
|
||||
extern const NotificationMessage message_note_a1;
|
||||
extern const NotificationMessage message_note_as1;
|
||||
extern const NotificationMessage message_note_b1;
|
||||
extern const NotificationMessage message_note_c2;
|
||||
extern const NotificationMessage message_note_cs2;
|
||||
extern const NotificationMessage message_note_d2;
|
||||
extern const NotificationMessage message_note_ds2;
|
||||
extern const NotificationMessage message_note_e2;
|
||||
extern const NotificationMessage message_note_f2;
|
||||
extern const NotificationMessage message_note_fs2;
|
||||
extern const NotificationMessage message_note_g2;
|
||||
extern const NotificationMessage message_note_gs2;
|
||||
extern const NotificationMessage message_note_a2;
|
||||
extern const NotificationMessage message_note_as2;
|
||||
extern const NotificationMessage message_note_b2;
|
||||
extern const NotificationMessage message_note_c3;
|
||||
extern const NotificationMessage message_note_cs3;
|
||||
extern const NotificationMessage message_note_d3;
|
||||
extern const NotificationMessage message_note_ds3;
|
||||
extern const NotificationMessage message_note_e3;
|
||||
extern const NotificationMessage message_note_f3;
|
||||
extern const NotificationMessage message_note_fs3;
|
||||
extern const NotificationMessage message_note_g3;
|
||||
extern const NotificationMessage message_note_gs3;
|
||||
extern const NotificationMessage message_note_a3;
|
||||
extern const NotificationMessage message_note_as3;
|
||||
extern const NotificationMessage message_note_b3;
|
||||
extern const NotificationMessage message_note_c4;
|
||||
extern const NotificationMessage message_note_cs4;
|
||||
extern const NotificationMessage message_note_d4;
|
||||
extern const NotificationMessage message_note_ds4;
|
||||
extern const NotificationMessage message_note_e4;
|
||||
extern const NotificationMessage message_note_f4;
|
||||
extern const NotificationMessage message_note_fs4;
|
||||
extern const NotificationMessage message_note_g4;
|
||||
extern const NotificationMessage message_note_gs4;
|
||||
extern const NotificationMessage message_note_a4;
|
||||
extern const NotificationMessage message_note_as4;
|
||||
extern const NotificationMessage message_note_b4;
|
||||
extern const NotificationMessage message_note_c5;
|
||||
extern const NotificationMessage message_note_cs5;
|
||||
extern const NotificationMessage message_note_d5;
|
||||
extern const NotificationMessage message_note_ds5;
|
||||
extern const NotificationMessage message_note_e5;
|
||||
extern const NotificationMessage message_note_f5;
|
||||
extern const NotificationMessage message_note_fs5;
|
||||
extern const NotificationMessage message_note_g5;
|
||||
extern const NotificationMessage message_note_gs5;
|
||||
extern const NotificationMessage message_note_a5;
|
||||
extern const NotificationMessage message_note_as5;
|
||||
extern const NotificationMessage message_note_b5;
|
||||
extern const NotificationMessage message_note_c6;
|
||||
extern const NotificationMessage message_note_cs6;
|
||||
extern const NotificationMessage message_note_d6;
|
||||
extern const NotificationMessage message_note_ds6;
|
||||
extern const NotificationMessage message_note_e6;
|
||||
extern const NotificationMessage message_note_f6;
|
||||
extern const NotificationMessage message_note_fs6;
|
||||
extern const NotificationMessage message_note_g6;
|
||||
extern const NotificationMessage message_note_gs6;
|
||||
extern const NotificationMessage message_note_a6;
|
||||
extern const NotificationMessage message_note_as6;
|
||||
extern const NotificationMessage message_note_b6;
|
||||
extern const NotificationMessage message_note_c7;
|
||||
extern const NotificationMessage message_note_cs7;
|
||||
extern const NotificationMessage message_note_d7;
|
||||
extern const NotificationMessage message_note_ds7;
|
||||
extern const NotificationMessage message_note_e7;
|
||||
extern const NotificationMessage message_note_f7;
|
||||
extern const NotificationMessage message_note_fs7;
|
||||
extern const NotificationMessage message_note_g7;
|
||||
extern const NotificationMessage message_note_gs7;
|
||||
extern const NotificationMessage message_note_a7;
|
||||
extern const NotificationMessage message_note_as7;
|
||||
extern const NotificationMessage message_note_b7;
|
||||
extern const NotificationMessage message_note_c8;
|
||||
extern const NotificationMessage message_note_cs8;
|
||||
extern const NotificationMessage message_note_d8;
|
||||
extern const NotificationMessage message_note_ds8;
|
||||
extern const NotificationMessage message_note_e8;
|
||||
extern const NotificationMessage message_note_f8;
|
||||
extern const NotificationMessage message_note_fs8;
|
||||
extern const NotificationMessage message_note_g8;
|
||||
extern const NotificationMessage message_note_gs8;
|
||||
extern const NotificationMessage message_note_a8;
|
||||
extern const NotificationMessage message_note_as8;
|
||||
extern const NotificationMessage message_note_b8;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
@@ -0,0 +1,3 @@
|
||||
#pragma once
|
||||
|
||||
#define NOTIFICATION_SETTINGS_FILE_NAME ".notification.settings"
|
Reference in New Issue
Block a user