[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