135 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			135 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#include <stdio.h>
 | 
						|
#include <string.h>
 | 
						|
#include "watch.h"
 | 
						|
 | 
						|
typedef struct ApplicationState {
 | 
						|
    bool play;
 | 
						|
} ApplicationState;
 | 
						|
 | 
						|
ApplicationState application_state;
 | 
						|
 | 
						|
 | 
						|
void cb_alarm_pressed(void) {
 | 
						|
    application_state.play = true;
 | 
						|
}
 | 
						|
 | 
						|
void app_init(void) {
 | 
						|
    memset(&application_state, 0, sizeof(application_state));
 | 
						|
}
 | 
						|
 | 
						|
void app_wake_from_backup(void) {
 | 
						|
}
 | 
						|
 | 
						|
void app_setup(void) {
 | 
						|
    watch_register_extwake_callback(BTN_ALARM, cb_alarm_pressed, true);
 | 
						|
 | 
						|
    watch_enable_display();
 | 
						|
 | 
						|
    watch_enable_buzzer();
 | 
						|
}
 | 
						|
 | 
						|
void app_prepare_for_standby(void) {
 | 
						|
    watch_display_string("  rains ", 2);
 | 
						|
}
 | 
						|
 | 
						|
void app_wake_from_standby(void) {
 | 
						|
}
 | 
						|
 | 
						|
bool app_loop(void) {
 | 
						|
    if (application_state.play) {
 | 
						|
        printf("Playing song...\n");
 | 
						|
        const BuzzerNote rains[] = {
 | 
						|
            BUZZER_NOTE_A4,
 | 
						|
            BUZZER_NOTE_F5,
 | 
						|
            BUZZER_NOTE_REST,
 | 
						|
            BUZZER_NOTE_A4,
 | 
						|
            BUZZER_NOTE_E5,
 | 
						|
            BUZZER_NOTE_REST,
 | 
						|
            BUZZER_NOTE_A4,
 | 
						|
            BUZZER_NOTE_F5,
 | 
						|
            BUZZER_NOTE_G5,
 | 
						|
            BUZZER_NOTE_E5,
 | 
						|
            BUZZER_NOTE_REST,
 | 
						|
            BUZZER_NOTE_A4,
 | 
						|
            BUZZER_NOTE_G5,
 | 
						|
            BUZZER_NOTE_F5,
 | 
						|
            BUZZER_NOTE_E5,
 | 
						|
            BUZZER_NOTE_D5,
 | 
						|
            BUZZER_NOTE_E5,
 | 
						|
            BUZZER_NOTE_REST,
 | 
						|
 | 
						|
            BUZZER_NOTE_A5,
 | 
						|
            BUZZER_NOTE_REST,
 | 
						|
            BUZZER_NOTE_A5,
 | 
						|
            BUZZER_NOTE_A5SHARP_B5FLAT,
 | 
						|
            BUZZER_NOTE_G5,
 | 
						|
            BUZZER_NOTE_REST,
 | 
						|
            BUZZER_NOTE_C5,
 | 
						|
            BUZZER_NOTE_A5,
 | 
						|
            BUZZER_NOTE_A5SHARP_B5FLAT,
 | 
						|
            BUZZER_NOTE_G5,
 | 
						|
            BUZZER_NOTE_REST,
 | 
						|
            BUZZER_NOTE_D5,
 | 
						|
            BUZZER_NOTE_A5SHARP_B5FLAT,
 | 
						|
            BUZZER_NOTE_A5,
 | 
						|
            BUZZER_NOTE_G5,
 | 
						|
            BUZZER_NOTE_F5,
 | 
						|
            BUZZER_NOTE_E5,
 | 
						|
        };
 | 
						|
        const uint16_t durations[] = {
 | 
						|
            200,
 | 
						|
            600,
 | 
						|
            100,
 | 
						|
            200,
 | 
						|
            600,
 | 
						|
            100,
 | 
						|
            200,
 | 
						|
            400,
 | 
						|
            400,
 | 
						|
            600,
 | 
						|
            100,
 | 
						|
            200,
 | 
						|
            400,
 | 
						|
            400,
 | 
						|
            400,
 | 
						|
            400,
 | 
						|
            800,
 | 
						|
            600,
 | 
						|
 | 
						|
            200,
 | 
						|
            50,
 | 
						|
            400,
 | 
						|
            200,
 | 
						|
            400,
 | 
						|
            100,
 | 
						|
            200,
 | 
						|
            400,
 | 
						|
            400,
 | 
						|
            400,
 | 
						|
            200,
 | 
						|
            200,
 | 
						|
            400,
 | 
						|
            400,
 | 
						|
            400,
 | 
						|
            400,
 | 
						|
            900,
 | 
						|
        };
 | 
						|
        application_state.play = false;
 | 
						|
        for(size_t i = 0; i < sizeof(rains); i++) {
 | 
						|
            char buf[9] = {0};
 | 
						|
            if (rains[i] == BUZZER_NOTE_REST) {
 | 
						|
                printf("rest for %d ms\n", durations[i]);
 | 
						|
                sprintf(buf, "%2drESt  ", i);
 | 
						|
            } else {
 | 
						|
                printf("playing note %2d: %3.0f Hz for %d ms\n", i, 1000000.0 / (float)NotePeriods[rains[i]], durations[i]);
 | 
						|
                sprintf(buf, "%2d%6d", i, NotePeriods[rains[i]]);
 | 
						|
            }
 | 
						|
            watch_display_string(buf, 2);
 | 
						|
            watch_buzzer_play_note(rains[i], durations[i]);
 | 
						|
        }
 | 
						|
        printf("done!\n\n");
 | 
						|
    }
 | 
						|
 | 
						|
    return true;
 | 
						|
}
 |