now with sidetone
This commit is contained in:
parent
c8ab1c7741
commit
10d56f8a8b
7 changed files with 63 additions and 1 deletions
|
@ -49,6 +49,7 @@ target_include_directories(pico_keyer PRIVATE
|
|||
target_link_libraries(pico_keyer
|
||||
hardware_flash
|
||||
hardware_exception
|
||||
hardware_pwm
|
||||
pico_flash
|
||||
)
|
||||
|
||||
|
|
|
@ -2,4 +2,5 @@ target_sources(pico_keyer PRIVATE
|
|||
pico_keyer.cpp
|
||||
settings.cpp
|
||||
keyer.cpp
|
||||
sidetone.cpp
|
||||
)
|
|
@ -3,11 +3,15 @@
|
|||
#include "pico/stdlib.h"
|
||||
|
||||
#include "keyer.h"
|
||||
#include "sidetone.h"
|
||||
|
||||
extern const uint LED_PIN;
|
||||
extern const uint LEFT_PADDLE_PIN;
|
||||
extern const uint RIGHT_PADDLE_PIN;
|
||||
|
||||
|
||||
const uint SIDETONE_FREQ = 622;
|
||||
|
||||
bool left_paddle_pressed()
|
||||
{
|
||||
if (!gpio_get(LEFT_PADDLE_PIN))
|
||||
|
@ -68,6 +72,7 @@ void Keyer::run()
|
|||
m_currentlyKeying = true;
|
||||
m_keying_until = make_timeout_time_us(m_elementDuration);
|
||||
gpio_put(LED_PIN, 1);
|
||||
m_Sidetone.on(SIDETONE_FREQ);
|
||||
m_lastSymbolWas = Symbol::Dit;
|
||||
}
|
||||
else
|
||||
|
@ -76,6 +81,7 @@ void Keyer::run()
|
|||
{
|
||||
m_currentlyKeying = false;
|
||||
gpio_put(LED_PIN, 0);
|
||||
m_Sidetone.off();
|
||||
m_previousState = State::Dit;
|
||||
state = State::InterCharSpace;
|
||||
}
|
||||
|
@ -87,6 +93,7 @@ void Keyer::run()
|
|||
m_currentlyKeying = true;
|
||||
m_keying_until = make_timeout_time_us(m_elementDuration * 3);
|
||||
gpio_put(LED_PIN, 1);
|
||||
m_Sidetone.on(SIDETONE_FREQ);
|
||||
m_lastSymbolWas = Symbol::Dah;
|
||||
}
|
||||
else
|
||||
|
@ -95,6 +102,7 @@ void Keyer::run()
|
|||
{
|
||||
m_currentlyKeying = false;
|
||||
gpio_put(LED_PIN, 0);
|
||||
m_Sidetone.off();
|
||||
m_previousState = State::Dah;
|
||||
state = State::InterCharSpace;
|
||||
}
|
||||
|
|
|
@ -1,6 +1,10 @@
|
|||
#ifndef KEYER_H
|
||||
#define KEYER_H
|
||||
|
||||
#include "sidetone.h"
|
||||
|
||||
extern const uint BUZZER_PIN;
|
||||
|
||||
class Keyer final
|
||||
{
|
||||
public:
|
||||
|
@ -31,6 +35,7 @@ private:
|
|||
absolute_time_t m_keying_until{0};
|
||||
absolute_time_t m_pausing_until{0};
|
||||
Symbol m_lastSymbolWas{Symbol::Dit};
|
||||
Sidetone m_Sidetone{BUZZER_PIN};
|
||||
};
|
||||
|
||||
#endif
|
|
@ -14,6 +14,7 @@ namespace
|
|||
extern const uint LED_PIN = PICO_DEFAULT_LED_PIN;
|
||||
extern const uint LEFT_PADDLE_PIN = 14;
|
||||
extern const uint RIGHT_PADDLE_PIN = 15;
|
||||
extern const uint BUZZER_PIN = 13;
|
||||
|
||||
void setup()
|
||||
{
|
||||
|
@ -29,6 +30,7 @@ void setup()
|
|||
gpio_init(RIGHT_PADDLE_PIN);
|
||||
gpio_set_dir(RIGHT_PADDLE_PIN, GPIO_IN);
|
||||
gpio_pull_up(RIGHT_PADDLE_PIN);
|
||||
|
||||
sleep_ms(1000);
|
||||
}
|
||||
|
||||
|
@ -45,7 +47,7 @@ int main()
|
|||
// printf("Element duration (u_sec): %" PRIu64 "\n", element_duration_us(settings.wpm));
|
||||
printf("\n");
|
||||
|
||||
Keyer keyer(15);
|
||||
Keyer keyer(25);
|
||||
|
||||
while (true)
|
||||
{
|
||||
|
|
29
src/sidetone.cpp
Normal file
29
src/sidetone.cpp
Normal file
|
@ -0,0 +1,29 @@
|
|||
#include "pico/stdlib.h"
|
||||
#include "hardware/pwm.h"
|
||||
|
||||
#include "sidetone.h"
|
||||
|
||||
Sidetone::Sidetone(uint gpio) : m_gpio(gpio)
|
||||
{
|
||||
gpio_set_function(gpio, GPIO_FUNC_PWM);
|
||||
uint slice_num = pwm_gpio_to_slice_num(gpio);
|
||||
pwm_config config = pwm_get_default_config();
|
||||
pwm_init(slice_num, &config, true);
|
||||
}
|
||||
|
||||
void Sidetone::on(uint freq)
|
||||
{
|
||||
// Calculate and cofigure new clock divider according to the frequency
|
||||
// This formula is assuming we are running at 125MHz.
|
||||
// TODO: Make this work for any frequency
|
||||
float clkdiv = (1.f / freq) * 2000.f;
|
||||
uint slice_num = pwm_gpio_to_slice_num(m_gpio);
|
||||
pwm_set_clkdiv(slice_num, clkdiv);
|
||||
// Configure duty to 50% ((2**16)-1)/2) to generate a square wave
|
||||
pwm_set_gpio_level(m_gpio, 32768U);
|
||||
}
|
||||
|
||||
void Sidetone::off()
|
||||
{
|
||||
pwm_set_gpio_level(m_gpio, 0);
|
||||
}
|
16
src/sidetone.h
Normal file
16
src/sidetone.h
Normal file
|
@ -0,0 +1,16 @@
|
|||
#ifndef SIDETONE_H
|
||||
#define SIDETONE_H
|
||||
|
||||
class Sidetone
|
||||
{
|
||||
public:
|
||||
Sidetone(uint gpio);
|
||||
void on(uint freq);
|
||||
void off();
|
||||
|
||||
private:
|
||||
Sidetone(){};
|
||||
uint m_gpio{0};
|
||||
};
|
||||
|
||||
#endif
|
Loading…
Reference in a new issue