SatCat5
cfgbus_piezo.cc
1 // Copyright 2025 The Aerospace Corporation.
3 // This file is a part of SatCat5, licensed under CERN-OHL-W v2 or later.
5 
6 #include <satcat5/cfgbus_piezo.h>
7 
9 
10 Piezo::Piezo(satcat5::cfg::ConfigBus* cfg, unsigned devaddr, unsigned regaddr)
11  : m_reg(cfg->get_register(devaddr, regaddr))
12  , m_queue(m_raw, sizeof(m_raw), 0)
13 {
14  // Start from the idle / silent state.
15  m_queue.set_callback(this);
16  *m_reg = 0;
17 }
18 
19 void Piezo::flush() {
20  // Flush internal queue and return to idle/silent state.
21  m_queue.clear();
22  timer_stop();
23  wait();
24 }
25 
27  // Unlink data_rcvd notifications while waiting for timer.
29  // Execute the newly-received command.
30  timer_event();
31 }
32 
34  if (m_queue.get_read_ready() >= 6) {
35  // Read and execute next command.
36  timer_once(m_queue.read_u16());
37  *m_reg = m_queue.read_u32();
38  } else {
39  // Idle/silent until we get more data.
40  wait();
41  }
42 }
43 
44 void Piezo::wait() {
45  // Silence output, then relink callback for data_rcvd notifications.
46  *m_reg = 0;
47  m_queue.set_callback(this);
48 }
Generic ConfigBus API.
Definition: cfgbus_core.h:124
ConfigBus-controlled piezoelectric buzzer.
Definition: cfgbus_piezo.h:27
satcat5::io::PacketBuffer m_queue
Playback queue.
Definition: cfgbus_piezo.h:49
void timer_event() override
Child class MUST override this method.
Definition: cfgbus_piezo.cc:33
void flush()
Silence playback and flush internal queue.
Definition: cfgbus_piezo.cc:19
void data_rcvd(satcat5::io::Readable *src) override
The data_rcvd() callback is polled whenever data is available.
Definition: cfgbus_piezo.cc:26
satcat5::cfg::Register m_reg
Base control register.
Definition: cfgbus_piezo.h:48
void clear()
Reset buffer contents.
Definition: pkt_buffer.cc:22
unsigned get_read_ready() const override
How many bytes can be read without blocking?
Definition: pkt_buffer.cc:177
Abstract API for reading byte-streams and packets.
Definition: io_readable.h:68
virtual void set_callback(satcat5::io::EventListener *callback)
Update registered callback for data_rcvd() events.
Definition: io_readable.cc:39
void timer_stop()
Stop all future notifications.
Definition: polling.cc:326
void timer_once(unsigned msec)
Configure a one-time notification after X milliseconds.
Definition: polling.cc:316