65 lines
1.9 KiB
C++
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;
|
|
}
|