From 2535aace51f29c050d84ac7fcd923649d72f2ae4 Mon Sep 17 00:00:00 2001 From: Clyne Sullivan Date: Fri, 7 Jun 2024 20:02:42 -0400 Subject: wip: prep code for brief execution we do *not* have much power available --- main.cpp | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) (limited to 'main.cpp') diff --git a/main.cpp b/main.cpp index 298c3f8..f7c8027 100644 --- a/main.cpp +++ b/main.cpp @@ -34,7 +34,7 @@ static constexpr auto MIC_BITS = 18u; static constexpr auto SAMPLE_RATE = 48000u; static constexpr unsigned I2S_BUFSIZ = 1024; -static constexpr unsigned I2S_STRIDE = 16; +static constexpr unsigned I2S_STRIDE = 32: // Calculate reference amplitude value at compile time static const auto MIC_REF_AMPL = sos_t((1 << (MIC_BITS - 1)) - 1) * @@ -64,18 +64,19 @@ int main(void) { halInit(); osalSysEnable(); - osalThreadSleepMilliseconds(2000); + //osalThreadSleepMilliseconds(2000); palSetPadMode(GPIOB, 7, PAL_MODE_OUTPUT_PUSHPULL); - palSetPadMode(GPIOF, 2, PAL_MODE_UNCONNECTED); + palSetPad(GPIOB, 7); + //palSetPadMode(GPIOF, 2, PAL_MODE_UNCONNECTED); palSetLineMode(LINE_I2S_SD, PAL_MODE_ALTERNATE(0)); palSetLineMode(LINE_I2S_WS, PAL_MODE_ALTERNATE(0)); palSetLineMode(LINE_I2S_CK, PAL_MODE_ALTERNATE(0)); - palSetLineMode(LINE_USART2_TX, PAL_MODE_ALTERNATE(1)); + //palSetLineMode(LINE_USART2_TX, PAL_MODE_ALTERNATE(1)); - sdStart(&SD2, NULL); - sdWrite(&SD2, (uint8_t *)"Noisemeter\n", 11); - osalThreadSleepMilliseconds(2); + //sdStart(&SD2, NULL); + //sdWrite(&SD2, (uint8_t *)"Noisemeter\n", 11); + //osalThreadSleepMilliseconds(2); i2sStart(&I2SD1, &i2sConfig); i2sStartExchange(&I2SD1); @@ -86,7 +87,7 @@ int main(void) SCB->SCR |= SCB_SCR_SLEEPONEXIT_Msk; __WFI(); - palSetPad(GPIOB, 7); + //palSetPad(GPIOB, 7); const sos_t Leq_RMS = qfp_fsqrt(Leq_sum_sqr / qfp_uint2float(Leq_samples)); const sos_t Leq_dB = MIC_OFFSET_DB + MIC_REF_DB + sos_t(20.f) * qfp_flog10(Leq_RMS / MIC_REF_AMPL); @@ -94,12 +95,15 @@ int main(void) Leq_samples = 0; auto n = std::clamp(qfp_float2int(Leq_dB), 0, 999); - strbuf[2] = n % 10 + '0'; n /= 10; - strbuf[1] = n % 10 + '0'; n /= 10; - strbuf[0] = n ? n + '0' : ' '; - sdWrite(&SD2, strbuf, sizeof(strbuf)); - osalThreadSleepMilliseconds(2); palClearPad(GPIOB, 7); + osalThreadSleepMicroseconds(200); + palSetPad(GPIOB, 7); + //strbuf[2] = n % 10 + '0'; n /= 10; + //strbuf[1] = n % 10 + '0'; n /= 10; + //strbuf[0] = n ? n + '0' : ' '; + //sdWrite(&SD2, strbuf, sizeof(strbuf)); + //osalThreadSleepMilliseconds(2); + ////palClearPad(GPIOB, 7); } } @@ -114,7 +118,7 @@ void i2sCallback(I2SDriver *i2s) if (i2sReady.load()) return; - palSetPad(GPIOB, 7); + //palSetPad(GPIOB, 7); const auto halfsize = i2sBuffer.size() / 2; const auto source = i2sBuffer.data() + (i2sIsBufferComplete(i2s) ? halfsize : 0); auto samples = reinterpret_cast(source); @@ -135,6 +139,6 @@ void i2sCallback(I2SDriver *i2s) i2sReady.store(true); SCB->SCR &= ~SCB_SCR_SLEEPONEXIT_Msk; } - palClearPad(GPIOB, 7); + //palClearPad(GPIOB, 7); } -- cgit v1.2.3 From 686e00c9217f47ead88662ab6fd3eb00c6ee24de Mon Sep 17 00:00:00 2001 From: Clyne Sullivan Date: Mon, 10 Jun 2024 08:31:40 -0400 Subject: pcb firmware working --- board.h | 11 ++++++++ main.cpp | 88 ++++++++++++++++++++++++++++++++++++++++++---------------------- 2 files changed, 69 insertions(+), 30 deletions(-) (limited to 'main.cpp') diff --git a/board.h b/board.h index 9576dba..98fa567 100644 --- a/board.h +++ b/board.h @@ -59,6 +59,17 @@ #define LINE_USART2_TX PAL_LINE(GPIOA, 14U) +#define LINE_LED0 PAL_LINE(GPIOB, 7U) +#define LINE_LED1 PAL_LINE(GPIOC, 14U) +#define LINE_LED2 PAL_LINE(GPIOC, 15U) +#define LINE_LED3 PAL_LINE(GPIOA, 0U) +#define LINE_LED4 PAL_LINE(GPIOA, 1U) +#define LINE_LED5 PAL_LINE(GPIOA, 2U) +#define LINE_LED6 PAL_LINE(GPIOA, 3U) +#define LINE_LED7 PAL_LINE(GPIOA, 6U) +#define LINE_LED8 PAL_LINE(GPIOB, 0U) +#define LINE_LED9 PAL_LINE(GPIOB, 3U) + /* * I/O ports initial setup, this configuration is established soon after reset * in the initialization code. diff --git a/main.cpp b/main.cpp index f7c8027..c3abd77 100644 --- a/main.cpp +++ b/main.cpp @@ -34,7 +34,7 @@ static constexpr auto MIC_BITS = 18u; static constexpr auto SAMPLE_RATE = 48000u; static constexpr unsigned I2S_BUFSIZ = 1024; -static constexpr unsigned I2S_STRIDE = 32: +static constexpr unsigned I2S_STRIDE = 32; // Calculate reference amplitude value at compile time static const auto MIC_REF_AMPL = sos_t((1 << (MIC_BITS - 1)) - 1) * @@ -45,6 +45,7 @@ static std::array i2sBuffer; static sos_t Leq_sum_sqr (0.f); static unsigned Leq_samples = 0; +static void blinkDb(int db); static void i2sCallback(I2SDriver *i2s); static constexpr unsigned I2SPRval = 16'000'000 / SAMPLE_RATE / 32 / 2; @@ -64,49 +65,78 @@ int main(void) { halInit(); osalSysEnable(); - //osalThreadSleepMilliseconds(2000); - palSetPadMode(GPIOB, 7, PAL_MODE_OUTPUT_PUSHPULL); - palSetPad(GPIOB, 7); - //palSetPadMode(GPIOF, 2, PAL_MODE_UNCONNECTED); + palSetLineMode(LINE_LED0, PAL_MODE_OUTPUT_PUSHPULL); palSetLine(LINE_LED0); + palSetLineMode(LINE_LED1, PAL_MODE_OUTPUT_PUSHPULL); palSetLine(LINE_LED1); + palSetLineMode(LINE_LED2, PAL_MODE_OUTPUT_PUSHPULL); palSetLine(LINE_LED2); + palSetLineMode(LINE_LED3, PAL_MODE_OUTPUT_PUSHPULL); palSetLine(LINE_LED3); + palSetLineMode(LINE_LED4, PAL_MODE_OUTPUT_PUSHPULL); palSetLine(LINE_LED4); + palSetLineMode(LINE_LED5, PAL_MODE_OUTPUT_PUSHPULL); palSetLine(LINE_LED5); + palSetLineMode(LINE_LED6, PAL_MODE_OUTPUT_PUSHPULL); palSetLine(LINE_LED6); + palSetLineMode(LINE_LED7, PAL_MODE_OUTPUT_PUSHPULL); palSetLine(LINE_LED7); + palSetLineMode(LINE_LED8, PAL_MODE_OUTPUT_PUSHPULL); palSetLine(LINE_LED8); + palSetLineMode(LINE_LED9, PAL_MODE_OUTPUT_PUSHPULL); palSetLine(LINE_LED9); palSetLineMode(LINE_I2S_SD, PAL_MODE_ALTERNATE(0)); palSetLineMode(LINE_I2S_WS, PAL_MODE_ALTERNATE(0)); palSetLineMode(LINE_I2S_CK, PAL_MODE_ALTERNATE(0)); - //palSetLineMode(LINE_USART2_TX, PAL_MODE_ALTERNATE(1)); - - //sdStart(&SD2, NULL); - //sdWrite(&SD2, (uint8_t *)"Noisemeter\n", 11); - //osalThreadSleepMilliseconds(2); + i2sReady.store(true); i2sStart(&I2SD1, &i2sConfig); i2sStartExchange(&I2SD1); + // Microphone warmup time + osalThreadSleepMilliseconds(140); + // Reach filter delay steady state + i2sReady.store(false); + osalThreadSleepMilliseconds(120); + // Discard initial readings + Leq_sum_sqr = 0.f; + Leq_samples = 0; - uint8_t strbuf[7] = { 0, 0, 0, 'd', 'B', '\n', '\0' }; for (;;) { i2sReady.store(false); SCB->SCR |= SCB_SCR_SLEEPONEXIT_Msk; __WFI(); - //palSetPad(GPIOB, 7); - const sos_t Leq_RMS = qfp_fsqrt(Leq_sum_sqr / qfp_uint2float(Leq_samples)); + const auto sum_sqr = std::exchange(Leq_sum_sqr, sos_t(0.f)); + const auto count = std::exchange(Leq_samples, 0); + const sos_t Leq_RMS = qfp_fsqrt(sum_sqr / qfp_uint2float(count)); const sos_t Leq_dB = MIC_OFFSET_DB + MIC_REF_DB + sos_t(20.f) * qfp_flog10(Leq_RMS / MIC_REF_AMPL); - Leq_sum_sqr = sos_t(0.f); - Leq_samples = 0; - - auto n = std::clamp(qfp_float2int(Leq_dB), 0, 999); - palClearPad(GPIOB, 7); - osalThreadSleepMicroseconds(200); - palSetPad(GPIOB, 7); - //strbuf[2] = n % 10 + '0'; n /= 10; - //strbuf[1] = n % 10 + '0'; n /= 10; - //strbuf[0] = n ? n + '0' : ' '; - //sdWrite(&SD2, strbuf, sizeof(strbuf)); - //osalThreadSleepMilliseconds(2); - ////palClearPad(GPIOB, 7); + const auto n = std::clamp(qfp_float2int(Leq_dB), 0, 999); + blinkDb(n); } } +void blinkDb(int db) +{ + auto line = LINE_LED0; + + if (db < 45) + line = LINE_LED0; + else if (db < 55) + line = LINE_LED1; + else if (db < 65) + line = LINE_LED2; + else if (db < 75) + line = LINE_LED3; + else if (db < 82) + line = LINE_LED4; + else if (db < 87) + line = LINE_LED5; + else if (db < 92) + line = LINE_LED6; + else if (db < 97) + line = LINE_LED7; + else if (db < 102) + line = LINE_LED8; + else + line = LINE_LED9; + + palClearLine(line); + osalThreadSleepMilliseconds(50); + palSetLine(line); +} + __attribute__((section(".data"))) int32_t fixsample(uint32_t s) { return (int32_t)(((s & 0xFFFF) << 16) | (s >> 16)) >> (32 - MIC_BITS); @@ -118,7 +148,6 @@ void i2sCallback(I2SDriver *i2s) if (i2sReady.load()) return; - //palSetPad(GPIOB, 7); const auto halfsize = i2sBuffer.size() / 2; const auto source = i2sBuffer.data() + (i2sIsBufferComplete(i2s) ? halfsize : 0); auto samples = reinterpret_cast(source); @@ -134,11 +163,10 @@ void i2sCallback(I2SDriver *i2s) Leq_sum_sqr += WEIGHTING.filter_sum_sqr(samps); Leq_samples += samps.size(); - // Wakeup main thread for dB calculation every second - if (Leq_samples >= SAMPLE_RATE / I2S_STRIDE) { + // Wakeup main thread for dB calculation every half second + if (Leq_samples >= SAMPLE_RATE / I2S_STRIDE / 2) { i2sReady.store(true); SCB->SCR &= ~SCB_SCR_SLEEPONEXIT_Msk; } - //palClearPad(GPIOB, 7); } -- cgit v1.2.3 From e941048b066dc167ee870545d99532a8d1815e89 Mon Sep 17 00:00:00 2001 From: Clyne Sullivan Date: Mon, 10 Jun 2024 13:25:48 -0400 Subject: stop using stride term --- main.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'main.cpp') diff --git a/main.cpp b/main.cpp index c3abd77..6cb6eaa 100644 --- a/main.cpp +++ b/main.cpp @@ -34,7 +34,7 @@ static constexpr auto MIC_BITS = 18u; static constexpr auto SAMPLE_RATE = 48000u; static constexpr unsigned I2S_BUFSIZ = 1024; -static constexpr unsigned I2S_STRIDE = 32; +static constexpr unsigned I2S_USESIZ = 16; // Calculate reference amplitude value at compile time static const auto MIC_REF_AMPL = sos_t((1 << (MIC_BITS - 1)) - 1) * @@ -152,19 +152,19 @@ void i2sCallback(I2SDriver *i2s) const auto source = i2sBuffer.data() + (i2sIsBufferComplete(i2s) ? halfsize : 0); auto samples = reinterpret_cast(source); std::ranges::copy( - std::views::counted(source, halfsize / I2S_STRIDE) + std::views::counted(source, I2S_USESIZ * 2) | std::ranges::views::stride(2) | std::views::transform([](uint32_t s) { return sos_t(qfp_int2float_asm(fixsample(s))); }), samples); - auto samps = std::views::counted(samples, halfsize / (2 * I2S_STRIDE)); + auto samps = std::views::counted(samples, I2S_USESIZ); // Accumulate Leq sum MIC_EQUALIZER.filter(samps); Leq_sum_sqr += WEIGHTING.filter_sum_sqr(samps); - Leq_samples += samps.size(); + Leq_samples += halfsize / 2; // Wakeup main thread for dB calculation every half second - if (Leq_samples >= SAMPLE_RATE / I2S_STRIDE / 2) { + if (Leq_samples >= SAMPLE_RATE / 2) { i2sReady.store(true); SCB->SCR &= ~SCB_SCR_SLEEPONEXIT_Msk; } -- cgit v1.2.3 From 8745f7c29470ec2267eb5b90e4644499200bafd3 Mon Sep 17 00:00:00 2001 From: Clyne Sullivan Date: Mon, 10 Jun 2024 15:21:47 -0400 Subject: move io config to board.c --- board.c | 17 ++++++++++++++++- board.h | 2 +- main.cpp | 20 ++++++-------------- 3 files changed, 23 insertions(+), 16 deletions(-) (limited to 'main.cpp') diff --git a/board.c b/board.c index 3e81227..3ec4581 100644 --- a/board.c +++ b/board.c @@ -40,6 +40,21 @@ void __early_init(void) { * @note Add your board-specific code, if any. */ void boardInit(void) { - //palSetLineMode(LINE_LED_GREEN, PAL_MODE_OUTPUT_PUSHPULL); + palSetLineMode(LINE_LED0, PAL_MODE_OUTPUT_PUSHPULL); palSetLine(LINE_LED0); + palSetLineMode(LINE_LED1, PAL_MODE_OUTPUT_PUSHPULL); palSetLine(LINE_LED1); + palSetLineMode(LINE_LED2, PAL_MODE_OUTPUT_PUSHPULL); palSetLine(LINE_LED2); + palSetLineMode(LINE_LED3, PAL_MODE_OUTPUT_PUSHPULL); palSetLine(LINE_LED3); + palSetLineMode(LINE_LED4, PAL_MODE_OUTPUT_PUSHPULL); palSetLine(LINE_LED4); + palSetLineMode(LINE_LED5, PAL_MODE_OUTPUT_PUSHPULL); palSetLine(LINE_LED5); + palSetLineMode(LINE_LED6, PAL_MODE_OUTPUT_PUSHPULL); palSetLine(LINE_LED6); + palSetLineMode(LINE_LED7, PAL_MODE_OUTPUT_PUSHPULL); palSetLine(LINE_LED7); + palSetLineMode(LINE_LED8, PAL_MODE_OUTPUT_PUSHPULL); palSetLine(LINE_LED8); + palSetLineMode(LINE_LED9, PAL_MODE_OUTPUT_PUSHPULL); palSetLine(LINE_LED9); + + palSetLineMode(LINE_TP1, PAL_MODE_OUTPUT_PUSHPULL); palClearLine(LINE_TP1); + + palSetLineMode(LINE_I2S_SD, PAL_MODE_ALTERNATE(0)); + palSetLineMode(LINE_I2S_WS, PAL_MODE_ALTERNATE(0)); + palSetLineMode(LINE_I2S_CK, PAL_MODE_ALTERNATE(0)); } diff --git a/board.h b/board.h index 98fa567..801cf6b 100644 --- a/board.h +++ b/board.h @@ -57,7 +57,7 @@ #define LINE_I2S_WS PAL_LINE(GPIOA, 4U) #define LINE_I2S_CK PAL_LINE(GPIOA, 5U) -#define LINE_USART2_TX PAL_LINE(GPIOA, 14U) +#define LINE_TP1 PAL_LINE(GPIOA, 12U) #define LINE_LED0 PAL_LINE(GPIOB, 7U) #define LINE_LED1 PAL_LINE(GPIOC, 14U) diff --git a/main.cpp b/main.cpp index 6cb6eaa..0473d6e 100644 --- a/main.cpp +++ b/main.cpp @@ -66,20 +66,6 @@ int main(void) halInit(); osalSysEnable(); - palSetLineMode(LINE_LED0, PAL_MODE_OUTPUT_PUSHPULL); palSetLine(LINE_LED0); - palSetLineMode(LINE_LED1, PAL_MODE_OUTPUT_PUSHPULL); palSetLine(LINE_LED1); - palSetLineMode(LINE_LED2, PAL_MODE_OUTPUT_PUSHPULL); palSetLine(LINE_LED2); - palSetLineMode(LINE_LED3, PAL_MODE_OUTPUT_PUSHPULL); palSetLine(LINE_LED3); - palSetLineMode(LINE_LED4, PAL_MODE_OUTPUT_PUSHPULL); palSetLine(LINE_LED4); - palSetLineMode(LINE_LED5, PAL_MODE_OUTPUT_PUSHPULL); palSetLine(LINE_LED5); - palSetLineMode(LINE_LED6, PAL_MODE_OUTPUT_PUSHPULL); palSetLine(LINE_LED6); - palSetLineMode(LINE_LED7, PAL_MODE_OUTPUT_PUSHPULL); palSetLine(LINE_LED7); - palSetLineMode(LINE_LED8, PAL_MODE_OUTPUT_PUSHPULL); palSetLine(LINE_LED8); - palSetLineMode(LINE_LED9, PAL_MODE_OUTPUT_PUSHPULL); palSetLine(LINE_LED9); - palSetLineMode(LINE_I2S_SD, PAL_MODE_ALTERNATE(0)); - palSetLineMode(LINE_I2S_WS, PAL_MODE_ALTERNATE(0)); - palSetLineMode(LINE_I2S_CK, PAL_MODE_ALTERNATE(0)); - i2sReady.store(true); i2sStart(&I2SD1, &i2sConfig); i2sStartExchange(&I2SD1); @@ -95,7 +81,9 @@ int main(void) for (;;) { i2sReady.store(false); SCB->SCR |= SCB_SCR_SLEEPONEXIT_Msk; + //palClearLine(LINE_TP1); __WFI(); + //palSetLine(LINE_TP1); const auto sum_sqr = std::exchange(Leq_sum_sqr, sos_t(0.f)); const auto count = std::exchange(Leq_samples, 0); @@ -148,6 +136,8 @@ void i2sCallback(I2SDriver *i2s) if (i2sReady.load()) return; + //palSetLine(LINE_TP1); + const auto halfsize = i2sBuffer.size() / 2; const auto source = i2sBuffer.data() + (i2sIsBufferComplete(i2s) ? halfsize : 0); auto samples = reinterpret_cast(source); @@ -168,5 +158,7 @@ void i2sCallback(I2SDriver *i2s) i2sReady.store(true); SCB->SCR &= ~SCB_SCR_SLEEPONEXIT_Msk; } + + //palClearLine(LINE_TP1); } -- cgit v1.2.3 From 67bdf76f1942eb210a52e5f0a96d92ed3238f456 Mon Sep 17 00:00:00 2001 From: Clyne Sullivan Date: Tue, 11 Jun 2024 17:01:40 -0400 Subject: make led show a little longer --- main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'main.cpp') diff --git a/main.cpp b/main.cpp index 0473d6e..de9e093 100644 --- a/main.cpp +++ b/main.cpp @@ -121,7 +121,7 @@ void blinkDb(int db) line = LINE_LED9; palClearLine(line); - osalThreadSleepMilliseconds(50); + osalThreadSleepMilliseconds(100); palSetLine(line); } -- cgit v1.2.3