![](/media/cache/profiles/Felicito_-_New_Avatar.jpg.50x50_q85.jpg)
Proyecto ABInBev para la tarjeta Guaria 1/2.
Teltonika/teltonika_fmu130.cpp
- Committer:
- fmanzano_dtk
- Date:
- 2022-07-07
- Revision:
- 19:5580a9a54ad5
- Parent:
- 1:9e821e640117
File content as of revision 19:5580a9a54ad5:
/** * @file teltonika_fmu130.cpp * @author Felícito Manzano (felicito.manzano@detektor.com.sv) * @brief * @version 0.1 * @date 2020-09-28 * * @copyright Copyright (c) 2020 * */ #include "BufferedSerial.h" #include "mbed.h" #include "teltonika_crc.hpp" // extern Serial //myPC_debug. // COMMANDS /** * @brief * */ const int FMU130_COMMAND = 65; const int SERVER_COMMAND = 64; const char FMU130_HEADER[] = {0x42, 0x54, 0x46, 0x4D, '\0'}; const int DESTINATION_SERVER = 0x01; const int DESTINATION_FMU130 = 0x00; /** * @brief * * @param puertoCOM * @param m_buffer * @return int */ int read_avl_uart(BufferedSerial *puertoCOM, char m_buffer[1024]) { int w = 0; wait_us(10000); while (puertoCOM -> readable()) { char incoming_char = puertoCOM -> getc(); m_buffer[w] = incoming_char; w++; } wait_us(600000); while (puertoCOM -> readable()) { char incoming_char = puertoCOM -> getc(); m_buffer[w] = incoming_char; w++; } m_buffer[w] = '\0'; return(w); } /** * @brief * * @param m_buffer * @return int */ int identify_fmu130_payload(char m_buffer[1024]) { int type_of_payload = -1; char *pch; pch = strchr(m_buffer, FMU130_COMMAND); if (pch!=NULL) { type_of_payload = 1; } pch = strchr(m_buffer, SERVER_COMMAND); if (pch!=NULL) { type_of_payload = 2; } return(type_of_payload); } /** * @brief * * @param m_buffer * @param puertoCOM * @return true * @return false */ bool tx_fmu130_message(char m_buffer[64], BufferedSerial *puertoCOM) { /** * @brief Nota sobre el Formateador %04hhX * Se utiliza el 0 para indicar que se deben mostrar los ceros a la izquierda * Se utiliza el 4 para indicar que se deben mostrar cuatro caracteres en total * Se utilizan las dos letras h para indicar que el argumento es unsigned char * Se utiliza la X en mayúsculas para indicar que se utilizará mayúsculas para héxadecimal */ int j = (strlen(m_buffer)); int k = j+3; char i = 0x00; char tx_message[128]; char middle_message[128]; int my_buff_length = 0; // Ensamble de cadena parcial desde Length hasta el Payload //myPC_debug.printf("\r\nPayload: %s\r\n", m_buffer); //myPC_debug.printf("Longitud Payload: %d\r\n", j); sprintf(middle_message, "%c%c%c%s", DESTINATION_SERVER, i , j, m_buffer); int resultCRC = teltonika_crc16(middle_message,k); //myPC_debug.printf("CRC = %d - %04x\r\n", resultCRC, resultCRC); int hi_CRC = ((resultCRC & 0xFF00)>>8); int lo_CRC = resultCRC & 0x00FF; // Ensamble de trama final my_buff_length = sprintf(tx_message, "%s%c%c%c%s%c%c", FMU130_HEADER, DESTINATION_SERVER, i , j, m_buffer, hi_CRC, lo_CRC); puertoCOM->write(tx_message, my_buff_length); return(true); } bool tx_fmu130_command(const char m_buffer[64], BufferedSerial *puertoCOM) { int j = (strlen(m_buffer)); int k = j+3; char i = 0x00; char tx_message[128]; char middle_message[128]; int my_buff_length = 0; // Ensamble de cadena parcial desde Length hasta el Payload //myPC_debug.printf("\r\nPayload: %s\r\n", m_buffer); //myPC_debug.printf("Longitud Payload: %d\r\n", j); k = sprintf(middle_message, "%c%c%c%s", DESTINATION_FMU130, i , j, m_buffer); int resultCRC = teltonika_crc16(middle_message,k); //myPC_debug.printf("CRC = %d - %04x\r\n", resultCRC, resultCRC); int hi_CRC = ((resultCRC & 0xFF00)>>8); int lo_CRC = resultCRC & 0x00FF; // Ensamble de trama final my_buff_length = sprintf(tx_message, "%s%c%c%c%s%c%c", FMU130_HEADER, DESTINATION_FMU130, i , j, m_buffer, hi_CRC, lo_CRC); puertoCOM->write(tx_message, my_buff_length); return(true); } bool tx_fmu130_var_command(char m_buffer[30], BufferedSerial *puertoCOM) { int j = (strlen(m_buffer)); int k = j+3; char i = 0x00; char tx_message[128]; char middle_message[128]; int my_buff_length = 0; // Ensamble de cadena parcial desde Length hasta el Payload //myPC_debug.printf("\r\nPayload: %s\r\n", m_buffer); //myPC_debug.printf("Longitud Payload: %d\r\n", j); k = sprintf(middle_message, "%c%c%c%s", DESTINATION_FMU130, i , j, m_buffer); int resultCRC = teltonika_crc16(middle_message,k); //myPC_debug.printf("CRC = %d - %04x\r\n", resultCRC, resultCRC); int hi_CRC = ((resultCRC & 0xFF00)>>8); int lo_CRC = resultCRC & 0x00FF; // Ensamble de trama final my_buff_length = sprintf(tx_message, "%s%c%c%c%s%c%c", FMU130_HEADER, DESTINATION_FMU130, i , j, m_buffer, hi_CRC, lo_CRC); puertoCOM->write(tx_message, my_buff_length); return(true); }