Hote_CDC_C/Host_cdc_usb.c

103 lines
3.2 KiB
C

#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include "Messages.h"
time_t rawtime;
struct tm * timeinfo;
void envoi_données(uint8_t * données, unsigned int taille_données, FILE *fp){
for(int i=0; i<taille_données; i++ ){
fputc(données[i], fp);
printf("0x%02x ", données[i]);
}
}
void envoi_données_protocole(uint8_t * données, unsigned int taille_données, FILE *fp){
fputc(0xFF, fp);printf("0xFF ");
fputc(0xFF, fp);printf("0xFF ");
fputc(taille_données + 1, fp);printf("%d ", taille_données + 1);
envoi_données(données, taille_données,fp);
fputc(0x00, fp); printf("0x00 ");
fputc('\n', fp); // Besoin du '\n' pour que la trame soit réellement expédiée (avant d'avoir fini de remplir le tampon)
printf("\n");
}
/// @brief Envoie des données, de l'entête et du caractère de fin du message
/// @param données
/// @param taille_données
/// @param fp
void envoi_données_applicatives(uint8_t commande, uint8_t id_carte, uint8_t adresse_reg, uint8_t * données, unsigned int taille_données, FILE *fp){
struct message_applicatif_t message_applicatif;
message_applicatif.commande = commande;
message_applicatif.id_carte = id_carte;
message_applicatif.adresse_registre = adresse_reg;
message_applicatif.taille_donnees = taille_données;
memcpy(message_applicatif.donnees_applicative.donnees, données, taille_données);
envoi_données_protocole((uint8_t *) &message_applicatif, taille_données + 4, fp);
}
int main(){
FILE *fp;
time_t rawtime, rawtime_old;
time ( &rawtime );
rawtime_old =0;
char on=1;
char filename[] = "/dev/ttyACM0";
printf("Host cdc USB\n");
fp = fopen(filename, "w");
if(fp == NULL){
printf("Open failed: %s\n", filename);
return 1;
}else{
printf("Open success: %s\n", filename);;
}
int my_char;
while(1){
time ( &rawtime );
if(rawtime > rawtime_old +2){
rawtime_old = rawtime;
struct msg_propulsion_position_t msg_propulsion_position;
msg_propulsion_position.position_x_mm = 1.5;
msg_propulsion_position.position_y_mm = 2.5;
msg_propulsion_position.orientation_rad = -3;
uint8_t données_led[10];
données_led[0]='r';
données_led[1]='D';
données_led[2]=0x00;
données_led[3]=0x01;
if(on){
données_led[4]=0x25;
}else{
données_led[4]=0x05;
}
on = !on;
//envoi_données_protocole(données_led, 5, fp);
//envoi_données_applicatives('r', 'D', 0, &données_led[4], 1, fp);
printf("envoi message\n");
envoi_données_applicatives('r', 'P', 0, (uint8_t *) &msg_propulsion_position, sizeof(msg_propulsion_position), fp);
}
}
// Lecture de la liaison série (décodage hexa)
do{
my_char = fgetc(fp);
printf("%02x ", my_char);
if(my_char == '\n'){
printf("\n");
}
}while(my_char != EOF);
printf("fin de lecture\n");
fclose(fp);
}