// SEND_PACKET // function to send a packet of data to another PIC void send_packet(int* packet_ptr, int16 packet_length) { int *ptr; int16 CRC,i; ptr = packet_ptr; // set pointer CRC = generate_16bit_crc(ptr, packet_length, CRC_CCITT); // make CRC for(i=0; i<packet_length; i++) // send packet putc(packet_ptr[i]); putc((int)(CRC>>8)); // send CRC putc((int)(CRC)); }
/** * Gera a mensagem de erro, de acordo com o estado anterior da máquina. * * A mensagem de ERRO não corrompe o buffer da mensagem atual. * Para mensagens novas, a mensagem de erro depende da tabela cadastrada em * ANSWER_ERRO_DAVI. * A liberação para nova mensagem não depende desta camada (física) e sim da * camada de aplicação. * Ou seja, enquanto a aplicação não liberar nova mensagem, a física responde * com erro de OCUPADO, sem corromper o buffer atual, em uso pela aplicação. * * O modo transparente é habilitado pela camada de aplicação. * No modo transparente todas as mensagens não interpretadas são repassadas * para a porta remota conectada ao instrumento sob teste. * As mensagens A4 serão sempre tratadas e respondidas na camada física. * * Nesta interface não chegam mensagens com o cabeçalho A3, A5 ou A6. Se che- * garem, serão tratadas com o modo: Transparente/ensaio (retransmite/descarta). * * @param cur_state * @param new_state * @param new_event */ void receive_erro_stf_davi(enum STATE_ID_PROTOCOL_DAVI cur_state, enum STATE_ID_PROTOCOL_DAVI new_state, enum EVENT_ID_PROTOCOL_DAVI new_event) { unsigned short crc; union protocolDAVI_erro mensagem_erro_DAVI; int i; if ((new_event == EVENT_ERRO_DAVI) && (cur_state == STATE_STX_DAVI)) { if (flags_ensaio.MensagemModo == MODO_TRANSPARENTE) //repassa a mensagem recebida em STX serOutchar(mensagem_Davi.buffer[0]); //ou descarta caracteres até receber o STX válido } else { if (flags_ensaio.MensagemModo == MODO_TRANSPARENTE){ //repassa a mensagem recebida no buffer for (i = 0; i < mensagem_davi_index; i++) serOutchar(mensagem_Davi.buffer[i]); } //altera estado atual para gerar mensagem de timeout if (new_event == EVENT_TIMEOUT_DAVI) cur_state = STATE_TIMEOUT_DAVI; // monta mensagem com o erro adequado // envia mensagem de erro para o correspondente mensagem_erro_DAVI.overhead.head = STX_ERROR_DAVI; mensagem_erro_DAVI.overhead.command = COMMAND_NOP_DAVI; // \x00 mensagem_erro_DAVI.overhead.format = FORMAT_HEX_DAVI; // \x00 mensagem_erro_DAVI.overhead.length = sizeof (LISTA_RESPOSTA_ERRO_PROTOCOL_DAVI[0]); mensagem_erro_DAVI.payload.parameter[0] = *((char*) (&LISTA_RESPOSTA_ERRO_PROTOCOL_DAVI[cur_state]) + 1); mensagem_erro_DAVI.payload.parameter[1] = *((char*) (&LISTA_RESPOSTA_ERRO_PROTOCOL_DAVI[cur_state]) + 0); crc = generate_16bit_crc(mensagem_erro_DAVI.buffer, 6, CRC_16); mensagem_erro_DAVI.payload.parameter[sizeof (LISTA_RESPOSTA_ERRO_PROTOCOL_DAVI[0])] = *((char*) (&crc) + 1); mensagem_erro_DAVI.payload.parameter[sizeof (LISTA_RESPOSTA_ERRO_PROTOCOL_DAVI[0]) + 1] = *((char*) (&crc) + 0); ser2Outstring(mensagem_erro_DAVI.buffer, 8); } mensagem_davi_index = 0; }
/** * Aguarda a recepção dos bytes de CRC. * calcula o valor do CRC do buffer com que foi recebido. * * se houver erro, solicita o informe na mensagem de retorno. * * @param cur_state * @param new_state * @param new_event */ void receive_crc_stf_davi(enum STATE_ID_PROTOCOL_DAVI cur_state, enum STATE_ID_PROTOCOL_DAVI new_state, enum EVENT_ID_PROTOCOL_DAVI new_event) { //testa se recebeu os dois bytes do CRC if ((mensagem_davi_index - sizeof (mensagem_Davi.overhead) - sizeof (unsigned short)) == mensagem_Davi.overhead.length) //testa se o CRC coincide com a mensagem if (generate_16bit_crc(mensagem_Davi.buffer, mensagem_davi_index, CRC_16)) { //indica erro de CRC event[MachineProtDaviNr] = EVENT_ERRO_DAVI; } else //CRC correto event[MachineProtDaviNr] = EVENT_N_ZERO_DAVI; else //aguarda próximo byte do CRC event[MachineProtDaviNr] = EVENT_ID_NONE_DAVI; //E0 }
// GET_PACKET // function to get a packet from the buffer and read the data short get_packet(int* packet_ptr) { short retval; int16 length; int16 CRC; int16 i; retval = TRUE; packet_ptr[0] = get_buff_int(); // get the address of send to packet_ptr[1] = get_buff_int(); // get the address of send from if(packet_ptr[0] != MACHINE_ADDRESS) retval = FALSE; packet_ptr[2] = get_buff_int(); // get the control byte if(packet_ptr[2] == NACK) retval = FALSE; packet_ptr[3] = get_buff_int(); // get the length of the data packet_ptr[4] = get_buff_int(); length = (int16)(packet_ptr[3])<<8; length += packet_ptr[4]; for(i=5; i<(length+5); i++) // get the data packet_ptr[i] = get_buff_int(); packet_ptr[length+5] = get_buff_int(); // get the CRC packet_ptr[length+6] = get_buff_int(); CRC = (int16)(packet_ptr[length+5])<<8; CRC += packet_ptr[length+6]; if(CRC != generate_16bit_crc(packet_ptr, length+5, CRC_CCITT)) retval = FALSE; return retval; }