RISC-V/V203F6P6/midi/main.cpp
2025-02-19 15:33:04 +01:00

65 lines
1.9 KiB
C++

#include "system.h"
#include "midiplayer.h"
#include "cdc_class.h"
#include "linkprotocol.h"
#include "helpers.h"
/*
* Player na tomto čipu má 12 generátorů, lepší
* rozlišení PWM, tedy lepší zvuk.
* Zase má menší paměť, takže stálo za zkoušku dát
* data melodií do externí SPI flash. Číst to z ní
* po bytu by asi bylo dost neefektivní, takže je tam
* vložena třída Cache. Zároveň to ukazuje jak efektivní
* je použití C++ proti čistému C. Zatímco v C-čku by to
* asi byl velký zásah do původního kódu, zde stačí
* ve třídě Cache přetížit 3 operátory a do původního
* kódu se nemusí takřka zasahovat.
* Binární obraz melodií pro externí flash se vytvoří
* pomocí Makefile v adresáří img, je nezávislý na
* firmware procesoru. Melodie to bere z adresáře mid,
* pořadí je víceméně náhodné.
*
* Vzhledem k tomu, že je tam místa dost, vejde se tam
* i programátor nor flash, takže není potřeba přepínat
* firmware, stačí připojit do USB a pokud se to do 2s
* enumeruje, můžeme programovat.
*/
extern "C" volatile uint32_t bDeviceState;
GpioClass led (GPIOB,8u);
// player
static MidiPlayer player (led);
static PwmClass pcm;
// programátor
static cdc_class cdc;
static MemoryBase mem;
static CdcCmd cmd;
static LinkProtocol lnk (cmd, mem);
static void player_loop () {
for (;;) {
player.pass();
}
}
static void programmer_loop () {
led << true;
unsigned command = 0u;
for (;;) {
char * res = cmd.GetLine(command);
if (command == 0u) continue;
lnk.ParseLine(res);
}
}
int main (void) {
delay_init ();
cdc.init ();
Delay_Ms (2000); // čekat se musí poměrně dlouho
if (bDeviceState > 1u) { // enumerováno, můžeme programovat
cmd += cdc;
programmer_loop();
} else { // jinak můžeme hrát
pcm.attach (player);
player_loop ();
}
return 0;
}