Files
MeshCore/test/fixtures/rtttl_rollover/queue.cpp
T

53 lines
1.8 KiB
C++

#define PIN_BUZZER 25
#define MESH_GPS_VOICE 1
#include <helpers/ui/buzzer.cpp>
static_assert(sizeof(unsigned long) == 4, "Use device-width unsigned long");
uint32_t now_ms = 0;
unsigned tone_calls = 0;
unsigned silence_calls = 0;
extern "C" void* memset(void* dst, int value, unsigned length) {
unsigned char* bytes = static_cast<unsigned char*>(dst);
for (unsigned i = 0; i < length; ++i) bytes[i] = static_cast<unsigned char>(value);
return dst;
}
static void quit(unsigned code) {
__asm__ volatile("int $0x80" : : "a"(1), "b"(code));
__builtin_unreachable();
}
static void check(bool okay, unsigned line) {
if (!okay) quit(line);
}
#define CHECK(expression) check((expression), __LINE__)
extern "C" void _start() {
genericBuzzer buzzer;
buzzer.begin();
CHECK(buzzer.isQuiet());
CHECK(buzzer.speakGps(true));
buzzer.loop();
CHECK(tone_calls == 0 && !buzzer.isPlaying() && !registers.ENABLE);
buzzer.quiet(false); // The UI applies its saved sound-on choice before use.
CHECK(!buzzer.isQuiet());
now_ms = 0xffffffffU - 100;
CHECK(buzzer.speakGps(true));
buzzer.loop();
CHECK(tone_calls == 1 && buzzer.isPlaying() && !registers.ENABLE);
now_ms = 0xffffffffU - 10;
buzzer.loop();
CHECK(tone_calls == 1 && buzzer.isPlaying());
now_ms = 20;
buzzer.loop();
CHECK(tone_calls == 2 && buzzer.isPlaying() && !registers.ENABLE);
now_ms += 94; buzzer.loop();
CHECK(tone_calls == 3 && !registers.ENABLE);
now_ms += 188; buzzer.loop();
CHECK(rtttl::done() && !registers.ENABLE);
buzzer.loop(); // Start the intentional speech gap.
now_ms += 99; buzzer.loop();
CHECK(!registers.ENABLE);
now_ms += 1; buzzer.loop();
CHECK(registers.ENABLE && buzzer.isPlaying() && HwPWM3.owned);
buzzer.stop();
CHECK(!registers.ENABLE && !buzzer.isPlaying() && !HwPWM3.owned);
quit(0);
}