summaryrefslogtreecommitdiff
path: root/digital/zigbit/bitcloud/stack/Components/HAL/avr/common/src/sleepTimer.c
blob: f83d244640ee80c2f3f36d049eb2ad616e95bbcb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/**************************************************************************//**
  \file   sleepTimer.c

  \brief  The implementation of the sleep timer.

  \author
      Atmel Corporation: http://www.atmel.com \n
      Support email: avr@atmel.com

    Copyright (c) 2008-2011, Atmel Corporation. All rights reserved.
    Licensed under Atmel's Limited License Agreement (BitCloudTM).

  \internal
    History:
      29/05/07 E. Ivanov - Created
 ******************************************************************************/
/******************************************************************************
 *   WARNING: CHANGING THIS FILE MAY AFFECT CORE FUNCTIONALITY OF THE STACK.  *
 *   EXPERT USERS SHOULD PROCEED WITH CAUTION.                                *
 ******************************************************************************/

/******************************************************************************
                   Includes section
******************************************************************************/
#include <sleepTimer.h>
#include <halSleepTimerClock.h>
#include <halSleep.h>

/******************************************************************************
                   Define(s) section
******************************************************************************/
#define HAL_NULL_POINTER                      -1
#define HAL_TIME_CAN_NOT_BE_COUNTED           -2
#define HAL_SLEEP_TIMER_HAS_ALREADY_STARTED   -3
#define HAL_SLEEP_TIMER_HAS_ALREADY_STOPPED   -1

/******************************************************************************
                   External global variables section
******************************************************************************/
extern HalSleepControl_t halSleepControl;

/******************************************************************************
                   Implementations section
******************************************************************************/
/******************************************************************************
Starts sleep timer. Interval must be greater one tick time.
  Parameters:
    sleepTimer - address of the HAL_SleepTimer_t.
  Returns:
    -1 - NULL pointer, \n
    -2 - interval can not be counted out, \n
    -3 - sleep timer has already started. \n
     0 - otherwise.
******************************************************************************/
int HAL_StartSleepTimer(HAL_SleepTimer_t *sleepTimer)
{
  uint32_t tempValue;

  if (!sleepTimer)
    return HAL_NULL_POINTER;

  // Convert millisecond interval to the sleep timer ticks.
  tempValue = (halSleepTimerFrequency() * sleepTimer->interval) / 1000ul;
  if (!tempValue)
    return HAL_TIME_CAN_NOT_BE_COUNTED;// Can't count out interval

  if (HAL_SLEEP_TIMER_IS_STARTED == halSleepControl.sleepTimerState) // there is active timer
    return HAL_SLEEP_TIMER_HAS_ALREADY_STARTED;

  halSleepControl.sleepTimerState = HAL_SLEEP_TIMER_IS_STARTED;
  halSleepControl.sleepTimer = *sleepTimer;
  // Start asynchronous timer2.
  halSetSleepTimerInterval(tempValue);
  return 0;
}// end sleepTimer_start

/******************************************************************************
Removes timer.
Parameters:
  sleepTimer - is not used now. For capabilities for old version.
Returns:
  -1 - there is no active sleep timer.
   0 - otherwise.
******************************************************************************/
int HAL_StopSleepTimer(HAL_SleepTimer_t *sleepTimer)
{
  (void)sleepTimer;

  // there is no active timer
  if (HAL_SLEEP_TIMER_IS_STOPPED == halSleepControl.sleepTimerState)
    return HAL_SLEEP_TIMER_HAS_ALREADY_STOPPED;
  halClearTimeControl();
  halSleepControl.sleepTimerState = HAL_SLEEP_TIMER_IS_STOPPED;

  return 0;
}

/******************************************************************************
Interrupt handler about sleep interval was completed.
******************************************************************************/
void halAsyncTimerHandler(void)
{
  // there isn't work timer
  if (HAL_SLEEP_TIMER_IS_STOPPED == halSleepControl.sleepTimerState)
    return;

  if (TIMER_REPEAT_MODE == halSleepControl.sleepTimer.mode)
  {
    if (halSleepControl.sleepTimer.callback)
      halSleepControl.sleepTimer.callback();

    // user can stop timer in callback
    if (HAL_SLEEP_TIMER_IS_STOPPED == halSleepControl.sleepTimerState)
      return;

    halSetSleepTimerInterval(halSleepControl.sleepTimer.interval);
  }
  else
  {
    halSleepControl.sleepTimerState = HAL_SLEEP_TIMER_IS_STOPPED;
    if (halSleepControl.sleepTimer.callback)
      halSleepControl.sleepTimer.callback();
  }
}

//eof sleepTimer.c