Skip to content

Commit

Permalink
[CXRD-17] Added bootup buzzer signal using User-Alerts
Browse files Browse the repository at this point in the history
- 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
cx-anuj-pathak committed Jul 30, 2024
1 parent 621b274 commit 5b7dbbe
Show file tree
Hide file tree
Showing 6 changed files with 268 additions and 0 deletions.
1 change: 1 addition & 0 deletions app/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,5 @@ target_include_directories(app PRIVATE

target_sources(app PRIVATE
src/main.c
src/buzzer.c
)
10 changes: 10 additions & 0 deletions app/boards/croxel_cx1825.overlay
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>;
};
};
152 changes: 152 additions & 0 deletions app/include/morse_beep_codes.h
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,
};
2 changes: 2 additions & 0 deletions app/prj.conf
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
CONFIG_LOG=y
CONFIG_PWM=y
CONFIG_USER_ALERTS=y
39 changes: 39 additions & 0 deletions app/src/buzzer.c
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);
64 changes: 64 additions & 0 deletions include/user_alerts/user_alerts.h
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_ */

0 comments on commit 5b7dbbe

Please sign in to comment.