Esempio n. 1
0
File: main.c Progetto: jnwu/nanork
void server_non_blocking_rx (int fd)
{
  int i;

  n = recvfrom (sock, buf, 1024, 0, (struct sockaddr *) &from, &fromlen);

  if (n > 0) {
  if(reply_mode==STATIC_CLIENT)
	{
	if(from.sin_addr.s_addr != client.sin_addr.s_addr)
		{
		printf( "Reject packet\r\n" );
		return;
		}
	}
    bcopy(&from,&client,sizeof(struct sockaddr));
    got_connection = 1;
    if (debug==1) {
      printf ("\nRX: %d [",n);
      for (i = 0; i < n; i++)
        printf ("%x ", buf[i]);
      printf ("]\n");
    }
    slip_tx (fd, buf, n);
  }
}
Esempio n. 2
0
uint8_t dprot_master_send_ping ( void )
{
    uint8_t ret = 0;
    uint8_t retry = DPROT_MASTER_NUM_RETRIES;
    uint8_t buffer[3] = { DROPT_TYPE_ARP, 0, 0 };
    
    // advance the parity and embed it
    master_last_parity = !master_last_parity;
    buffer[0] |= master_last_parity;
	
	// calculate checking
	DPROT_CHECKING(buffer[2],buffer[0]);
	DPROT_CHECKING(buffer[2],buffer[1]);

    while (retry--)
    {
        slip_tx(&master_channel, buffer, 3, SLIP_MSG_REG);
        
        // wait for response
        ret = dprot_master_wait_for_ack_nack ( );
        if (ret == DPROT_ACK_ACCEPTED)
        {
            // stop trying
            break;
        }
    }
    
    return ret;
}
Esempio n. 3
0
uint8_t dprot_master_send_data_msg (uint8_t* buffer, uint8_t len)
{
	uint8_t i;
    uint8_t ret = 0;
	uint8_t calc_check = 0;
    uint8_t retry = DPROT_MASTER_NUM_RETRIES;
	uint8_t header[2] = { DPROT_TYPE_DATA, len };
    
   
	
	if (len > DPROT_MAX_PAYLOAD)
	{
		// the buffer is bigger than the maximal allowed
		// transaction size
		return DPROT_MSG_SIZE_ERROR;
	}
		
	// calculate the checking
	DPROT_CHECKING(calc_check,header[0]);
	DPROT_CHECKING(calc_check,header[1]);
	for (i = 0; i < len; i++)
	{
		DPROT_CHECKING(calc_check,buffer[i]);
	}
	
    while (retry--)
    {
        // finally send the data
        slip_tx(&master_channel, header, 2, SLIP_MSG_START);
        slip_tx(&master_channel, buffer, len, SLIP_MSG_MIDDLE);
        slip_tx(&master_channel, &calc_check, 1, SLIP_MSG_END);
        
        // wait for response
        ret = dprot_master_wait_for_ack_nack ( );
        if (ret == DPROT_ACK_ACCEPTED)
        {
            // stop trying
            break;
        }

    }
	return ret;
}
Esempio n. 4
0
void server_non_blocking_rx (int fd)
{
    struct sockaddr_in from;

    int n = recvfrom (sock, buf, 1024, 0, (struct sockaddr *) &from, (socklen_t *) &fromlen);
    if (n > 0) {
        bcopy(&from,&client,sizeof(struct sockaddr));
        got_connection = 1;
        slip_tx (fd, buf, n);
    }
}
Esempio n. 5
0
void Task3 ()
{
  int8_t v;
 
  uint8_t pckts=0;
  printf ("radio stuff Task3 PID=%d\r\n", nrk_get_pid ());


  while (slip_started () != 1)
    nrk_wait_until_next_period ();

  while (1) {

    v = slip_rx (slip_rx_buf, MAX_SLIP_BUF);
		
		printf("nanork@ bytesread %d\n",v);
		//for (i=0;i<v;i++) printf("<%d>",slip_rx_buf[i]);
		//printf("\n");

    if (v > HDR_SIZE) {

      ack_buf[0] = 'Z';
			ack_buf[1] = slip_rx_buf[1];
			ack_buf[2] = slip_rx_buf[2];
    	while(uart_tx_busy==1) nrk_wait_until_next_period();
      uart_tx_busy=1;
      slip_tx (ack_buf, 3);
      uart_tx_busy=0;
      
   

      rfTxInfo.pPayload = slip_rx_buf;
      rfTxInfo.length= v;
      rfTxInfo.destAddr = 0xFFFF;
      rfTxInfo.cca = 0;
      rfTxInfo.ackRequest = 0;

    	nrk_led_toggle (RED_LED);
      pckts++;
      PORTG=0x1;
      
      if(rf_tx_packet(&rfTxInfo) != 1) {
          printf("--- RF_TX ERROR ---\r\n");
          nrk_spin_wait_us(10000);
        } 

     
  	}

  }
}
Esempio n. 6
0
void Task1 ()
{
  uint16_t cnt;
  uint8_t len;
  printf ("My node's address is %d\r\n", NODE_ADDR);

  printf ("Task1 PID=%d\r\n", nrk_get_pid ());
  cnt = 0;
  slip_init (stdin, stdout, 0, 0);

  while (1) {
    nrk_led_set (ORANGE_LED);
    sprintf (slip_tx_buf, "Hello %d", cnt);
    len = strlen (slip_tx_buf);
    slip_tx (slip_tx_buf, len);
    nrk_wait_until_next_period ();
    nrk_led_clr (ORANGE_LED);
    nrk_wait_until_next_period ();
    cnt++;
  }
}
Esempio n. 7
0
void Task1 ()
{
  uint16_t cnt;
  uint8_t len,i;
  //printf ("My node's address is %d\r\n", NODE_ADDR);

  //printf ("Task1 PID=%d\r\n", nrk_get_pid ());


  rfRxInfo.pPayload = rx_buf;
  rfRxInfo.max_length = RF_MAX_PAYLOAD_SIZE;
  nrk_int_enable();
  rf_init (&rfRxInfo, 13, 0x2420, 0x1214);

  cnt = 0;
  slip_init (stdin, stdout, 0, 0);
	rf_rx_on();
  while (1) {
    


    while (rf_rx_packet_nonblock () != NRK_OK) {
      nrk_wait_until_next_period();

    }
		
		
    rx_packet_len = rfRxInfo.length;
    for(i=0; i<rfRxInfo.length; i++ ) slip_tx_buf[i]=rfRxInfo.pPayload[i];
		slip_tx_buf[10] = rfRxInfo.rssi;
		
    while(uart_tx_busy==1) nrk_wait_until_next_period();
    uart_tx_busy=1;
    slip_tx (slip_tx_buf, rx_packet_len);
    uart_tx_busy=0;
		

  }
}
Esempio n. 8
0
/************************* Function definitions ***************************/
int8_t sendToSerial(uint8_t *buf, uint8_t len)		// CHECKED
{
	while( slip_started () == NRK_ERROR )			// wait till the serial task starts the SLIPstream module
		nrk_wait_until_next_period();
		
	/*
	if(len > SIZE_SLIP_TX_BUF)
	{
		nrk_kprintf(PSTR("SR: sendToSerial(): Buffer length too big\r\n"));
		return NRK_ERROR;
	}
	*/
	
	if( slip_tx (buf, len) == NRK_ERROR )
	{
		nrk_int_disable();
		nrk_led_set(RED_LED);
		while(1)
			nrk_kprintf(PSTR("SR: sendToSerial(): Error sending out message over serial port\r\n"));
	}
	return NRK_OK;
}
Esempio n. 9
0
/*
void sendToSerial(uint8_t *buf, int8_t length)
{
   putchar(END);
   if(DEBUG_SR == 2)
   	printf("%d ", END);

   while(length > 0)
	{
   	switch(*buf)
		 {
       		
            case END:
               putchar(ESC);
               putchar(ESC_END);
               if(DEBUG_SR == 2)
               	printf("%d %d ",ESC, ESC_END); 
               
               break;

             case ESC:
                putchar(ESC);
                putchar(ESC_ESC);
                if(DEBUG_SR == 2)
                	printf("%d %d ",ESC, ESC_ESC);
                break;

             default:
 	              putchar(*buf);
 	              if(DEBUG_SR == 2)	
 	              	 printf("%d ", *buf);
        } // end switch
        buf++;
        length--;
   } // end while
   
	putchar(END);
    if(DEBUG_SR == 2)
    	printf("%d ", END);
	 return;
}
*/
void sendToSerial(uint8_t *buf, int8_t len)
{
	while( slip_started () == NRK_ERROR )
	{
		nrk_wait_until_next_period();
	}
	
	if(DEBUG_SR == 2)
	{
		nrk_kprintf(PSTR("Calling slip_tx\r\n"));
	}
	
	if( slip_tx (buf, len) == NRK_ERROR )
	{
		nrk_int_disable();
		nrk_led_set(RED_LED);
		while(1)
		{
			nrk_kprintf(PSTR("Error sending out NGB_LIST message over serial\r\n"));
		}
	}
	
	return;
}
Esempio n. 10
0
int main ()
{
	uint8_t v_TempCnt_u8r, v_Dummy_u8r, v_RdLcycmode_u8r;
  
	nrk_setup_ports();
	nrk_setup_uart(UART_BAUDRATE_115K2);
  
	nrk_kprintf( PSTR("Starting up...\r\n") );

	//////////////////////////////////////////////////
	F_ChkIntEntry_U8R = 0; 
	nrk_led_clr(BLUE_LED);
	nrk_led_clr(GREEN_LED);
	nrk_led_clr(ORANGE_LED);
	nrk_led_clr(RED_LED);

	for(v_TempCnt_u8r=0;v_TempCnt_u8r<100;v_TempCnt_u8r++)
		V_TxBuff_U8R[v_TempCnt_u8r]=v_TempCnt_u8r+'a';
	V_RdPtr_U32R = 0;
	slip_tx(&V_TxBuff_U8R[V_RdPtr_U32R],C_SlipPktSize,&V_TxBuff_U8R[C_CircBuffSize-1],C_CircBuffSize);

	signal_one=nrk_signal_create();
	
	sei();
	DDRD &= ~(_BV(PORTD3));	//Making INT3 pin as input
	EIMSK = 0x00;
	EICRA = 0x80;
	EIMSK = 0x08;

	printf("#");
	//Set ADE in normal power mode PM0=1 (PE2), PM!=0 (PE3)
	DDRE 	|= _BV(PORTE2) | _BV(PORTE3);
	PORTE |= _BV(PORTE2);
	PORTE &= ~(_BV(PORTE3));

	while(F_ChkIntEntry_U8R==0);
	while(EIMSK !=0);

	//Enable SPI Master, Set Clock rate fck/4
	SPCR = 0x01;
	SPCR |= _BV(SPE) | _BV(MSTR) | _BV(CPOL) | _BV(CPHA);
	
	PORTB |= _BV(PORTB0);//default state of SS should be low
	v_RdLcycmode_u8r=0;

	//This segment below is added because it was observed that the 7878
	//SPI or the ATMEL SPI takes some time to start. So waiting till
	//some register gives its default value
	printf("Wait..");
	while(v_RdLcycmode_u8r!=0x78)
		v_RdLcycmode_u8r = ade_read8(LCYCMODE);
	printf("\r\n7878 Ready");

	if(ade_init() < 0)
		printf("\nInit failed");
	else
		printf("\nInit Success");

	V_Status1RdWr_U32R = ade_read32(STATUS1);
	ade_write32(STATUS1, V_Status1RdWr_U32R);

	/////////////////////////////////////////////////
	nrk_init();
 
	nrk_time_set(0,0);
	nrk_create_taskset ();
	nrk_start();
	return 0;
}
Esempio n. 11
0
void Task5()
{
	int8_t v;
	nrk_sig_mask_t my_sigs;
	nrk_sig_t t;
	nrk_time_t timeout;

//	timeout.secs=10;
//	timeout.nano_secs=0;
	printf( "Task5 PID=%d\r\n",nrk_get_pid());
	v=nrk_signal_register(signal_one);

//	v=nrk_signal_register(nrk_wakeup_signal);
//	if(v==NRK_ERROR)
//		nrk_kprintf( PSTR ("T2 nrk_signal_register failed\r\n"));

	while(1)
	{
	//	nrk_led_toggle(BLUE_LED);
	//	nrk_set_next_wakeup(timeout);
//		printf("ee");
	//	my_sigs=nrk_event_wait(SIG(signal_one) | SIG(nrk_wakeup_signal));
		F_ReadyForSignal_U8R=1;
		my_sigs=nrk_event_wait(SIG(signal_one));
		nrk_led_set(RED_LED);
		F_ReadyForSignal_U8R=0;

		if(my_sigs==0)
			nrk_kprintf( PSTR ("T2 nrk_event_wait failed\r\n"));
		if(my_sigs & SIG(signal_one))
		{
		//	nrk_kprintf( PSTR( "T2 got S1\r\n"));

//		nrk_kprintf( PSTR("*"));

	slip_tx(&V_TxBuff_U8R[V_RdPtr_U32R],C_SlipPktSize,&V_TxBuff_U8R[C_CircBuffSize-1],C_CircBuffSize);

//	printf("\r\n%d",V_WrPtr_U32R);
//	printf(",%d",V_RdPtr_U32R);
			V_RdPtr_U32R=V_RdPtr_U32R+C_SlipPktSize;
			if(V_RdPtr_U32R>=C_CircBuffSize)
			{
				V_RdPtr_U32R = V_RdPtr_U32R - C_CircBuffSize;
				V_WrSeqNo_U8R = 0;
			}
			
			if(F_Det_U8R==1)
			{
				printf("\r\nEvent!");
				F_Det_U8R = 0;
			}

			if(F_1secData_U8R==1)
			{
				F_1secData_U8R = 0;
				V_CalcTemp1_U32R = V_ArmsVolt_U32R*33;
				V_CalcTemp2_U32R = V_CalcTemp1_U32R/1000000;
			//	printf("\r\nV = %ld",V_ArmsVolt_U32R);
				printf("\r\n%ld V",V_CalcTemp2_U32R);

				V_CalcTemp1_U32R = V_ArmsCurr_U32R*125;
				V_CalcTemp2_U32R = V_CalcTemp1_U32R/10000;
				printf(", %ld mA",V_CalcTemp2_U32R);
			//	printf(", I = %ld",V_ArmsCurr_U32R);

				V_CalcTemp1_S32R = V_ArmsWatt_S32R;
				V_CalcTemp2_S32R = V_CalcTemp1_S32R/10;
				V_CalcTemp1_S32R = V_CalcTemp2_S32R*344;
				V_CalcTemp2_S32R = V_CalcTemp1_S32R/100000;
			//	V_AwattCalc1_U32R = V_Awatt_S32R*3;
			//	V_AwattCalc2_U32R = (V_AwattCalc1_U32R>>13);
			//	printf(" P = %ld",V_AwattCalc2_U32R);i
				printf(", P = %ld W",V_CalcTemp2_S32R);
				V_RdDSP_U16R = ade_read16(RUN);
				if(V_RdDSP_U16R==0)
				{
					ade_write16(RUN,START);
				//	printf("\nDSP restarted");
					printf("\r\r$$");
				}
			}
			nrk_led_clr(RED_LED);
		}
	//	if(my_sigs & SIG(nrk_wakeup_signal))
	//		nrk_kprintf( PSTR( "T2 timeout\r\n"));
		
	//	nrk_wait_until_next_period();
	}
}
Esempio n. 12
0
void rx_task()
{
nrk_time_t t;
uint16_t cnt;
int8_t v;
uint8_t len,i,chan;


cnt=0;
nrk_kprintf( PSTR("Nano-RK Version ") );
printf( "%d\r\n",NRK_VERSION );

  
printf( "Gateway Task PID=%u\r\n",nrk_get_pid());
t.secs=10;
t.nano_secs=0;

// setup a software watch dog timer
nrk_sw_wdt_init(0, &t, NULL);
nrk_sw_wdt_start(0);

  chan = 16;
  if (SET_MAC == 0xffff) {

    v = read_eeprom_mac_address (&mac_address);
    if (v == NRK_OK) {
      v = read_eeprom_channel (&chan);
    }
    else {
      while (1) {
        nrk_kprintf (PSTR
                     ("* ERROR reading MAC address, run eeprom-set utility\r\n"));
  	nrk_led_toggle(RED_LED);
        nrk_wait_until_next_period ();
      }
    }
  }
  else
    mac_address = SET_MAC;

  printf ("MAC ADDR: %x\r\n", mac_address & 0xffff);
  printf ("chan = %d\r\n", chan);


tdma_init(TDMA_HOST, chan, mac_address);

// Change these parameters anytime you want...
tdma_set_slot_len_ms(10);
tdma_set_slots_per_cycle(12);

slip_init (stdin, stdout, 0, 0);

while(!tdma_started()) nrk_wait_until_next_period();
nrk_led_set(GREEN_LED);
  while(1) {
	v=tdma_recv(&rx_tdma_fd, &slip_tx_buf, &len, TDMA_BLOCKING );	
	nrk_led_set(ORANGE_LED);
	if(v==NRK_OK)
	{
		//for(i=0; i<len; i++ ) printf( "%c", rx_buf[i]);
		// Got a packet from the network so send it over SLIP
		slip_tx ( slip_tx_buf, len );
	}
	else tdma_rx_pkt_release();
	nrk_led_clr(ORANGE_LED);
	nrk_sw_wdt_update(0); 
  	}
}