Beispiel #1
0
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));

}
Beispiel #2
0
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;
	}
    }
}