unsigned char LcdRtcUpdateHandlerIsr(void) { static unsigned char lastMin = 61; unsigned char ExitLpm = pdFALSE; /* send a message every second or once a minute */ if (RtcUpdateEnabled && CurrentMode == IDLE_MODE) { tMessage Msg; unsigned char Minute = RTCMIN; if (PageType == PAGE_TYPE_IDLE && (GetProperty(PROP_TIME_SECOND) || Minute != lastMin)) { SetupMessage(&Msg, UpdateClockMsg, MSG_OPT_NONE); SendMessageToQueueFromIsr(DISPLAY_QINDEX, &Msg); lastMin = Minute; ExitLpm = pdTRUE; } #if COUNTDOWN_TIMER else if (CurrentPage[PageType] == CountdownPage) { if (CountdownMode() == COUNTING && Minute != lastMin) { SetupMessage(&Msg, CountDownMsg, MSG_OPT_CNTDWN_TIME); SendMessageToQueueFromIsr(DISPLAY_QINDEX, &Msg); lastMin = Minute; ExitLpm = pdTRUE; } } #endif } return ExitLpm; }
unsigned char TermModeIsr(void) { static unsigned char i = 0; if (!ReceiveCompleted) { CmdBuf[i] = UCA3RXBUF; /* parse things based on carriage return */ if (CmdBuf[i] == DELIMITER || CmdBuf[i] == END_OF_XMIT) { /* change delimiter to null */ CmdBuf[i] = '\0'; i = 0; ReceiveCompleted = TRUE; /* send message so that message can be processed */ tMessage Msg; SetupMessage(&Msg, TermModeMsg, MSG_OPT_NONE); SendMessageToQueueFromIsr(DISPLAY_QINDEX, &Msg); return TRUE; } else i = (i < MAX_COMMAND_LENGTH - 1) ? i + 1 : 0; } return FALSE; }
unsigned char RxTestModeCharacterIsr(unsigned char Character) { unsigned char ExitLpm = 0; if ( WaitForCommandToBeProcessed == 0 ) { CmdString[RxIndex++] = Character; /* parse things based on carriage return */ if ( ( Character == DELIMITER_CHARACTER || Character == END_OF_XMIT_CHARACTER ) && RxIndex > MIN_COMMAND_LENGTH ) { /* change delimiter to null */ CmdString[RxIndex-1] = 0; WaitForCommandToBeProcessed = 1; /* send message so that message can be processed */ tMessage Msg; SetupMessage(&Msg, TestModeMsg, MSG_OPT_NONE); SendMessageToQueueFromIsr(DISPLAY_QINDEX, &Msg); ExitLpm = 1; } else if ( RxIndex > MAX_COMMAND_LENGTH-1 ) /* always let last char be 0 */ { RxIndex = 0; } } return ExitLpm; }
static unsigned char RateTestCallback(void) { unsigned char ExitLpm = 0; StartCrystalTimer(CRYSTAL_TIMER_ID3, RateTestCallback, RATE_TEST_INTERVAL_MS); /* send messages once we are connected and sniff mode */ if ( QueryConnectionState() == Connected && QuerySniffState() == Sniff ) { DEBUG5_PULSE(); tMessage Msg; SetupMessage(&Msg,RateTestMsg,NO_MSG_OPTIONS); SendMessageToQueueFromIsr(BACKGROUND_QINDEX,&Msg); ExitLpm = 1; } return ExitLpm; }
__interrupt void RTC_ISR(void) { unsigned char ExitLpm = 0; tMessage Msg; // compiler intrinsic, value must be even, and in the range of 0 to 10 switch(__even_in_range(RTCIV,10)) { case RTC_NO_INTERRUPT: break; case RTC_RDY_IFG: break; case RTC_EV_IFG: break; case RTC_A_IFG: break; case RTC_PRESCALE_ZERO_IFG: // divide by four to get 32 Hz if (DivideByFour >= 4-1) { DivideByFour = 0; if (RtcInUseMask & RTC_TIMER_VIBRATION) VibrationMotorStateMachineIsr(); if (RtcInUseMask & RTC_TIMER_BUTTON) { SetupMessage(&Msg, ButtonStateMsg, MSG_OPT_NONE); SendMessageToQueueFromIsr(DISPLAY_QINDEX, &Msg); ExitLpm = 1; } } else { DivideByFour ++; } break; case RTC_PRESCALE_ONE_IFG: #ifdef DIGITAL ExitLpm |= LcdRtcUpdateHandlerIsr(); #endif ExitLpm |= OneSecondTimerHandlerIsr(); break; default: break; } if (ExitLpm) EXIT_LPM_ISR(); }
unsigned char LcdRtcUpdateHandlerIsr(void) { /* send a message every second or once a minute */ if (RtcUpdateEnabled && CurrentMode == IDLE_MODE && PageType == PAGE_TYPE_IDLE && (GetProperty(PROP_TIME_SECOND) || lastMin != RTCMIN)) { lastMin = RTCMIN; tMessage Msg; SetupMessage(&Msg, UpdateClockMsg, MSG_OPT_NONE); SendMessageToQueueFromIsr(DISPLAY_QINDEX, &Msg); return pdTRUE; } else return pdFALSE; }
/* * The interrupt can either send a message to the host or * it can send data (send a message that causes the task to read data from * part and then send it to the host). */ void AccelerometerPinIsr(void) { #if 0 /* disabling the interrupt is the easiest way to make sure that * the stack does not get blasted with * data when it is in sleep mode */ ACCELEROMETER_INT_DISABLE(); #endif /* can't allocate buffer here so we must go to task to send interrupt * occurred message */ tMessage Msg; SetupMessage(&Msg, AccelMsg, MSG_OPT_ACCEL_DATA); SendMessageToQueueFromIsr(DISPLAY_QINDEX, &Msg); }