Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[CXRD-19] UI feedback on button press #7

Open
wants to merge 11 commits into
base: main
Choose a base branch
from
Open
1 change: 1 addition & 0 deletions .checkpatch.conf
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
--ignore FILE_PATH_CHANGES
--ignore PRINTK_WITHOUT_KERN_LEVEL
--ignore BRACES
--ignore UNDOCUMENTED_DT_STRING

--exclude patches
--exclude scm
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
.vscode
venv/
build*
temp
Expand Down
3 changes: 3 additions & 0 deletions app/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,7 @@ target_include_directories(app PRIVATE

target_sources(app PRIVATE
src/main.c
src/buzzer.c
src/ledui.c
src/user_button.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,
};
3 changes: 3 additions & 0 deletions app/prj.conf
Original file line number Diff line number Diff line change
@@ -1 +1,4 @@
CONFIG_LOG=y
CONFIG_PWM=y
CONFIG_USER_ALERTS=y
CONFIG_USER_BUTTON_ACTIONS=y
52 changes: 52 additions & 0 deletions app/src/buzzer.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
#include <zephyr/kernel.h>
#include <zephyr/logging/log.h>
#include <zephyr/drivers/pwm.h>
#include <user_alerts/user_alerts.h>
#include <user_button_actions/user_button_actions.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,
};

void buzzer_btn_action_handler(struct user_button_actions_channel *ch)
{
if (ch->result.code == eUSER_BUTTON_DOUBLE_CLICK) {
user_alerts_channel_play(&_buzzer_ch, &_croxel_inc_morse_beeps, true);
}
}

SLL_LISTENER_DEFINE_NODE(user_button_actions,
buzzer_btn_action_listener,
.handler = buzzer_btn_action_handler);

int play_bootup_buzzer_beeps(void)
{
SLL_LISTENER_ADD_NODE(user_button_actions, buzzer_btn_action_listener);
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);
122 changes: 122 additions & 0 deletions app/src/ledui.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
#include <zephyr/kernel.h>
#include <zephyr/logging/log.h>
#include <user_alerts/user_alerts.h>
#include <zephyr/drivers/gpio.h>
#include <user_button_actions/user_button_actions.h>

LOG_MODULE_REGISTER(ledui);

struct bi_led_io {
struct gpio_dt_spec led1;
struct gpio_dt_spec led2;
};

int bi_led_user_alerts_step_exec(const struct user_alerts_channel *ch, const void *step)
{
int err;
const struct bi_led_alert_step *b_step = step;
const struct bi_led_io *io = ch->io;

if (b_step) {
err = gpio_pin_set_dt(&io->led1, b_step->duty_1);
err = gpio_pin_set_dt(&io->led2, b_step->duty_2);
} else {
err = gpio_pin_set_dt(&io->led1, 0);
err = gpio_pin_set_dt(&io->led2, 0);
}
return err;
}

const struct bi_led_alert_step _bootup_bi_led_steps[] = {
{.ms = 250, .duty_1 = 0xFF, .duty_2 = 0x00},
{.ms = 250, .duty_1 = 0xFF, .duty_2 = 0xFF},
{.ms = 250, .duty_1 = 0x00, .duty_2 = 0xFF},
{.ms = 250, .duty_1 = 0x00, .duty_2 = 0x00},
{.ms = 250, .duty_1 = 0x00, .duty_2 = 0xFF},
{.ms = 250, .duty_1 = 0xFF, .duty_2 = 0xFF},
{.ms = 250, .duty_1 = 0xFF, .duty_2 = 0x00},
};
struct user_alerts_pattern _bootup_bi_led_pattern = {
.steps = _bootup_bi_led_steps,
.steps_count = ARRAY_SIZE(_bootup_bi_led_steps),
.loop_count = 4,
};

static const struct bi_led_io _bi_led_io = {
.led1 = GPIO_DT_SPEC_GET(DT_ALIAS(led0), gpios),
.led2 = GPIO_DT_SPEC_GET(DT_ALIAS(led1), gpios),
};

static struct user_alerts_channel _bi_led_ch = {
.step_size = sizeof(struct bi_led_alert_step),
.io = &_bi_led_io,
.exec = bi_led_user_alerts_step_exec,
.cur_step_idx = 0,
.cur_loop_idx = 0,
/*".timer" wil be init using api */
.pattern = NULL,
};

const struct bi_led_alert_step _btn_click_bi_led_steps[] = {
{.ms = 50, .duty_1 = 0xFF, .duty_2 = 0x00},
{.ms = 450, .duty_1 = 0x00, .duty_2 = 0x00},
{.ms = 50, .duty_1 = 0x00, .duty_2 = 0xFF},
{.ms = 450, .duty_1 = 0x00, .duty_2 = 0x00},
};
struct user_alerts_pattern _btn_click_bi_led_pattern = {
.steps = _btn_click_bi_led_steps,
.steps_count = ARRAY_SIZE(_btn_click_bi_led_steps),
.loop_count = 0,
};

void led_btn_action_handler(struct user_button_actions_channel *ch)
{
if (ch->result.code == eUSER_BUTTON_CLICK) {
if (_bi_led_ch.pattern == &_btn_click_bi_led_pattern) {
user_alerts_channel_stop(&_bi_led_ch, true);
} else {
user_alerts_channel_play(&_bi_led_ch, &_btn_click_bi_led_pattern, true);
}
}
}

SLL_LISTENER_DEFINE_NODE(user_button_actions,
led_btn_action_listener,
.handler = led_btn_action_handler);

int play_bootup_led_blinks(void)
{
int err;

SLL_LISTENER_ADD_NODE(user_button_actions, led_btn_action_listener);

err = gpio_is_ready_dt(&_bi_led_io.led1);
if (!err) {
LOG_ERR("Led1 is not ready");
return 0;
}

err = gpio_is_ready_dt(&_bi_led_io.led2);
if (!err) {
LOG_ERR("Led3 is not ready");
return 0;
}

err = gpio_pin_configure_dt(&_bi_led_io.led1, GPIO_OUTPUT_ACTIVE);
if (err) {
LOG_ERR("Led1 configuration error %d", err);
return 0;
}

err = gpio_pin_configure_dt(&_bi_led_io.led2, GPIO_OUTPUT_ACTIVE);
if (err) {
LOG_ERR("Led2 configuration error %d", err);
return 0;
}

user_alerts_channel_init_timer(&_bi_led_ch);
user_alerts_channel_play(&_bi_led_ch, &_bootup_bi_led_pattern, true);
return 0;
}

SYS_INIT(play_bootup_led_blinks, APPLICATION, 99);
27 changes: 14 additions & 13 deletions app/src/main.c
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
/*
* Copyright (c) 2012-2014 Wind River Systems, Inc.
*
* SPDX-License-Identifier: Apache-2.0
*/

#include <stdio.h>

int main(void)
{
printf("Hello World! %s\n", CONFIG_BOARD);
return 0;
}
/*
* Copyright (c) 2012-2014 Wind River Systems, Inc.
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/logging/log.h>

LOG_MODULE_REGISTER(main);

int main(void)
{
LOG_INF("Hello World! %s\n", CONFIG_BOARD);
return 0;
}
Loading