/*---------------------------------------------------------------------------*/ void tr1001_init(void) { PT_INIT(&rxhandler_pt); onoroff = OFF; UCTL0 = CHAR; /* 8-bit character */ UTCTL0 = SSEL1; /* UCLK = SMCLK */ tr1001_set_speed(TR1001_19200); ME1 |= UTXE0 + URXE0; /* Enable USART0 TXD/RXD */ /* Turn on receive interrupt. */ IE1 |= URXIE0; timer_set(&rxtimer, CLOCK_SECOND / 4); tr1001_on(); tr1001_set_txpower(100); /* Reset reception state. */ rxclear(); process_start(&tr1001_process, NULL); }
/*---------------------------------------------------------------------------*/ static int tr1001_off(void) { if(onoroff == OFF) { return 1; } onoroff = OFF; rxoff(); rxclear(); ENERGEST_OFF(ENERGEST_TYPE_LISTEN); return 1; }
/*------------------------------------------------------------------------------*/ u8_t tr1001_send_acked(void) { unsigned short tmplen, count; struct tr1001_hdr *ackhdr = (struct tr1001_hdr *)rxbuf; ek_clock_t start; tr1001_send(); start = ek_clock(); count = 0; P2OUT &= 0xFB; /* Block while checking if a packet has arrived. */ while((volatile u8_t)rxstate != RXSTATE_FULL && (volatile u8_t)rxstate != RXSTATE_ERROR) { /* Wait no more than one second. */ if((ek_clock_t)(ek_clock() - start) > (ek_clock_t)CLK_TCK) { break; } } P2OUT |= 0x04; if(rxstate == RXSTATE_FULL) { if(ackhdr->type == TR1001_TYPE_ACK && ackhdr->id == packet_id) { beep(); rxclear(); return UIP_FW_OK; } } if(rxstate == RXSTATE_ERROR) { rxclear(); blink(); } return UIP_FW_DROPPED; }
/*------------------------------------------------------------------------------*/ unsigned short tr1001_poll(void) { unsigned short tmplen; if(rxstate == RXSTATE_FULL) { if(rxlen > UIP_BUFSIZE - UIP_LLH_LEN) { rxlen = UIP_BUFSIZE - UIP_LLH_LEN; } memcpy(&uip_buf[UIP_LLH_LEN], rxbuf + TR1001_HDRLEN, rxlen); tmplen = rxlen; rxclear(); return tmplen; } if(rxstate == RXSTATE_ERROR) { blink(); rxclear(); } return 0; }
/*---------------------------------------------------------------------------*/ static int tr1001_on(void) { if(onoroff == ON) { return 1; } ENERGEST_ON(ENERGEST_TYPE_LISTEN); onoroff = ON; rxon(); rxclear(); return 1; }
/*------------------------------------------------------------------------------*/ void tr1001_init(void) { /* Turn on reception. */ rxon(); /* Reset reception state. */ rxclear(); UCTL0 = CHAR; /* 8-bit character */ UTCTL0 = SSEL1; /* UCLK = SMCLK */ #define TR1001_SPEED 19200 if(TR1001_SPEED == 19200) { /* Set TR1001 to 19200 */ UBR00 = 0x80; /* 2,457MHz/19200 = 128 -> 0x80 */ UBR10 = 0x00; /* */ UMCTL0 = 0x00; /* no modulation */ } else if(TR1001_SPEED == 38400) { /* Set TR1001 to 38400 */ UBR00 = 0x40; /* 2,457MHz/38400 = 64 -> 0x40 */ UBR10 = 0x00; /* */ UMCTL0 = 0x00; /* no modulation */ } else if(TR1001_SPEED == 57600) { UBR00 = 0x2a; /* 2,457MHz/57600 = 42.7 -> 0x2A */ UBR10 = 0x00; /* */ UMCTL0 = 0x5b; /* */ } else if(TR1001_SPEED == 115200) { UBR00 = 0x15; /* 2,457MHz/115200 = 21.4 -> 0x15 */ UBR10 = 0x00; /* */ UMCTL0 = 0x4a; /* */ } #if 0 /* 19200 bps */ UBR00 = 0x80; /* 2,457MHz/19200 = 128 -> 0x80 */ UBR10 = 0x00; /* */ UMCTL0 = 0x00; /* no modulation */ #endif /* 0 */ ME1 |= UTXE0 + URXE0; /* Enable USART0 TXD/RXD */ /* Turn on receive interrupt. */ IE1 |= URXIE0; }