-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[CXRD-17] Added bootup buzzer signal using User-Alerts
- generated "croxel inc" and "zephyr morse codes - user user-alerts to play "zephyr" morse code on bootup Signed-off-by: Anuj Pathak <[email protected]>
- Loading branch information
1 parent
621b274
commit 5b7dbbe
Showing
6 changed files
with
268 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -9,4 +9,5 @@ target_include_directories(app PRIVATE | |
|
||
target_sources(app PRIVATE | ||
src/main.c | ||
src/buzzer.c | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
/ { | ||
aliases { | ||
buzzer-pwm = &buzzer; | ||
}; | ||
|
||
buzzer: buzzer { | ||
compatible = "pwm-buzzer"; | ||
pwms = <&pwm0 0 PWM_HZ(4000) PWM_POLARITY_NORMAL>; | ||
}; | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,152 @@ | ||
#include <zephyr/sys/util.h> | ||
#include <user_alerts/user_alerts.h> | ||
|
||
#define MORSE_DAA_FREQ 4400 | ||
#define MORSE_DIT_FREQ 3600 | ||
#define MORSE_SPACE_FREQ 0 | ||
#define MORSE_TIME(S) ((S) * 100) | ||
|
||
/* morse beeper code array for "ZEPHYR" */ | ||
static const struct buzzer_alert_step _zephyr_morse_beep_steps[] = { | ||
/* morse encoded "Z" Char */ | ||
{.freq = MORSE_DAA_FREQ, .ms = MORSE_TIME(3)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_DAA_FREQ, .ms = MORSE_TIME(3)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(3)}, | ||
/* morse encoded "E" Char */ | ||
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(3)}, | ||
/* morse encoded "P" Char */ | ||
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_DAA_FREQ, .ms = MORSE_TIME(3)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_DAA_FREQ, .ms = MORSE_TIME(3)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(3)}, | ||
/* morse encoded "H" Char */ | ||
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(3)}, | ||
/* morse encoded "Y" Char */ | ||
{.freq = MORSE_DAA_FREQ, .ms = MORSE_TIME(3)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_DAA_FREQ, .ms = MORSE_TIME(3)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_DAA_FREQ, .ms = MORSE_TIME(3)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(3)}, | ||
/* morse encoded "R" Char */ | ||
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_DAA_FREQ, .ms = MORSE_TIME(3)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(3)}, | ||
}; | ||
|
||
static const struct user_alerts_pattern _zephyr_morse_beeps = { | ||
.steps = _zephyr_morse_beep_steps, | ||
.steps_count = ARRAY_SIZE(_zephyr_morse_beep_steps), | ||
.loop_count = 1, | ||
}; | ||
/* morse beeper code array for "CROXEL INC" */ | ||
static const struct buzzer_alert_step _croxel_inc_morse_beep_steps[] = { | ||
/* morse encoded "C" Char */ | ||
{.freq = MORSE_DAA_FREQ, .ms = MORSE_TIME(3)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_DAA_FREQ, .ms = MORSE_TIME(3)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(3)}, | ||
/* morse encoded "R" Char */ | ||
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_DAA_FREQ, .ms = MORSE_TIME(3)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(3)}, | ||
/* morse encoded "O" Char */ | ||
{.freq = MORSE_DAA_FREQ, .ms = MORSE_TIME(3)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_DAA_FREQ, .ms = MORSE_TIME(3)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_DAA_FREQ, .ms = MORSE_TIME(3)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(3)}, | ||
/* morse encoded "X" Char */ | ||
{.freq = MORSE_DAA_FREQ, .ms = MORSE_TIME(3)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_DAA_FREQ, .ms = MORSE_TIME(3)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(3)}, | ||
/* morse encoded "E" Char */ | ||
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(3)}, | ||
/* morse encoded "L" Char */ | ||
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_DAA_FREQ, .ms = MORSE_TIME(3)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(3)}, | ||
/* morse encoded word space */ | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(7)}, | ||
/* morse encoded "I" Char */ | ||
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(3)}, | ||
/* morse encoded "N" Char */ | ||
{.freq = MORSE_DAA_FREQ, .ms = MORSE_TIME(3)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(3)}, | ||
/* morse encoded "C" Char */ | ||
{.freq = MORSE_DAA_FREQ, .ms = MORSE_TIME(3)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_DAA_FREQ, .ms = MORSE_TIME(3)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)}, | ||
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(3)}, | ||
}; | ||
|
||
static const struct user_alerts_pattern _croxel_inc_morse_beeps = { | ||
.steps = _croxel_inc_morse_beep_steps, | ||
.steps_count = ARRAY_SIZE(_croxel_inc_morse_beep_steps), | ||
.loop_count = 1, | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1,3 @@ | ||
CONFIG_LOG=y | ||
CONFIG_PWM=y | ||
CONFIG_USER_ALERTS=y |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
#include <zephyr/kernel.h> | ||
#include <zephyr/logging/log.h> | ||
#include <zephyr/drivers/pwm.h> | ||
#include <user_alerts/user_alerts.h> | ||
#include <morse_beep_codes.h> | ||
|
||
LOG_MODULE_REGISTER(buzzer); | ||
|
||
int pwm_user_alerts_step_exec(const struct user_alerts_channel *ch, const void *step) | ||
{ | ||
int err; | ||
const struct buzzer_alert_step *b_step = step; | ||
const struct pwm_dt_spec *pwm = ch->io; | ||
|
||
err = (b_step && b_step->freq) | ||
? pwm_set_dt(pwm, PWM_HZ(b_step->freq), PWM_HZ(b_step->freq) / 2) | ||
: pwm_set_dt(pwm, PWM_HZ(4000), 0); | ||
return err; | ||
} | ||
|
||
static const struct pwm_dt_spec _buzzer_ch_pwm = PWM_DT_SPEC_GET(DT_NODELABEL(buzzer)); | ||
static struct user_alerts_channel _buzzer_ch = { | ||
.step_size = sizeof(struct buzzer_alert_step), | ||
.io = &_buzzer_ch_pwm, | ||
.exec = pwm_user_alerts_step_exec, | ||
.cur_step_idx = 0, | ||
.cur_loop_idx = 0, | ||
/*".timer" wil be init using api */ | ||
.pattern = NULL, | ||
}; | ||
|
||
int play_bootup_buzzer_beeps(void) | ||
{ | ||
user_alerts_channel_init_timer(&_buzzer_ch); | ||
user_alerts_channel_play(&_buzzer_ch, &_zephyr_morse_beeps, true); | ||
return 0; | ||
} | ||
|
||
SYS_INIT(play_bootup_buzzer_beeps, APPLICATION, 99); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,64 @@ | ||
#ifndef _USER_ALERTS_H_ | ||
#define _USER_ALERTS_H_ | ||
|
||
#include <stdint.h> | ||
#include <stdbool.h> | ||
#include <zephyr/kernel.h> | ||
|
||
struct alert_step { | ||
uint16_t ms; | ||
/* extends alert info here */ | ||
}; | ||
|
||
struct buzzer_alert_step { | ||
uint16_t ms; | ||
uint16_t freq; | ||
}; | ||
|
||
struct mono_led_alert_step { | ||
uint16_t ms; | ||
uint8_t duty; | ||
}; | ||
|
||
struct bi_led_alert_step { | ||
uint16_t ms; | ||
uint8_t duty_1; | ||
uint8_t duty_2; | ||
}; | ||
|
||
struct rgb_led_alert_step { | ||
uint16_t ms; | ||
uint8_t r; | ||
uint8_t g; | ||
uint8_t b; | ||
uint8_t _rsv; | ||
}; | ||
|
||
struct user_alerts_pattern { | ||
const void *steps; | ||
uint16_t steps_count; | ||
uint16_t loop_count; | ||
}; | ||
|
||
struct user_alerts_channel; | ||
typedef int (*user_alerts_step_exec)(const struct user_alerts_channel *ch, const void *step); | ||
|
||
struct user_alerts_channel { | ||
uint8_t step_size; | ||
const void *io; | ||
user_alerts_step_exec exec; | ||
uint16_t cur_step_idx; | ||
uint16_t cur_loop_idx; | ||
struct k_timer timer; | ||
const struct user_alerts_pattern *pattern; | ||
}; | ||
|
||
int user_alerts_channel_init_timer(struct user_alerts_channel *ch); | ||
|
||
int user_alerts_channel_play(struct user_alerts_channel *ch, | ||
const struct user_alerts_pattern *pattern, | ||
bool force); | ||
|
||
int user_alerts_channel_stop(struct user_alerts_channel *ch, bool force); | ||
|
||
#endif /* _USER_ALERTS_H_ */ |