From 2007a5de10f4dfec05090b1c4e05b18798adf10c Mon Sep 17 00:00:00 2001 From: Adam Prochazka Date: Fri, 7 Apr 2023 21:34:59 +0200 Subject: [PATCH] First fully working camera capture, transfer and receive! --- Firmware/Core/Cam/Cam.c | 12 ++-- Firmware/Core/Src/main.c | 45 ++++++++----- Receiver/Displayer.cpp | 1 - Receiver/ImageView.cpp | 138 --------------------------------------- Receiver/ImageView.hpp | 23 ------- Receiver/Receiver.cpp | 87 +++++++++++++++--------- Receiver/Receiver.hpp | 48 ++++++++++++-- Receiver/Transfer.cpp | 70 -------------------- Receiver/Transfer.hpp | 6 -- Receiver/main.cpp | 23 +++---- Receiver/main.hpp | 3 +- 11 files changed, 146 insertions(+), 310 deletions(-) delete mode 100644 Receiver/ImageView.cpp delete mode 100644 Receiver/ImageView.hpp delete mode 100644 Receiver/Transfer.cpp delete mode 100644 Receiver/Transfer.hpp diff --git a/Firmware/Core/Cam/Cam.c b/Firmware/Core/Cam/Cam.c index ba9c9b9..52a085b 100644 --- a/Firmware/Core/Cam/Cam.c +++ b/Firmware/Core/Cam/Cam.c @@ -121,13 +121,12 @@ void Cam_I2C_write_bulk(I2C_HandleTypeDef *hi2c, const struct sensor_reg regList void Cam_Init(I2C_HandleTypeDef *hi2c, SPI_HandleTypeDef *hspi) { Cam_I2C_write(hi2c, (uint16_t)0x3008, 0x80); - Cam_I2C_write(hi2c, (uint16_t)0x3008, 0x80); Cam_I2C_write_bulk(hi2c, OV5642_QVGA_Preview); Cam_I2C_write_bulk(hi2c, OV5642_JPEG_Capture_QSXGA); - Cam_I2C_write_bulk(hi2c, OV5642_720P_Video_setting); + //Cam_I2C_write_bulk(hi2c, OV5642_720P_Video_setting); Cam_I2C_write(hi2c, (uint16_t)0x3818, 0xa8); // TIMING CONTROL - ENABLE COMPRESSION, THUMBNAIL MODE DISABLE, VERTICAL FLIP, MIRROR Cam_I2C_write(hi2c, (uint16_t)0x3621, 0x10); // REGISTER FOR CORRECT MIRROR FUNCTION @@ -138,7 +137,7 @@ void Cam_Init(I2C_HandleTypeDef *hi2c, SPI_HandleTypeDef *hspi) // Setup camera, H-sync: High, V-sync:high, Sensor_delay: no Delay, FIFO_mode:FIFO enabled, power_mode:Low_power Cam_SPI_write(hspi, 0x03, 0x02); - Cam_SPI_write(hspi, 0x01, 0x01); // Capture Control Register - Set to capture n+1 frames + Cam_SPI_write(hspi, 0x01, 0x00); // Capture Control Register - Set to capture n+1 frames HAL_Delay(5); } @@ -155,7 +154,7 @@ int Cam_FIFO_length(SPI_HandleTypeDef *hspi) void Cam_Start_Capture(SPI_HandleTypeDef *hspi) { - + /* uint8_t FIFO_Reg = Cam_SPI_read(hspi, 0x04); uint8_t FIFO_Reg_Clear_Flags = FIFO_Reg | 0x01; Cam_SPI_write(hspi, 0x04, FIFO_Reg_Clear_Flags); // Clear FIFO Write Done Flaf @@ -172,6 +171,9 @@ void Cam_Start_Capture(SPI_HandleTypeDef *hspi) FIFO_Reg_Clear_Flags = FIFO_Reg | 0x20; Cam_SPI_write(hspi, 0x04, FIFO_Reg_Clear_Flags); // Reset FIFO Read Pointer Cam_SPI_write(hspi, 0x04, FIFO_Reg_Clear_Flags); +*/ + Cam_SPI_write(hspi, 0x04, 0x01); // Start capture + Cam_SPI_write(hspi, 0x04, 0x01); // Start capture HAL_Delay(1); Cam_SPI_write(hspi, 0x04, 0x02); // Start capture @@ -192,10 +194,12 @@ void Cam_Wait_Capture_Done(SPI_HandleTypeDef *hspi) void Cam_Start_Burst_Read(SPI_HandleTypeDef *hspi) { + /* uint8_t FIFO_Reg = Cam_SPI_read(hspi, 0x04); uint8_t FIFO_Reg_Clear_Flags = FIFO_Reg | 0x20; Cam_SPI_write(hspi, 0x04, FIFO_Reg_Clear_Flags); // Reset FIFO Read Pointer Cam_SPI_write(hspi, 0x04, FIFO_Reg_Clear_Flags); +*/ uint8_t BURST_FIFO_READ = 0x3c; uint8_t empty = 0x00; diff --git a/Firmware/Core/Src/main.c b/Firmware/Core/Src/main.c index 0c074bc..d22d61d 100644 --- a/Firmware/Core/Src/main.c +++ b/Firmware/Core/Src/main.c @@ -127,7 +127,7 @@ void cdc_task(void) } */ -uint8_t sendT[600] = { +uint8_t sendT[700] = { 0xff, 0xd8, 0xff, 0xdb, 0x00, 0x43, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, @@ -166,7 +166,14 @@ uint8_t sendT[600] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; /* @@ -274,18 +281,19 @@ int main(void) uint16_t image_size = Cam_FIFO_length(&hspi1); uint8_t image_data[10000]; - //memset(image_data, 0x00, image_size); + memset(image_data, 0x00, 10000); Cam_Start_Burst_Read(&hspi1); - HAL_SPI_Receive_DMA(&hspi1, image_data, image_size); - //HAL_SPI_Receive(&hspi1, image_data, image_size, HAL_MAX_DELAY); + //HAL_SPI_Receive_DMA(&hspi1, image_data, 10000); + HAL_SPI_Receive(&hspi1, image_data, 10000, HAL_MAX_DELAY); + LED_On(); while (SPI_Rx_Done_Flag == 0) { // Wait for SPI transfer to finish + break; } - LED_On(); CS_Off(); SPI_Rx_Done_Flag = 0; @@ -298,12 +306,15 @@ int main(void) tud_task(); - if(currentSendingIndex >= 9989){ + if(currentSendingIndex >= 9949){ //if(false){ currentSendingIndex = 0; //free(image_data); - Cam_Capture(&hspi1); + for(int i = 0; i < 10000; i++) image_data[i] = 0x00; + Cam_Init(&hi2c1, &hspi1); + + Cam_Capture(&hspi1); image_size = Cam_FIFO_length(&hspi1); @@ -312,29 +323,31 @@ int main(void) Cam_Start_Burst_Read(&hspi1); - HAL_SPI_Receive_DMA(&hspi1, image_data, 10000); + HAL_SPI_Receive(&hspi1, image_data, 10000, HAL_MAX_DELAY); //Debug_LED_On(); while (SPI_Rx_Done_Flag == 0) { // Wait for SPI transfer to finish - tud_task(); + //tud_task(); + break; } + CS_Off(); - SPI_Rx_Done_Flag = 0; + //SPI_Rx_Done_Flag = 0; if(image_size < 1){ - currentSendingIndex = 10000; + currentSendingIndex = 10000; + LED_On(); } } else { - LED_On(); //tud_cdc_write("11111111\r\n", 10); //tud_cdc_write_flush(); - //tud_cdc_write(&sendT[currentSendingIndex], 10); - tud_cdc_write(&image_data[currentSendingIndex], 10); + //tud_cdc_write(&sendT[currentSendingIndex], 50); + tud_cdc_write(&image_data[currentSendingIndex], 50); tud_cdc_write_flush(); - currentSendingIndex = currentSendingIndex + 10; + currentSendingIndex = currentSendingIndex + 50; HAL_Delay(5); } diff --git a/Receiver/Displayer.cpp b/Receiver/Displayer.cpp index c4bdf24..9303ba2 100644 --- a/Receiver/Displayer.cpp +++ b/Receiver/Displayer.cpp @@ -33,7 +33,6 @@ int Displayer::renderWindow(){ int Displayer::imageFromVector(std::vector* img){ imageRwops = SDL_RWFromMem(img->data(), img->size()); - return 0; } diff --git a/Receiver/ImageView.cpp b/Receiver/ImageView.cpp deleted file mode 100644 index c405a00..0000000 --- a/Receiver/ImageView.cpp +++ /dev/null @@ -1,138 +0,0 @@ -#include "ImageView.hpp" - -int createWindow(SDL_Window** windowPtr){ - if (SDL_Init(SDL_INIT_VIDEO) < 0) { - SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Failed to initialize SDL: %s", SDL_GetError()); - return 1; - } - - // Create a window - SDL_Window* window = SDL_CreateWindow("Image Viewer", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1920, 1080, SDL_WINDOW_SHOWN); - if (!window) { - SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Failed to create window: %s", SDL_GetError()); - SDL_Quit(); - return 1; - } - - *windowPtr = window; - - return 0; -} -int renderWindow(SDL_Renderer** rendererPtr, SDL_Window* window){ - SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, 0); - if (!renderer) { - SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Failed to create renderer: %s", SDL_GetError()); - SDL_DestroyWindow(window); - SDL_Quit(); - return 1; - } - - *rendererPtr = renderer; - return 0; -} - -int imageFromVector(SDL_RWops** imageRwopsPtr, std::vector* img){ - SDL_RWops* imageRwops = SDL_RWFromMem(img->data(), img->size()); - - *imageRwopsPtr = imageRwops; - return 0; -} - -int createImageSurface(SDL_Surface** imageSurfacePtr, SDL_RWops* imageRwops){ - SDL_Surface* imageSurface = IMG_Load_RW(imageRwops, 0); - if (!imageSurface) { - SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Failed to load image: %s", IMG_GetError()); - //SDL_DestroyRenderer(renderer); - //SDL_DestroyWindow(window); - SDL_Quit(); - return 1; - } - - *imageSurfacePtr = imageSurface; - return 0; -} - -int textureFromSurface(SDL_Texture** texturePtr, SDL_Renderer** renderer, SDL_Surface** imageSurface){ - SDL_Texture* texture = SDL_CreateTextureFromSurface(*renderer, *imageSurface); - SDL_FreeSurface(*imageSurface); - if (!texture) { - SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Failed to create texture: %s", SDL_GetError()); - //SDL_DestroyRenderer(renderer); - //SDL_DestroyWindow(window); - SDL_Quit(); - return 1; - } - - *texturePtr = texture; - return 0; -} - -int windowDestroy(SDL_Window** windowPtr, SDL_Texture** texturePtr, SDL_Renderer** rendererPtr){ - SDL_DestroyTexture(*texturePtr); - SDL_DestroyRenderer(*rendererPtr); - SDL_DestroyWindow(*windowPtr); - SDL_Quit(); - return 0; -} - - -int windowLoop(SDL_Renderer** rendererPtr, - int* currentBufferIndex, - std::mutex& currentBufferIndexMutex, - SDL_Texture** texturePtr1, - SDL_Texture** texturePtr2, - SDL_Texture** texturePtr3){ - bool quit = false; - while (!quit) { - SDL_Event event; - while (SDL_PollEvent(&event)) { - if (event.type == SDL_QUIT) { - quit = true; - } - } - - SDL_RenderClear(*rendererPtr); - currentBufferIndexMutex.lock(); - switch(*currentBufferIndex) { - case 0: - SDL_RenderCopy(*rendererPtr, *texturePtr1, NULL, NULL); - break; - case 1: - SDL_RenderCopy(*rendererPtr, *texturePtr2, NULL, NULL); - break; - case 2: - SDL_RenderCopy(*rendererPtr, *texturePtr3, NULL, NULL); - break; - default: - std::cout << "error 18" << std::endl; - break; - } - currentBufferIndexMutex.unlock(); - - SDL_RenderPresent(*rendererPtr); - } - - return 0; -} - -int vectorToTexture(SDL_Renderer** rendererPtr, - SDL_RWops** imageRwopsPtr, - SDL_Surface** imageSurfacePtr, - SDL_Texture** texturePtr, - std::vector* img){ - - imageFromVector(imageRwopsPtr, img); - createImageSurface(imageSurfacePtr, *imageRwopsPtr); - textureFromSurface(texturePtr, rendererPtr, imageSurfacePtr); - - return 0; -} - -int flipThroughTextures(int * currentTexture, std::mutex& currentTextureMutex){ - while(1){ - currentTextureMutex.lock(); - *currentTexture = *currentTexture + 1; - *currentTexture %=3; - currentTextureMutex.unlock(); - } -} \ No newline at end of file diff --git a/Receiver/ImageView.hpp b/Receiver/ImageView.hpp deleted file mode 100644 index 7402cd4..0000000 --- a/Receiver/ImageView.hpp +++ /dev/null @@ -1,23 +0,0 @@ -#include "main.hpp" - -int createWindow(SDL_Window** windowPtr); -int renderWindow(SDL_Renderer** rendererPtr, SDL_Window* window); -int imageFromVector(SDL_RWops** imageRwopsPtr, std::vector* img); -int createImageSurface(SDL_Surface** imageSurfacePtr, SDL_RWops* imageRwops); -int textureFromSurface(SDL_Texture** texturePtr, SDL_Renderer** renderer, SDL_Surface** imageSurface); - -int windowDestroy(SDL_Window** windowPtr, SDL_Texture** texturePtr, SDL_Renderer** rendererPtr); -int windowLoop( SDL_Renderer** rendererPtr, - int* currentBufferIndex, - std::mutex& currentBufferIndexMutex, - SDL_Texture** texturePtr1, - SDL_Texture** texturePtr2, - SDL_Texture** texturePtr3); - -int vectorToTexture(SDL_Renderer** rendererPtr, - SDL_RWops** imageRwopsPtr, - SDL_Surface** imageSurfacePtr, - SDL_Texture** texturePtr, - std::vector* img); - -int flipThroughTextures(int * currentTexture, std::mutex& currentTextureMutex); \ No newline at end of file diff --git a/Receiver/Receiver.cpp b/Receiver/Receiver.cpp index f6690bc..286da3a 100644 --- a/Receiver/Receiver.cpp +++ b/Receiver/Receiver.cpp @@ -11,7 +11,7 @@ void Receiver::printHex(unsigned char value) { void Receiver::openStream(){ while(1){ // Open the CDC device file for reading - cdcFile = open("/dev/ttyACM0", O_RDWR | O_NOCTTY); + cdcFile = open("/dev/ttyACM1", O_RDWR | O_NOCTTY); if(cdcFile == -1){ std::cerr << "Failed to open CDC device file" << std::endl; std::this_thread::sleep_for(std::chrono::milliseconds(500)); @@ -50,13 +50,12 @@ int Receiver::initSerial(){ } std::cout << "OPENED!" << std::endl; - //tcflush(cdcFile, TCIFLUSH); return 1; } -int Receiver::readCdcData(unsigned char (*character)[10]) { - memset(*character, 0x00, 10); - int bytesRead = read(cdcFile, character, 10); +int Receiver::readCdcData(uint8_t (*character)[50]) { + memset(*character, 0x00, 50); + int bytesRead = read(cdcFile, character, 50); if (bytesRead == -1) { std::cerr << "Error in read" << std::endl; return -1; @@ -65,18 +64,22 @@ int Receiver::readCdcData(unsigned char (*character)[10]) { std::cerr << "Error in read" << std::endl; return -1; } - for(int i = 0; i<10; i++) + + /* PRINT WHAT IS RECEIVED + for(int i = 0; i<50; i++) { printHex((*character)[i]); //std::cout << unsigned(character[i]); - //std::cout << " "; + std::cout << " "; } - std::cout << std::endl; + std::cout << std::endl << std::endl; + */ + return 0; } -int Receiver::simulateRead(unsigned char (*character)[10]){ - memset(*character, 0x00, 10); +int Receiver::simulateRead(unsigned char (*character)[50]){ + memset(*character, 0x00, 50); int firstLen = (int)t1.size(); int secondLen = (int)t2.size(); @@ -90,7 +93,7 @@ int Receiver::simulateRead(unsigned char (*character)[10]){ vecId = 2; } - for(int i=0; i<10; i++){ + for(int i=0; i<50; i++){ if(vecId == 1){ if(simulateIdx > firstLen){ (*character)[i] = 0x00; @@ -105,7 +108,6 @@ int Receiver::simulateRead(unsigned char (*character)[10]){ (*character)[i] = 0x00; } else{ - //printHex(t1[simulateIdx-firstLen]); (*character)[i] = t2[simulateIdx-firstLen-1]; simulateIdx++; } @@ -116,30 +118,50 @@ int Receiver::simulateRead(unsigned char (*character)[10]){ } int Receiver::fillBuffer(){ - unsigned char character[10]; + unsigned char character[50]; std::vector tempVec{}; Receiver::readCdcData(&character); - //Receiver::simulateRead(&character); - - while(Receiver::findStart(&character) == -1) Receiver::readCdcData(&character); //Receiver::simulateRead(&character); + int i = -1; + do { + Receiver::readCdcData(&character); + i = Receiver::findStart(&character); + } + while(i == -1); - tempVec.insert(tempVec.end(), character, character + sizeof(character)); + tempVec.insert(tempVec.end(), &character[i], character + sizeof(character)); + i = -1; do{ Receiver::readCdcData(&character); - //Receiver::simulateRead(&character); + i = findEnd(&character); + if(i == -1) tempVec.insert(tempVec.end(), character, character + sizeof(character)); } - while(findEnd(&character) == -1); + while(i == -1); + + tempVec.insert(tempVec.end(), character, character + i + 2); + + //////////// SAVE FRAMES TO FILES + /* + std::ofstream outfile(std::to_string(debugFileIdx) + ".jpg", std::ios::out | std::ios::binary); + if (!outfile.is_open()) { + std::cerr << "Failed to create file " << debugFileIdx << ".jpg" << std::endl; + return 1; + } + outfile.write(reinterpret_cast(tempVec.data()), tempVec.size()); + outfile.close(); + debugFileIdx++; + */ + //////////// + currentBufferIndexMutex.lock(); currentBufferIndex++; currentBufferIndex %= 3; currentBufferIndexMutex.unlock(); - std::cout << "=" << currentBufferIndex; switch(currentBufferIndex){ case 0: buffer1 = tempVec; @@ -154,8 +176,6 @@ int Receiver::fillBuffer(){ std::cout << "error 25" << std::endl; } - //for(int i=0; i<(int)tempVec.size(); i++) printHex(tempVec[i]); - //std::cout << std::endl; return 1; } @@ -178,36 +198,39 @@ void Receiver::bufferToDisplay(){ } } -int Receiver::findSequence(unsigned char (*str)[10], unsigned char ch1, unsigned char ch2){ +void Receiver::initTextures(){ + dis->vectorToTexture(&buffer_initial); + dis->vectorToTexture(&buffer_initial); + dis->vectorToTexture(&buffer_initial); + dis->vectorToTexture(&buffer_initial); +} + +int Receiver::findSequence(unsigned char (*str)[50], unsigned char ch1, unsigned char ch2){ if(sequenceEndedFF){ sequenceEndedFF = 0; if((*str)[0] == ch2){ return 0; } } - for(int i=0; i<10; i++){ - if((*str)[i] == ch1 && i < 10){ + for(int i=0; i<50; i++){ + if((*str)[i] == ch1 && i < 50){ if((*str)[i+1] == ch2){ return i; } } } - if((*str)[9] == 0xFF) sequenceEndedFF = 1; + if((*str)[49] == 0xFF) sequenceEndedFF = 1; return -1; } -int Receiver::findStart(unsigned char (*str)[10]){ +int Receiver::findStart(unsigned char (*str)[50]){ int res = findSequence(str, 0xFF, 0xD8); - //if(res != -1)std::cout << "s"; return res; - //return findSequence(str, 0xFF, 0xD8); } -int Receiver::findEnd(unsigned char (*str)[10]){ +int Receiver::findEnd(unsigned char (*str)[50]){ int res = findSequence(str, 0xFF, 0xD9); - //if(res != -1)std::cout << "f"; return res; - //return findSequence(str, 0xFF, 0xD9); } diff --git a/Receiver/Receiver.hpp b/Receiver/Receiver.hpp index 615743f..490bfe5 100644 --- a/Receiver/Receiver.hpp +++ b/Receiver/Receiver.hpp @@ -10,6 +10,40 @@ class Receiver{ struct termios tty; int currentBufferIndex = 0; std::mutex currentBufferIndexMutex; + std::vector buffer_initial{ + 0xff, 0xd8, 0xff, 0xdb, 0x00, 0x43, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0x00, 0x43, 0x01, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x11, + 0x08, 0x00, 0x60, 0x00, 0x80, 0x03, 0x01, 0x21, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, 0x01, 0xff, + 0xda, 0x00, 0x0c, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f, 0x00, 0x92, 0x8a, 0x00, + 0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45, + 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89, + 0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, + 0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25, + 0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, + 0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1, + 0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00, + 0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45, + 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89, + 0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, + 0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25, + 0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, + 0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1, + 0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00, + 0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45, + 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89, + 0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, + 0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25, + 0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, + 0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1, + 0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x19, 0xff, 0xd9 + }; std::vector buffer1; std::vector buffer2; std::vector buffer3; @@ -17,21 +51,23 @@ class Receiver{ int sequenceEndedFF = 0; int simulateIdx = 0; - + + int debugFileIdx = 0; public: Receiver(Displayer *displayerPtr); void openStream(); int initSerial(); - int readCdcData(unsigned char (*character)[10]); + int readCdcData(unsigned char (*character)[50]); void printHex(unsigned char value); int fillBuffer(); void bufferToDisplay(); + void initTextures(); - int findSequence(unsigned char (*str)[10], unsigned char ch1, unsigned char ch2); - int findStart(unsigned char (*str)[10]); - int findEnd(unsigned char (*str)[10]); + int findSequence(unsigned char (*str)[50], unsigned char ch1, unsigned char ch2); + int findStart(unsigned char (*str)[50]); + int findEnd(unsigned char (*str)[50]); - int simulateRead(unsigned char (*character)[10]); + int simulateRead(unsigned char (*character)[50]); }; \ No newline at end of file diff --git a/Receiver/Transfer.cpp b/Receiver/Transfer.cpp deleted file mode 100644 index 646dbca..0000000 --- a/Receiver/Transfer.cpp +++ /dev/null @@ -1,70 +0,0 @@ -#include "Transfer.hpp" - -void printHex(unsigned char value) { - std::cout << "0x" << std::hex << std::setfill('0') << std::setw(2) << static_cast(value); -} - -void openStream(int *cdcFile){ - while(1){ - // Open the CDC device file for reading - *cdcFile = open("/dev/ttyACM1", O_RDWR | O_NOCTTY); - if (*cdcFile != -1) { - return; - } - std::cerr << "Failed to open CDC device file" << std::endl; - } -} - -int initSerial(struct termios *tty, int *cdcFile){ - memset(tty, 0, sizeof(*tty)); - if (tcgetattr(*cdcFile, tty) != 0) { - std::cerr << "Error in tcgetattr" << std::endl; - return -1; - } - tcflush(*cdcFile, TCIFLUSH); - cfsetospeed(tty, B115200); - cfsetispeed(tty, B115200); - tty->c_cflag |= (CLOCAL | CREAD); - tty->c_cflag &= ~CSIZE; - tty->c_cflag |= CS8; - tty->c_cflag &= ~PARENB; - tty->c_cflag &= ~CSTOPB; - tty->c_cflag &= ~CRTSCTS; - tty->c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); - tty->c_iflag &= ~(IXON | IXOFF | IXANY); - tty->c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL); - tty->c_oflag &= ~OPOST; - tty->c_cc[VMIN] = 1; - tty->c_cc[VTIME] = 0; - if (tcsetattr(*cdcFile, TCSANOW, tty) != 0) { - std::cerr << "Error in tcsetattr" << std::endl; - return -1; - } - - std::cout << "OPENED!" << std::endl; - tcflush(*cdcFile, TCIFLUSH); - return 1; -} - -int readCdcData(int * cdcFile) { - - unsigned char character[10]; - memset(character, 0x00, 10); - // Read data from the CDC device file into the buffer - int bytesRead = read(*cdcFile, character, 10); - if (bytesRead == -1) { - std::cerr << "Error in read" << std::endl; - return -1; - } - for(int i = 0; i<10; i++) - { - printHex(character[i]); - //std::cout << unsigned(character[i]); - std::cout << " "; - } - - std::cout << std::endl; - std::cout << std::endl; - - return bytesRead; -} diff --git a/Receiver/Transfer.hpp b/Receiver/Transfer.hpp deleted file mode 100644 index fd6bd7b..0000000 --- a/Receiver/Transfer.hpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "main.hpp" - -void printHex(unsigned char value); -void openStream(int *cdcFile); -int initSerial(struct termios *tty, int *cdcFile); -int readCdcData(int * cdcFile); \ No newline at end of file diff --git a/Receiver/main.cpp b/Receiver/main.cpp index f67d53a..47105fe 100644 --- a/Receiver/main.cpp +++ b/Receiver/main.cpp @@ -5,29 +5,23 @@ #include "Displayer.hpp" #endif -#include "Transfer.hpp" - - int cdcFile; - struct termios tty; + int cdcFile; void readLoop(Receiver ** receiverPtr){ - std::cout << "1" << std::endl; (*receiverPtr)->openStream(); - std::cout << "2" << std::endl; (*receiverPtr)->initSerial(); - std::cout << "3" << std::endl; while (true) { - unsigned char character[10]; + unsigned char character[50]; (*receiverPtr)->readCdcData(&character); if((*receiverPtr)->findStart(&character) != -1) {std::cout << "start" << std::endl;} else if((*receiverPtr)->findEnd(&character) != -1) {std::cout << "stop" << std::endl;} else{ - std::cout << "-"; + std::cout << "-"; } - std::this_thread::sleep_for(std::chrono::milliseconds(20)); + std::this_thread::sleep_for(std::chrono::milliseconds(5)); } close(cdcFile); @@ -42,7 +36,7 @@ void receiverLoop(Receiver ** receiverPtr){ while(1){ (*receiverPtr)->fillBuffer(); (*receiverPtr)->bufferToDisplay(); - std::this_thread::sleep_for(std::chrono::milliseconds(20)); + std::this_thread::sleep_for(std::chrono::milliseconds(5)); } } @@ -51,12 +45,15 @@ int main() Displayer dis; Receiver *rec = new Receiver(&dis); - /* + dis.createWindow(); dis.renderWindow(); rec->openStream(); rec->initSerial(); + + rec->initTextures(); + rec->fillBuffer(); rec->bufferToDisplay(); @@ -65,7 +62,7 @@ int main() dis.windowLoop(); t1.join(); - */ + readLoop(&rec); return 0; diff --git a/Receiver/main.hpp b/Receiver/main.hpp index 63a1d39..0f94b82 100644 --- a/Receiver/main.hpp +++ b/Receiver/main.hpp @@ -12,4 +12,5 @@ #include #include #include -#include \ No newline at end of file +#include +#include \ No newline at end of file