#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; }