samples: microbit/pong: Add basic sound support
Add beeps whenever the ball hits the walls or the paddle. Requires a piezo buzzer connected to pin 0. Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
This commit is contained in:
parent
5e59f13ca3
commit
9e2fb2f3ad
2 changed files with 48 additions and 0 deletions
|
@ -6,3 +6,5 @@ CONFIG_BLUETOOTH_GATT_DYNAMIC_DB=y
|
||||||
CONFIG_BLUETOOTH_DEVICE_NAME="Zephyr Pong"
|
CONFIG_BLUETOOTH_DEVICE_NAME="Zephyr Pong"
|
||||||
CONFIG_GPIO=y
|
CONFIG_GPIO=y
|
||||||
CONFIG_MICROBIT_DISPLAY=y
|
CONFIG_MICROBIT_DISPLAY=y
|
||||||
|
CONFIG_PWM=y
|
||||||
|
CONFIG_PWM_NRF5_SW=y
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
#include <gpio.h>
|
#include <gpio.h>
|
||||||
#include <device.h>
|
#include <device.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <pwm.h>
|
||||||
|
|
||||||
#include <display/mb_display.h>
|
#include <display/mb_display.h>
|
||||||
|
|
||||||
|
@ -103,6 +104,40 @@ static struct x_y ball_vel = { 0, 0 };
|
||||||
static s64_t a_timestamp;
|
static s64_t a_timestamp;
|
||||||
static s64_t b_timestamp;
|
static s64_t b_timestamp;
|
||||||
|
|
||||||
|
#define SOUND_PIN EXT_P0_GPIO_PIN
|
||||||
|
#define SOUND_PERIOD_PADDLE 200
|
||||||
|
#define SOUND_PERIOD_WALL 1000
|
||||||
|
|
||||||
|
static struct device *pwm;
|
||||||
|
|
||||||
|
static enum sound_state {
|
||||||
|
SOUND_IDLE, /* No sound */
|
||||||
|
SOUND_PADDLE, /* Ball has hit the paddle */
|
||||||
|
SOUND_WALL, /* Ball has hit a wall */
|
||||||
|
} sound_state;
|
||||||
|
|
||||||
|
static inline void beep(int period)
|
||||||
|
{
|
||||||
|
pwm_pin_set_usec(pwm, SOUND_PIN, period, period / 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void sound_set(enum sound_state state)
|
||||||
|
{
|
||||||
|
switch (state) {
|
||||||
|
case SOUND_IDLE:
|
||||||
|
beep(0);
|
||||||
|
break;
|
||||||
|
case SOUND_PADDLE:
|
||||||
|
beep(SOUND_PERIOD_PADDLE);
|
||||||
|
break;
|
||||||
|
case SOUND_WALL:
|
||||||
|
beep(SOUND_PERIOD_WALL);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
sound_state = state;
|
||||||
|
}
|
||||||
|
|
||||||
static void pong_select(const struct pong_selection *sel)
|
static void pong_select(const struct pong_selection *sel)
|
||||||
{
|
{
|
||||||
struct mb_display *disp = mb_display_get();
|
struct mb_display *disp = mb_display_get();
|
||||||
|
@ -260,6 +295,10 @@ static void game_ended(bool won)
|
||||||
|
|
||||||
static void game_refresh(struct k_work *work)
|
static void game_refresh(struct k_work *work)
|
||||||
{
|
{
|
||||||
|
if (sound_state != SOUND_IDLE) {
|
||||||
|
sound_set(SOUND_IDLE);
|
||||||
|
}
|
||||||
|
|
||||||
if (ended) {
|
if (ended) {
|
||||||
game_init(state == SINGLE || remote_lost);
|
game_init(state == SINGLE || remote_lost);
|
||||||
k_sem_give(&disp_update);
|
k_sem_give(&disp_update);
|
||||||
|
@ -274,6 +313,7 @@ static void game_refresh(struct k_work *work)
|
||||||
if (state == SINGLE) {
|
if (state == SINGLE) {
|
||||||
ball_pos.y = -ball_pos.y;
|
ball_pos.y = -ball_pos.y;
|
||||||
ball_vel.y = -ball_vel.y;
|
ball_vel.y = -ball_vel.y;
|
||||||
|
sound_set(SOUND_WALL);
|
||||||
} else {
|
} else {
|
||||||
ble_send_ball(BALL_POS_X_MAX - ball_pos.x, ball_pos.y,
|
ble_send_ball(BALL_POS_X_MAX - ball_pos.x, ball_pos.y,
|
||||||
-ball_vel.x, -ball_vel.y);
|
-ball_vel.x, -ball_vel.y);
|
||||||
|
@ -286,9 +326,11 @@ static void game_refresh(struct k_work *work)
|
||||||
if (ball_pos.x < BALL_POS_X_MIN) {
|
if (ball_pos.x < BALL_POS_X_MIN) {
|
||||||
ball_pos.x = -ball_pos.x;
|
ball_pos.x = -ball_pos.x;
|
||||||
ball_vel.x = -ball_vel.x;
|
ball_vel.x = -ball_vel.x;
|
||||||
|
sound_set(SOUND_WALL);
|
||||||
} else if (ball_pos.x > BALL_POS_X_MAX) {
|
} else if (ball_pos.x > BALL_POS_X_MAX) {
|
||||||
ball_pos.x = (2 * BALL_POS_X_MAX) - ball_pos.x;
|
ball_pos.x = (2 * BALL_POS_X_MAX) - ball_pos.x;
|
||||||
ball_vel.x = -ball_vel.x;
|
ball_vel.x = -ball_vel.x;
|
||||||
|
sound_set(SOUND_WALL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Ball approaching paddle */
|
/* Ball approaching paddle */
|
||||||
|
@ -310,6 +352,8 @@ static void game_refresh(struct k_work *work)
|
||||||
}
|
}
|
||||||
|
|
||||||
ball_vel.y = -ball_vel.y;
|
ball_vel.y = -ball_vel.y;
|
||||||
|
|
||||||
|
sound_set(SOUND_PADDLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
k_delayed_work_submit(&refresh, GAME_REFRESH);
|
k_delayed_work_submit(&refresh, GAME_REFRESH);
|
||||||
|
@ -438,6 +482,8 @@ void main(void)
|
||||||
|
|
||||||
k_delayed_work_init(&refresh, game_refresh);
|
k_delayed_work_init(&refresh, game_refresh);
|
||||||
|
|
||||||
|
pwm = device_get_binding(CONFIG_PWM_NRF5_SW_0_DEV_NAME);
|
||||||
|
|
||||||
ble_init();
|
ble_init();
|
||||||
|
|
||||||
pong_select(&mode_selection);
|
pong_select(&mode_selection);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue