Esempio n. 1
0
// 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));
}
Esempio n. 2
0
/**
 *   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;
}
Esempio n. 3
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
}
Esempio n. 4
0
// 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;
}