/* * ll_testbed.cpp * * Created on: Oct 28, 2019 * Author: abody */ #include #include #include "ll_hsusart.h" #include "ll_crchandler.h" #include "ll_memcpydma.h" extern "C" { #include "main.h" #include "globals.h" #include "strutil.h" #include "config.h" } #include "globals_cpp.h" #define PACKAGE_DELAY_MS 0 #define STATS_DELAY_MS 1000 #define ADDINFO(b,s,u) \ b += strcpy_ex(b,s); \ b += uitodec(b,u); void _PrintStats(char *buffer, uint8_t id, f4ll::LL_HsUsart &handler, USART_TypeDef *usart, DMAINFO* dmaInfo) { char ids[] = " : "; char *bs = buffer; f4ll::LL_HsUsart::Stats const & stats(handler.GetStats()); ids[0] = id + '0'; buffer += strcpy_ex(buffer, ids); ADDINFO(buffer, " s: ", stats.sent); ADDINFO(buffer, " r: ", stats.rcvd); ADDINFO(buffer, " sk: ", stats.skiped); ADDINFO(buffer, " or: ", stats.overrun); ADDINFO(buffer, " he: ", stats.hdrError); // buffer += strcpy_ex(buffer,",0x"); // buffer += uitohex(buffer, stats.lastErrHdr, 8); ADDINFO(buffer, " pe: ", stats.payloadErrror); buffer += strcpy_ex(buffer,",0x"); buffer += uitohex(buffer, stats.pep1, 8); buffer += strcpy_ex(buffer,",0x"); buffer += uitohex(buffer, stats.pep2, 8); ADDINFO(buffer, " rde: ", stats.rxDmaError); ADDINFO(buffer, " tde: ", stats.txDmaError); ADDINFO(buffer, " pmh: ", stats.premature_hdr); ADDINFO(buffer, " pmp: ", stats.premature_payload); buffer += strcpy_ex(buffer, "\r\n"); SetupTransmit(usart, dmaInfo->dma, dmaInfo->stream, bs, buffer - bs + 1); } extern "C" void MainLoop() { uint8_t const text2Send[] __attribute__((aligned(4))) = "Megszentsegtelenithetetlensegeskedeseitekert\r\n" "--------------------------------------------\r\n\0\0\0"; f4ll::LL_MemcpyDma::Init(MEMCPY_DMA_ENGINE, MEMCPY_DMA_STREAM); f4ll::LL_CrcHandler::Init(DMA2, LL_DMA_STREAM_4); f4ll::LL_HsUsart u1{ USART1, DMA2, LL_DMA_STREAM_2, LL_DMA_STREAM_7 }; f4ll::LL_HsUsart u2{ USART2, DMA1, LL_DMA_STREAM_5, LL_DMA_STREAM_6 }; f4ll::LL_HsUsart u3{ USART3, DMA1, LL_DMA_STREAM_1, LL_DMA_STREAM_3 }; f4ll::LL_HsUsart u6{ USART6, DMA2, LL_DMA_STREAM_1, LL_DMA_STREAM_6 }; f4ll::LL_HsUsart * usarts[] = { &u1, &u2, &u3, &u6 }; for(unsigned int i=0; i < sizeof(usarts) / sizeof(usarts[0]); ++i) g_usarts[i] = usarts[i]; uint32_t lastStatsTick = 0; uint32_t prevSentTick = 0; uint8_t statId = 0; uint32_t tmp = sizeof(text2Send) - 1; uint32_t randmask = 0x80000000; do if(randmask & tmp) break; while((randmask = randmask >> 1)); randmask -= 1; InitDmaInfo(&g_ConsoleTxDmaInfo, CONSOLE_DMA_ENGINE, CONSOLE_TX_DMA_STREAM); LL_DMA_EnableIT_TC(g_ConsoleTxDmaInfo.dma, g_ConsoleTxDmaInfo.stream); lastStatsTick = HAL_GetTick(); for(auto u : usarts) u->SetupReceive(); for(;;) { uint32_t tick = HAL_GetTick(); bool send = PACKAGE_DELAY_MS ? (tick - prevSentTick > PACKAGE_DELAY_MS) : 1; if(send) prevSentTick += PACKAGE_DELAY_MS; for(auto u : usarts) { if(!u->IsTxBusy() && send) { //DIAG_ENTER_BUSY(); auto len = sizeof(text2Send) - 1 - (rand() & randmask); f4ll::LL_MemcpyDma::Instance().Copy(u->GetTxPacketBuffer(), text2Send, len); u->PostPacket(nullptr, len); //DIAG_EXIT_BUSY(); } for(uint16_t rIdx = 0; rIdx < 2; ++rIdx) if(u->IsRxBusy((bool)rIdx) || u->IsRxFailed(rIdx)) u->RxProcessed((bool)rIdx); } if(tick - lastStatsTick > STATS_DELAY_MS) { _PrintStats((char*)g_statsBuf, statId, *usarts[statId], UART4, &g_ConsoleTxDmaInfo); lastStatsTick += STATS_DELAY_MS; ++statId; if(statId >= sizeof(usarts) / sizeof(usarts[0])) statId = 0; } // uint32_t ein = LL_GPIO_ReadInputPort(KEY1_GPIO_Port); // if(!(ein & KEY1_Pin)) { // void (*fptr)(void) = (void (*)(void))(void*)0xa0000000; // fptr(); // } } }