RISC-V/V203/gsm/main.cpp

79 lines
2.5 KiB
C++
Raw Normal View History

2024-05-08 12:54:33 +02:00
#include "pwmclass.h"
#include "fifo.h"
#include "player.h"
#include "GsmDecoder.h"
2024-05-12 16:53:28 +02:00
#include "adcdma.h"
#include "oneway.h"
#include "gpio.h"
2024-05-08 12:54:33 +02:00
////////////////////////////////////////////////////////
/* Demo, které jen počítá od 0 do 1000000. Výstup je PWM
2024-05-12 16:53:28 +02:00
* na pinech PA1/PA8 24kHz. Odvozeno z teploměru na
2024-05-08 12:54:33 +02:00
* https://github.com/Kizarm/TTSCP_Client/tree/main/kecal/stm
*
* Tohle se do CH32V003 prostě nevejde.
2024-05-12 21:33:45 +02:00
* 12.05.2024 předěláno na voltmetr. Pin ADC je PA2, tlačítko
2024-05-12 16:53:28 +02:00
* na PA1 proti 3.3V. Teploměr na čipu stojí za prd, muselo
* by se to individuálně kalibrovat (nehledě na oteplení čipu).
2024-05-08 12:54:33 +02:00
*/
////////////////////////////////////////////////////////
2024-05-12 16:53:28 +02:00
class Meassure : public OneWay {
GpioClass buton;
FIFO<unsigned, 8u> fifo;
unsigned avg, old;
unsigned passcnt;
public:
explicit Meassure () noexcept : OneWay(),
buton (GPIOA,1,(GPIO_Speed_In | GPIO_UPDI_MPPO)),
fifo(), avg(0u), old(0u), passcnt(0u) {
buton.setPuPd(GPIO_PuPd_DOWN);
}
unsigned int Send (uint16_t * const ptr, const unsigned int len) override;
void out ();
};
static inline unsigned absdiff (const unsigned a, const unsigned b) {
int d = a - b;
return d < 0 ? -d : +d;
}
////////////////////////////////////////////////////////
2024-05-08 12:54:33 +02:00
static PwmClass pwm;
static FIFO<PText, FIFOLEN> fifo;
static TextPlayer player (fifo);
static GsmDecoder decoder(fifo);
2024-05-12 16:53:28 +02:00
static AdcDma adc;
static Meassure meas;
2024-05-08 12:54:33 +02:00
int main () {
2024-05-12 16:53:28 +02:00
pwm.attach (decoder);
adc.attach (meas);
2024-05-08 12:54:33 +02:00
for (;;) {
2024-05-12 16:53:28 +02:00
meas.out();
}
return 0;
}
////////////////////////////////////////////////////////
static constexpr unsigned BK = 3316u << 4; // Mělo by to být přesně 3300.
unsigned int Meassure::Send(uint16_t * const ptr, const unsigned int len) {
for (unsigned n=0; n<len; n++) {
const unsigned mv = (BK * ptr [n]) >> 16;
avg = (avg * 15 + mv) >> 4; // klouzavý průměr s postupným zapomínáním
2024-05-08 12:54:33 +02:00
}
2024-05-12 16:53:28 +02:00
fifo.Write (avg);
2024-05-08 12:54:33 +02:00
return 0;
}
2024-05-12 16:53:28 +02:00
void Meassure::out() {
unsigned t;
if (fifo.Read (t)) {
2024-05-12 21:33:45 +02:00
if (passcnt) { passcnt -= 1u; } else { // trochu pozdrž
2024-05-12 16:53:28 +02:00
const unsigned delta = absdiff(t, old);
2024-05-12 21:33:45 +02:00
if (delta > 10 or buton) { // chci výstup
2024-05-12 16:53:28 +02:00
old = t;
2024-05-12 21:33:45 +02:00
player.say(old, 3); // tady se zaplní fronta
player.say(sayed_texts.units); // v postatě nevalidními daty
while (fifo.Read(t)); // takže zde ji vyprázdním
passcnt = 10u; // a nastavím zpoždění (uklidni data)
2024-05-12 16:53:28 +02:00
}
}
}
}