int main() { const size_t data_size = (char *)main_end - (char *)main; CRC_BYTE buffer[data_size + sizeof (CRC_STATE)]; printf(DEB("data_size = 0x%x\n"), data_size); memcpy(buffer, main, data_size); add_crc(0, buffer, sizeof buffer, crc32ieee8023); fprintbuf(stdout, sizeof buffer, buffer, DEB("")); printf(DEB("do_crc(buffer) -> 0x%08x\n"), do_crc(0, buffer, data_size, crc32ieee8023)); printf(DEB("do_crc(buffer + CRC) -> 0x%08x\n"), do_crc(0, buffer, sizeof buffer, crc32ieee8023)); }
void send_command(t_serial_request *prq, t_shared_data *pshared) { char byte; char message[MAX_MSG_SIZE]; int sz, ctn; // enum eserial_state { ser_nothing, ser_waiting_response }; eserial_state ser_state; ser_state = ser_nothing; switch (prq->type) { case enothing: break; case eping: { while (pshared->pserial->read_next_byte(&byte)); // Empty the buffer snprintf(message, MAX_MSG_SIZE, "ping\n"); add_crc(message); pshared->pserial->write_serial_port(message, 1 + strlen(message)); ser_state = ser_waiting_response; } break; case einformation: { while (pshared->pserial->read_next_byte(&byte)); // Empty the buffer snprintf(message, MAX_MSG_SIZE, "get_params\n"); add_crc(message); pshared->pserial->write_serial_port(message, 1 + strlen(message)); ser_state = ser_waiting_response; } break; case ereport: { while (pshared->pserial->read_next_byte(&byte)); // Empty the buffer snprintf(message, MAX_MSG_SIZE, "get_report\n"); add_crc(message); pshared->pserial->write_serial_port(message, 1 + strlen(message)); ser_state = ser_waiting_response; } break; case eprogram: { snprintf(message, MAX_MSG_SIZE, "set_param %s\n", prq->command); add_crc(message); pshared->pserial->write_serial_port(message, 1 + strlen(message)); usleep(500000); ser_state = ser_nothing; } break; case eupdategui: default: break; } if (ser_state == ser_waiting_response) { // Get the bytes from the serial line. Wait a little if nothing is found. sz = 0; for (ctn = 0; !pshared->pserial->read_next_byte(&byte) && ctn < 10; ctn++) usleep(10000); while (sz < MAX_MSG_SIZE && byte != 0 && ctn < 10) // Is the end of the message { message[sz++] = byte; for (ctn = 0; !pshared->pserial->read_next_byte(&byte) && ctn < 10; ctn++) usleep(1000); } if (byte == 0 && sz > 0) { message[sz] = '\0'; if (!check_crc(message, sz)) { printf("Wrong CRC: %x / %x.\n", calculate_CRC(message, sz - 1), message[sz - 1]); return; } message[sz - 1] = '\0'; // Erase the CRC printf("<- Received a serial message: \"%s\".\n", message); LOCK; // Process the shit, like if it was a sewer pipe. switch (prq->type) { case enothing: break; case eping: { strncpy(pshared->bms_version, message, MAX_MSG_SIZE); } break; case einformation: { strncpy(pshared->param_msg, message, MAX_MSG_SIZE); pshared->pBMS->parse_BMS_params_string(&pshared->pBMS->m_params, pshared->param_msg); } break; case ereport: { strncpy(pshared->report_msg, message, MAX_MSG_SIZE); pshared->pBMS->parse_BMS_report_string(&pshared->pBMS->m_report, pshared->report_msg); } break; case eprogram: case eupdategui: default: break; } // This will trigger a screen refresh add_command_in_locked_area(eupdategui, " ", pshared); UNLOCK; } } }