/** * swStop * * Stop SWAP comms */ void swStop(void) { // New SWAP state = SWAP stopped setChronosState(SYSTATE_STOPSWAP); // Go to sleep mode MRFI_RxIdle(); MRFI_Sleep(); }
/****************************************************************************** * @fn nwk_radioControl * * @brief Handle radio control functions. * * input parameters * @param action - radio operation to perform. currently suppoerted: * sleep/unsleep * output parameters * * @return Status of operation. */ smplStatus_t nwk_radioControl(ioctlAction_t action, void *val) { smplStatus_t rc = SMPL_SUCCESS; if (IOCTL_ACT_RADIO_SLEEP == action) { /* go to sleep mode. */ MRFI_RxIdle(); MRFI_Sleep(); } else if (IOCTL_ACT_RADIO_AWAKE == action) { MRFI_WakeUp(); #if !defined( END_DEVICE ) MRFI_RxOn(); #endif } else if (IOCTL_ACT_RADIO_SIGINFO == action) { ioctlRadioSiginfo_t *pSigInfo = (ioctlRadioSiginfo_t *)val; connInfo_t *pCInfo = nwk_getConnInfo(pSigInfo->lid); if (!pCInfo) { return SMPL_BAD_PARAM; } memcpy(&pSigInfo->sigInfo, &pCInfo->sigInfo, sizeof(pCInfo->sigInfo)); } else if (IOCTL_ACT_RADIO_RSSI == action) { *((rssi_t *)val) = MRFI_Rssi(); } else if (IOCTL_ACT_RADIO_RXON == action) { MRFI_RxOn(); } else if (IOCTL_ACT_RADIO_RXIDLE == action) { MRFI_RxIdle(); } else { rc = SMPL_BAD_PARAM; } return rc; }
smplStatus_t nwk_radioControl(ioctlAction_t action, void *val) { smplStatus_t rc = SMPL_SUCCESS; if (IOCTL_ACT_RADIO_SLEEP == action) { /* go to sleep mode. */ MRFI_RxIdle(); MRFI_Sleep(); } else if (IOCTL_ACT_RADIO_AWAKE == action) { MRFI_WakeUp(); #if !defined(END_DEVICE) MRFI_RxOn(); #endif } else if (IOCTL_ACT_RADIO_SIGINFO == action) { ioctlRadioSiginfo_t *pSigInfo = (ioctlRadioSiginfo_t *)val; connInfo_t *pCInfo = nwk_getConnInfo(pSigInfo->lid); if (!pCInfo) { return SMPL_BAD_PARAM; } memcpy(&pSigInfo->sigInfo, &pCInfo->sigInfo, sizeof(pCInfo->sigInfo)); } else if (IOCTL_ACT_RADIO_RSSI == action) { *((rssi_t *)val) = MRFI_Rssi(); } else if (IOCTL_ACT_RADIO_RXON == action) { MRFI_RxOn(); } else if (IOCTL_ACT_RADIO_RXIDLE == action) { MRFI_RxIdle(); } #ifdef EXTENDED_API else if (IOCTL_ACT_RADIO_SETPWR == action) { uint8_t idx; switch (*(ioctlLevel_t *)val) { case IOCTL_LEVEL_2: idx = 2; break; case IOCTL_LEVEL_1: idx = 1; break; case IOCTL_LEVEL_0: idx = 0; break; default: return SMPL_BAD_PARAM; } MRFI_SetRFPwr(idx); return SMPL_SUCCESS; } #endif /* EXTENDED_API */ else { rc = SMPL_BAD_PARAM; } return rc; }
/*------------------------------------------------------------------------------ * Main *----------------------------------------------------------------------------*/ void main ( void ) { uint8_t tx_cmd; uint8_t tx_data; /* Initialize board devices */ BSP_Init(); MRFI_Init(); /* Setup I/O */ P1DIR |= (LED_RED+LED_GREEN); // Enable LEDs P1DIR &= ~PUSH_BUTTON; // Enable push button P1REN |= PUSH_BUTTON; // Enable pull-up/down resistor P1IE |= PUSH_BUTTON; // Enable interrupt P2DIR &= ~(TRIGGER_L2H+TRIGGER_H2L+MODE_SELECT); // Enable inputs P2IE |= (TRIGGER_L2H+TRIGGER_H2L); // Enable interrupts P2IES &= ~TRIGGER_L2H; // Set rising edge select P2IES |= TRIGGER_H2L; // Set falling edge select /* Setup Timer A */ BCSCTL3 |= LFXT1S_2; // Source VLO @ 12kHz TACCTL0 = CCIE; // Enable TimerA interrupt TACCR0 = 12000; // ~1Hz TACTL = MC_1+TASSEL_1; // Count up + ACLK /* Initialize device settings */ NODE1 |= LINK_MODE; /* Signal boot complete */ P1OUT |= (LED_RED+LED_GREEN); /* Enter main loop */ while(1) { __bis_SR_register(GIE+LPM3_bits); if (NODE1&MEASURE_VCC) { volatile long temp; P1OUT |= LED_GREEN; ADC10CTL1 = INCH_11; ADC10CTL0 = SREF_1 + ADC10SHT_2 + REFON + ADC10ON + ADC10IE + REF2_5V; __delay_cycles(240); ADC10CTL0 |= ENC + ADC10SC; __bis_SR_register(CPUOFF+GIE); temp = ADC10MEM; tx_cmd = NODE_ALIVE; tx_data = (temp*25)/512; ADC10CTL0 &= ~ENC; ADC10CTL0 &= ~(REFON + ADC10ON); NODE1 &= ~MEASURE_VCC; NODE1 |= (WAKE_RADIO+BROADCAST); TACCTL0 |= CCIE; P1OUT &= ~LED_GREEN; } if (NODE1&LINK_MODE) { P1OUT ^= (LED_RED+LED_GREEN); tx_cmd = NEW_NODE; NODE1 |= (WAKE_RADIO+BROADCAST); } else { if (NODE1&STATE_CHANGED) { if (NODE1&ALARMED) { P1OUT |= LED_RED; tx_cmd = ALARMED_NODE; } else { P1OUT &= ~LED_RED; tx_cmd = RESET_NODE; } NODE1 |= (WAKE_RADIO+BROADCAST); } else { if (NODE1&ALARMED) { P1OUT ^= LED_RED; } else { P1OUT &= ~LED_RED; } } } if (NODE1&WAKE_RADIO) { MRFI_WakeUp(); MRFI_RxOn(); } if (NODE1&BROADCAST) { mrfiPacket_t tx_packet; tx_packet.frame[0] = 8+20; tx_packet.frame[SRC_ADDR] = my_addr; tx_packet.frame[DST_ADDR] = 0x00; tx_packet.frame[CMD] = tx_cmd; tx_packet.frame[DATA] = tx_data; MRFI_Transmit(&tx_packet, MRFI_TX_TYPE_FORCED); NODE1 &= ~BROADCAST; } if (!(NODE1&WAKE_RADIO)) { MRFI_Sleep(); } } }
__interrupt void interrupt_fast_timeout (void) { stop_fast_timeout(); MRFI_Sleep(); __bis_SR_register_on_exit(LPM3_bits); }