Initial Commit
[rtos-task-example/rtos-task-example.git] / notificationTask.c
1 /*
2  * Filename:    notificationTask.c
3  *
4  * Description: Additional Task that sends a notification the the select
5  *                              button is pressed on the SmartRF06 board. This is a dummy
6  *                              task to be used as a framework for making a more comlex
7  *                              task.
8  *
9  * Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/
10  *
11  *
12  *  Redistribution and use in source and binary forms, with or without
13  *  modification, are permitted provided that the following conditions
14  *  are met:
15  *
16  *    Redistributions of source code must retain the above copyright
17  *    notice, this list of conditions and the following disclaimer.
18  *
19  *    Redistributions in binary form must reproduce the above copyright
20  *    notice, this list of conditions and the following disclaimer in the
21  *    documentation and/or other materials provided with the
22  *    distribution.
23  *
24  *    Neither the name of Texas Instruments Incorporated nor the names of
25  *    its contributors may be used to endorse or promote products derived
26  *    from this software without specific prior written permission.
27  *
28  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
29  *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
30  *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
31  *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
32  *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
33  *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
34  *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
35  *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
36  *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
37  *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
38  *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
39  *
40 */
41 /*********************************************************************
42  * INCLUDES
43  */
44 #include <string.h>
46 #include <ti/sysbios/knl/Task.h>
47 #include <ti/sysbios/knl/Clock.h>
48 #include <ti/sysbios/knl/Semaphore.h>
49 #include <ti/sysbios/knl/Queue.h>
50 #include <ti/sysbios/family/arm/cc26xx/PowerCC2650.h>
51 #include <ti/sysbios/family/arm/m3/Hwi.h>
52 #include <ti/drivers/pin/PINCC26XX.h>
53 #include <ti/sysbios/knl/Task.h>
54 #include <ti/sysbios/knl/Swi.h>
55  
57 #include "gatt.h"
60 #include "inc/hw_memmap.h"
61 #include "inc/hw_ints.h"
63 #include "board_key.h"
64 #include "Board.h"
65 #include "notificationTask.h"
68 #include <ti/drivers/lcd/LCDDogm1286.h>
69 /*********************************************************************
70  * CONSTANTS
71  */
72 #define NOTIFY_TASK_PRIORITY                    1
74 #ifndef NOTIFY_TASK_STACK_SIZE
75 #define NOTIFY_TASK_STACK_SIZE                  644
76 #endif
77 #define TASK_NUM_ATTR_SUPPORTED                         1
79 #define NOTIFY_TASK_SELECT_EVT                                  0x0001
82 /*********************************************************************
83  * LOCAL VARIABLES
84  */
85 static PIN_Config notifySelectPinCfg[] =
86 {
87     Board_KEY_SELECT | PIN_GPIO_OUTPUT_DIS | PIN_INPUT_EN | PIN_PULLUP,
88     PIN_TERMINATE
89 };
90 //! \brief PIN State for select pin on SmartRF06 board
91 static PIN_State notifySelectPinState;
93 //! \brief PIN Handles for select pin on SmartRF06 board
94 static PIN_Handle hNotifySelectPin;
95 // Entity ID globally used to check for source and/or destination of messages
96 static ICall_EntityID selfEntity;
98 // Semaphore globally used to post events to the application thread
99 static ICall_Semaphore sem;
101 // Clock instances for internal periodic events.
102 static Clock_Struct periodicClock;
104 // Task configuration
105 Task_Struct notifyTask;
106 Char notifyTaskStack[NOTIFY_TASK_STACK_SIZE];
107 // events flag for internal application events.
108 static uint16_t events;
109 //Dummy Data to send in notificaiton
110 const UInt32 dataToNotify = 0xAAAA5555;
112 /*********************************************************************
113  * LOCAL FUNCTIONS
114  */
116 static void NotificationTask_init( void );
117 static void NotificationTask_taskFxn(UArg a0, UArg a1);
118 static void NotificationTask_selectPINHwiFxn(PIN_Handle hPin, PIN_Id pinId);
120 /*********************************************************************
121  * PROFILE CALLBACKS
122  */
126 /*********************************************************************
127  * PUBLIC FUNCTIONS
128  */
130 /*********************************************************************
131  * @fn      NotificationTask_createTask
132  *
133  * @brief   Task creation function for the Notification Task
134  *
135  * @param   None.
136  *
137  * @return  None.
138  */
139 void NotificationTask_createTask(void)
141   Task_Params taskParams;
143   // Configure task
144   Task_Params_init(&taskParams);
145   taskParams.stack = notifyTaskStack;
146   taskParams.stackSize = NOTIFY_TASK_STACK_SIZE;
147   taskParams.priority = NOTIFY_TASK_PRIORITY;
149   Task_construct(&notifyTask, NotificationTask_taskFxn, &taskParams, NULL);
152 /*********************************************************************
153  * @fn      NotificationTask_init
154  *
155  * @brief   Called during initialization and contains application
156  *          specific initialization (ie. hardware initialization/setup,
157  *          table initialization, power up notification, etc), and
158  *          profile initialization/setup.
159  *
160  * @param   None.
161  *
162  * @return  None.
163  */
164 static void NotificationTask_init(void)
166   // ******************************************************************
167   // N0 STACK API CALLS CAN OCCUR BEFORE THIS CALL TO ICall_registerApp
168   // ******************************************************************
169   // Register the current thread as an ICall dispatcher application
170   // so that the application can send and receive messages.
171   ICall_registerApp(&selfEntity, &sem);
173   //Open the select pin on the board, and register it for interrupts
174   hNotifySelectPin = PIN_open(&notifySelectPinState, notifySelectPinCfg);
175   PIN_registerIntCb(hNotifySelectPin, NotificationTask_selectPINHwiFxn);
176   PIN_setConfig(hNotifySelectPin,
177           PIN_BM_IRQ,
178           Board_KEY_SELECT | PIN_IRQ_BOTHEDGES);
180   // Enable wakeup
181   PIN_setConfig(hNotifySelectPin,
182           PINCC26XX_BM_WAKEUP,
183           Board_KEY_SELECT | PINCC26XX_WAKEUP_NEGEDGE);
187 /*********************************************************************
188  * @fn      NotificationTask_taskFxn
189  *
190  * @brief   Application task entry point for the Notification Task.
191  *
192  * @param   a0, a1 - not used.
193  *
194  * @return  None.
195  */
196 static void NotificationTask_taskFxn(UArg a0, UArg a1)
198         // Initialize application
199         NotificationTask_init();
201         // Application main loop
202         for (;;)
203         {
204             // Waits for a signal to the semaphore associated with the calling thread.
205             // Note that the semaphore associated with a thread is signaled when a
206             // message is queued to the message receive queue of the thread or when
207             // ICall_signal() function is called onto the semaphore.
208             ICall_Errno errno = ICall_wait(ICALL_TIMEOUT_FOREVER);
211             if (events & NOTIFY_TASK_SELECT_EVT)
212             {
213                 //Set up notificaiton data
214                 uint16 len = sizeof(UInt32);
215                         attHandleValueNoti_t noti;
216                         bStatus_t status;
217                         noti.handle = 0x1E;
218                         noti.len = len;
221                         //attempt to allocate payload
222                         noti.pValue = (uint8 *)GATT_bm_alloc( 0, ATT_HANDLE_VALUE_NOTI, GATT_MAX_MTU, &len );
224                         if ( noti.pValue != NULL ) //if allocated
225                         {
226                           //place index
227                           noti.pValue[0] = (dataToNotify >> 24) & 0xFF;
228                           noti.pValue[1] = (dataToNotify >> 16) & 0xFF;
229                           noti.pValue[2] = (dataToNotify >> 8) & 0xFF;
230                           noti.pValue[3] = dataToNotify & 0xFF;
231                           status = GATT_Notification( 0, &noti, 0 );    //attempt to send
232                           if ( status != SUCCESS ) //if noti not sent
233                           {
234                                 GATT_bm_free( (gattMsg_t *)&noti, ATT_HANDLE_VALUE_NOTI );
235                           }
236                         }
237                         else
238                         {
239                           //bleNoResources
240                           asm(" NOP");
241                         }
242                         //Clear the event
243                 events &= ~NOTIFY_TASK_SELECT_EVT;
244             }
246         }
249 static void NotificationTask_selectPINHwiFxn(PIN_Handle hPin, PIN_Id pinId)
251         if (sem != NULL)
252         {
253                 //Set the event and wake up the task
254                 events |= NOTIFY_TASK_SELECT_EVT;
255                 Semaphore_post(sem);
256         }