/* ************************************************** */
static void worldsens_update(void) {
    char msg[WORLDSENS_MAX_PKTLENGTH];
    int len, error;
    struct sockaddr_in address;

    union _worldsens_pkt *pkt = (union _worldsens_pkt *) msg;
    error = wsens_srv_rcv(msg, &len, &address);

    if ((error == 0) && (len == 0)) {
        return;
    }
    else if (error == -1) {
        exception = EXCEPTION_FATAL;
    }

    worldsens_packet_ntoh(pkt);
    worldsens_packet_display(pkt);

    switch (pkt->c_header.type) {
    case WORLDSENS_C_CONNECT_REQ:
        worldsens_rx_connect_req((struct _worldsens_c_connect_req *) pkt, &address);
	break;
    case WORLDSENS_C_SYNC_ACK:
        worldsens_rx_sync_ack((struct _worldsens_c_sync_ack *) pkt);
	break;
    case WORLDSENS_C_BYTE_TX:
        worldsens_tx_byte((struct _worldsens_c_byte_tx *) pkt);
	break;
    case WORLDSENS_C_MEASURE_REQ:
        worldsens_rx_measure_req((struct _worldsens_c_measure_req *) pkt);
        break;
    case WORLDSENS_C_DISCONNECT:
        worldsens_rx_disconnect((struct _worldsens_c_disconnect *) pkt);
	break;
    }   
    
    /* if a new event has been added before current time, set exception to backtrack */
    event_t *next_event = scheduler_see_next();
    if (next_event->clock < get_time()) {
        exception = EXCEPTION_BACKTRACK;
    }

    return;
}
Example #2
0
/* ************************************************** */
static int wsnet2_parse(char *msg) {
  union _worldsens_pkt *pkt = (union _worldsens_pkt *) msg;

  worldsens_packet_ntoh(pkt);
  worldsens_packet_dump(pkt);

  switch (pkt->s_header.type) {
 
  case WORLDSENS_S_CONNECT_RSP_OK:
      WSNET2_DBG("libwsnet2:wsnet2_parse: WORLDSENS_S_CONNECT_RSP_OK packet type\n");
      if(wsnet2_published((char *)pkt)){
	  WSNET2_EXC("libwsnet2:wsnet2_parse: Error during publishing models\n");	
          return -1;
      }
      break;
  case WORLDSENS_S_CONNECT_RSP_NOK:
      WSNET2_DBG("libwsnet2:wsnet2_parse: WORLDSENS_S_CONNECT_RSP_NOK packet type\n");
      WSNET2_EXC("libwsnet2:wsnet2_parse: Connection refused by wsnet2 server\n");
      wsnet2_finalize();
      return -1;
  case WORLDSENS_S_BACKTRACK:
      WSNET2_DBG("libwsnet2:wsnet2_parse: WORLDSENS_S_BACKTRACK packet type\n");
      if (wsnet2_backtrack((char *)pkt))
          goto error;
      break;
  case WORLDSENS_S_SYNC_RELEASE:
      WSNET2_DBG("libwsnet2:wsnet2_parse: WORLDSENS_S_SYNC_RELEASE packet type\n");
      if (wsnet2_sync_release((char *)pkt))
          goto error;
      break;
  case WORLDSENS_S_SYNC_REMINDER:
      WSNET2_DBG("libwsnet2:wsnet2_parse: WORLDSENS_S_SYNC_REMINDER packet type\n");
      if (wsnet2_sync_reminder((char *)pkt))
          goto error;
      break;
  case WORLDSENS_S_BYTE_RX:
      WSNET2_DBG("libwsnet2:wsnet2_parse: WORLDSENS_S_BYTE_RX packet type\n");
      if (wsnet2_rx((char *)pkt))
          goto error;
      break;
  case WORLDSENS_S_BYTE_SR_RX:
      WSNET2_DBG("libwsnet2:wsnet2_parse: WORLDSENS_S_BYTE_SR_RX packet type\n");
      if (wsnet2_sr_rx((char *)pkt))
          goto error;
      break;
  case WORLDSENS_S_MEASURE_RSP:
      WSNET2_DBG("libwsnet2:wsnet2_parse: WORLDSENS_S_MEASURE_RSP packet type\n");
      if (wsnet2_measure_rsp((char *)pkt))
          goto error;
      break;
  case WORLDSENS_S_MEASURE_SR_RSP:
      WSNET2_DBG("libwsnet2:wsnet2_parse: WORLDSENS_S_MEASURE_SR_RSP packet type\n");
      if (wsnet2_measure_sr_rsp((char *)pkt))
          goto error;
      break;
  case WORLDSENS_S_KILLSIM:
      WSNET2_DBG("libwsnet2:wsnet2_parse: WORLDSENS_S_KILLSIM packet type\n");
      wsnet2_finalize();
      wsens.state = WORLDSENS_CLT_STATE_KILLED;
      break;
  case WORLDSENS_S_KILL:
      WSNET2_DBG("libwsnet2:wsnet2_parse: WORLDSENS_S_KILL packet type\n");
      wsnet2_kill_node((char *)pkt);
      break;
  default:
      WSNET2_EXC("libwsnet2:wsnet2_parse: Unknown packet type!\n");
      goto error;
  }

  return 0;

 error:
    WSNET2_ERROR("libwsnet2:wsnet2_parse: Error during packet parse\n");
    wsnet2_finalize();
    return -1;	
}