예제 #1
0
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;
}
예제 #2
0
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;
}
예제 #3
0
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;
}
예제 #4
0
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;

}
예제 #5
0
__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();
}
예제 #6
0
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;
}
예제 #7
0
/*
 * 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);
}