Felícito Manzano
/
DTK_Guaria2_ABInBev
Proyecto ABInBev para la tarjeta Guaria 1/2.
Embed:
(wiki syntax)
Show/hide line numbers
teltonika_fmu130.cpp
Go to the documentation of this file.
00001 /** 00002 * @file teltonika_fmu130.cpp 00003 * @author Felícito Manzano (felicito.manzano@detektor.com.sv) 00004 * @brief 00005 * @version 0.1 00006 * @date 2020-09-28 00007 * 00008 * @copyright Copyright (c) 2020 00009 * 00010 */ 00011 00012 #include "BufferedSerial.h" 00013 #include "mbed.h" 00014 #include "teltonika_crc.hpp " 00015 00016 // extern Serial //myPC_debug. 00017 00018 // COMMANDS 00019 /** 00020 * @brief 00021 * 00022 */ 00023 const int FMU130_COMMAND = 65; 00024 const int SERVER_COMMAND = 64; 00025 const char FMU130_HEADER[] = {0x42, 0x54, 0x46, 0x4D, '\0'}; 00026 const int DESTINATION_SERVER = 0x01; 00027 const int DESTINATION_FMU130 = 0x00; 00028 00029 /** 00030 * @brief 00031 * 00032 * @param puertoCOM 00033 * @param m_buffer 00034 * @return int 00035 */ 00036 int read_avl_uart (BufferedSerial *puertoCOM, char m_buffer[1024]) { 00037 int w = 0; 00038 wait_us(10000); 00039 while (puertoCOM -> readable()) { 00040 char incoming_char = puertoCOM -> getc(); 00041 m_buffer[w] = incoming_char; 00042 w++; 00043 } 00044 wait_us(600000); 00045 while (puertoCOM -> readable()) { 00046 char incoming_char = puertoCOM -> getc(); 00047 m_buffer[w] = incoming_char; 00048 w++; 00049 } 00050 m_buffer[w] = '\0'; 00051 return(w); 00052 } 00053 00054 /** 00055 * @brief 00056 * 00057 * @param m_buffer 00058 * @return int 00059 */ 00060 int identify_fmu130_payload (char m_buffer[1024]) { 00061 int type_of_payload = -1; 00062 char *pch; 00063 00064 pch = strchr(m_buffer, FMU130_COMMAND); 00065 if (pch!=NULL) { 00066 type_of_payload = 1; 00067 } 00068 00069 pch = strchr(m_buffer, SERVER_COMMAND); 00070 if (pch!=NULL) { 00071 type_of_payload = 2; 00072 } 00073 return(type_of_payload); 00074 } 00075 00076 00077 00078 00079 /** 00080 * @brief 00081 * 00082 * @param m_buffer 00083 * @param puertoCOM 00084 * @return true 00085 * @return false 00086 */ 00087 00088 bool tx_fmu130_message (char m_buffer[64], BufferedSerial *puertoCOM) { 00089 00090 00091 /** 00092 * @brief Nota sobre el Formateador %04hhX 00093 * Se utiliza el 0 para indicar que se deben mostrar los ceros a la izquierda 00094 * Se utiliza el 4 para indicar que se deben mostrar cuatro caracteres en total 00095 * Se utilizan las dos letras h para indicar que el argumento es unsigned char 00096 * Se utiliza la X en mayúsculas para indicar que se utilizará mayúsculas para héxadecimal 00097 */ 00098 00099 int j = (strlen(m_buffer)); 00100 int k = j+3; 00101 char i = 0x00; 00102 char tx_message[128]; 00103 char middle_message[128]; 00104 int my_buff_length = 0; 00105 00106 // Ensamble de cadena parcial desde Length hasta el Payload 00107 //myPC_debug.printf("\r\nPayload: %s\r\n", m_buffer); 00108 //myPC_debug.printf("Longitud Payload: %d\r\n", j); 00109 00110 sprintf(middle_message, "%c%c%c%s", DESTINATION_SERVER, i , j, m_buffer); 00111 00112 int resultCRC = teltonika_crc16(middle_message,k); 00113 //myPC_debug.printf("CRC = %d - %04x\r\n", resultCRC, resultCRC); 00114 00115 int hi_CRC = ((resultCRC & 0xFF00)>>8); 00116 int lo_CRC = resultCRC & 0x00FF; 00117 00118 // Ensamble de trama final 00119 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); 00120 puertoCOM->write(tx_message, my_buff_length); 00121 return(true); 00122 } 00123 00124 bool tx_fmu130_command(const char m_buffer[64], BufferedSerial *puertoCOM) { 00125 int j = (strlen(m_buffer)); 00126 int k = j+3; 00127 char i = 0x00; 00128 char tx_message[128]; 00129 char middle_message[128]; 00130 int my_buff_length = 0; 00131 00132 // Ensamble de cadena parcial desde Length hasta el Payload 00133 //myPC_debug.printf("\r\nPayload: %s\r\n", m_buffer); 00134 //myPC_debug.printf("Longitud Payload: %d\r\n", j); 00135 00136 k = sprintf(middle_message, "%c%c%c%s", DESTINATION_FMU130, i , j, m_buffer); 00137 00138 int resultCRC = teltonika_crc16(middle_message,k); 00139 //myPC_debug.printf("CRC = %d - %04x\r\n", resultCRC, resultCRC); 00140 00141 int hi_CRC = ((resultCRC & 0xFF00)>>8); 00142 int lo_CRC = resultCRC & 0x00FF; 00143 00144 // Ensamble de trama final 00145 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); 00146 puertoCOM->write(tx_message, my_buff_length); 00147 return(true); 00148 } 00149 00150 bool tx_fmu130_var_command(char m_buffer[30], BufferedSerial *puertoCOM) { 00151 int j = (strlen(m_buffer)); 00152 int k = j+3; 00153 char i = 0x00; 00154 char tx_message[128]; 00155 char middle_message[128]; 00156 int my_buff_length = 0; 00157 00158 // Ensamble de cadena parcial desde Length hasta el Payload 00159 //myPC_debug.printf("\r\nPayload: %s\r\n", m_buffer); 00160 //myPC_debug.printf("Longitud Payload: %d\r\n", j); 00161 00162 k = sprintf(middle_message, "%c%c%c%s", DESTINATION_FMU130, i , j, m_buffer); 00163 00164 int resultCRC = teltonika_crc16(middle_message,k); 00165 //myPC_debug.printf("CRC = %d - %04x\r\n", resultCRC, resultCRC); 00166 00167 int hi_CRC = ((resultCRC & 0xFF00)>>8); 00168 int lo_CRC = resultCRC & 0x00FF; 00169 00170 // Ensamble de trama final 00171 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); 00172 puertoCOM->write(tx_message, my_buff_length); 00173 return(true); 00174 }
Generated on Thu Jul 28 2022 19:27:02 by 1.7.2