Reception de deux CDC

This commit is contained in:
Samuel 2025-08-30 16:28:58 +02:00
parent 30d00993a0
commit 57f6bf657d
5 changed files with 97 additions and 38 deletions

View File

@ -61,6 +61,16 @@ void cdc_app_task(void) {
} }
} }
} }
for (uint8_t idx = 0; idx < CFG_TUH_CDC; idx++) {
if (tuh_cdc_mounted(idx)) {
char chaine[1024];
log_get(idx, chaine);
if(strlen(chaine)> 0){
printf("%s", chaine);
}
}
}
} }
//--------------------------------------------------------------------+ //--------------------------------------------------------------------+
@ -73,33 +83,16 @@ void tuh_cdc_rx_cb(uint8_t idx) {
printf("already processing data\n"); printf("already processing data\n");
return; return;
} }
absolute_time_t current_time_us, start_time_us;
start_time_us = get_absolute_time();
in_transfert_cb = 1; in_transfert_cb = 1;
uint8_t buf[64 + 1]; // +1 for extra null character uint8_t buf[64 + 1]; // +1 for extra null character
char chaine[1024];
uint32_t const bufsize = sizeof(buf) - 1; uint32_t const bufsize = sizeof(buf) - 1;
// forward cdc interfaces -> console // forward cdc interfaces -> console
uint32_t count = tuh_cdc_read(idx, buf, bufsize); uint32_t count = tuh_cdc_read(idx, buf, bufsize);
buf[count] = 0; buf[count] = 0;
log_analyse_input_string(buf, count);
log_get(chaine);
current_time_us = get_absolute_time();
if(strlen(chaine)> 0){
printf("%s", chaine);
printf(">temp_rec:%d\n", current_time_us);
chaine[0] = '\0';
}
log_analyse_input_string(idx, buf, count);
in_transfert_cb = 0; in_transfert_cb = 0;
} }
@ -111,6 +104,7 @@ void tuh_cdc_mount_cb(uint8_t idx) {
printf("CDC Interface is mounted: address = %u, itf_num = %u\r\n", itf_info.daddr, printf("CDC Interface is mounted: address = %u, itf_num = %u\r\n", itf_info.daddr,
itf_info.desc.bInterfaceNumber); itf_info.desc.bInterfaceNumber);
log_create(idx);
#ifdef CFG_TUH_CDC_LINE_CODING_ON_ENUM #ifdef CFG_TUH_CDC_LINE_CODING_ON_ENUM
// If CFG_TUH_CDC_LINE_CODING_ON_ENUM is defined, line coding will be set by tinyusb stack // If CFG_TUH_CDC_LINE_CODING_ON_ENUM is defined, line coding will be set by tinyusb stack
@ -134,4 +128,6 @@ void tuh_cdc_umount_cb(uint8_t idx) {
printf("CDC Interface is unmounted: address = %u, itf_num = %u\r\n", itf_info.daddr, printf("CDC Interface is unmounted: address = %u, itf_num = %u\r\n", itf_info.daddr,
itf_info.desc.bInterfaceNumber); itf_info.desc.bInterfaceNumber);
log_destroy(idx);
} }

View File

@ -1,27 +1,76 @@
#include <string.h> #include <string.h>
#include "pico/platform/panic.h"
#define NB_MAX_CDC_CONNEXION 10
#define INVALID_ID ((char)-1)
struct log_buffer_t{
char idx;
char copy_active;
char tampon[1020]; char tampon[1020];
char log_dispo[1020]={'\0'}; char log_dispo[1020];
unsigned int index_tampon=0; unsigned int index_tampon;
}log_buffer[10];
void log_analyse_input_string(const char * input_data, unsigned int str_len){ static struct log_buffer_t * get_buffer(const char idx);
static struct log_buffer_t * get_buffer(const char idx){
for (int i=0; i<NB_MAX_CDC_CONNEXION; i++){
if(log_buffer[i].idx == idx){
return &(log_buffer[i]);
}
}
/// TODO: panic ?
panic("Buffer IDX not found: %d\n", idx);
return NULL;
}
/// @brief Initialisation des structure de reception des données USB-CDC
void log_init(){
for (int i=0; i<NB_MAX_CDC_CONNEXION; i++){
log_buffer[i].log_dispo[0] = '\0';
log_buffer[i].index_tampon = 0;
log_buffer[i].copy_active = 0;
log_buffer[i].idx = INVALID_ID;
}
}
/// @brief Affectation des tampons de reception à une liaison USB-CDC
/// @param idx :
void log_create(const char idx){
for (int i=0; i<NB_MAX_CDC_CONNEXION; i++){
if(log_buffer[i].idx == INVALID_ID){
log_buffer[i].idx = idx;
return;
}
}
panic("Creation impossible: idx: %d\n", idx);
}
void log_destroy(const char idx){
struct log_buffer_t * p_log_bufffer;
p_log_bufffer = get_buffer(idx);
p_log_bufffer->idx = INVALID_ID;
}
void log_analyse_input_string(const char idx, const char * input_data, unsigned int str_len){
// On charge les données dans le tampon // On charge les données dans le tampon
// Si on a un message complet, on charge dans log dispo (s'il y a la place) // Si on a un message complet, on charge dans log dispo (s'il y a la place)
static int copy = 0; struct log_buffer_t * p_log_bufffer;
p_log_bufffer = get_buffer(idx);
for(int i=0; i< str_len; i++){ for(int i=0; i< str_len; i++){
if(input_data[i] == '>'){ if(input_data[i] == '>'){
copy = 1; p_log_bufffer->copy_active = 1;
} }
if(copy == 1){ if(p_log_bufffer->copy_active == 1){
tampon[index_tampon] = input_data[i]; p_log_bufffer->tampon[p_log_bufffer->index_tampon] = input_data[i];
index_tampon++; p_log_bufffer->index_tampon++;
if(input_data[i] == '\n'){ if(input_data[i] == '\n'){
copy = 0; p_log_bufffer->copy_active = 0;
tampon[index_tampon] = '\0'; p_log_bufffer->tampon[p_log_bufffer->index_tampon] = '\0';
strcat(log_dispo, tampon); strcat(p_log_bufffer->log_dispo, p_log_bufffer->tampon);
index_tampon=0; p_log_bufffer->index_tampon=0;
} }
} }
@ -29,9 +78,16 @@ void log_analyse_input_string(const char * input_data, unsigned int str_len){
} }
// On renvoi la chaine et on remet log_dispo à 0; // On renvoi la chaine et on remet log_dispo à 0;
void log_get(char * chaine){ void log_get(const char idx, char * chaine){
strcpy(chaine, log_dispo); struct log_buffer_t * p_log_bufffer;
log_dispo[0] = '\0'; p_log_bufffer = get_buffer(idx);
if(p_log_bufffer == NULL){
chaine[0] = '\0';
return;
}
strcpy(chaine, p_log_bufffer->log_dispo);
p_log_bufffer->log_dispo[0] = '\0';
} }

View File

@ -1,2 +1,6 @@
void log_analyse_input_string(char * input_data, unsigned int str_len);
void log_get(char * chaine); void log_init(void);
void log_create(const char idx);
void log_destroy(const char idx);
void log_analyse_input_string(const char idx, char * input_data, unsigned int str_len);
void log_get(const char idx, char * chaine);

3
main.c
View File

@ -32,6 +32,7 @@
#include "tusb.h" #include "tusb.h"
#include "ff.h" #include "ff.h"
#include "f_util.h" #include "f_util.h"
#include "log_usb.h"
//--------------------------------------------------------------------+ //--------------------------------------------------------------------+
// MACRO CONSTANT TYPEDEF PROTYPES // MACRO CONSTANT TYPEDEF PROTYPES
@ -109,6 +110,8 @@ int main(void) {
printf("TinyUSB Host CDC MSC HID Example - test comparatif\r\n"); printf("TinyUSB Host CDC MSC HID Example - test comparatif\r\n");
// init host stack on configured roothub port // init host stack on configured roothub port
// à mettre avant tuh_init
log_init();
tuh_init(BOARD_TUH_RHPORT); tuh_init(BOARD_TUH_RHPORT);
if (board_init_after_tusb) { if (board_init_after_tusb) {

View File

@ -102,7 +102,7 @@
#define CFG_TUH_ENUMERATION_BUFSIZE 256 #define CFG_TUH_ENUMERATION_BUFSIZE 256
#define CFG_TUH_HUB 1 // number of supported hubs #define CFG_TUH_HUB 1 // number of supported hubs
#define CFG_TUH_CDC 1 // CDC ACM #define CFG_TUH_CDC 3 // CDC ACM
#define CFG_TUH_CDC_FTDI 1 // FTDI Serial. FTDI is not part of CDC class, only to re-use CDC driver API #define CFG_TUH_CDC_FTDI 1 // FTDI Serial. FTDI is not part of CDC class, only to re-use CDC driver API
#define CFG_TUH_CDC_CP210X 1 // CP210x Serial. CP210X is not part of CDC class, only to re-use CDC driver API #define CFG_TUH_CDC_CP210X 1 // CP210x Serial. CP210X is not part of CDC class, only to re-use CDC driver API
#define CFG_TUH_CDC_CH34X 1 // CH340 or CH341 Serial. CH34X is not part of CDC class, only to re-use CDC driver API #define CFG_TUH_CDC_CH34X 1 // CH340 or CH341 Serial. CH34X is not part of CDC class, only to re-use CDC driver API