This CLI (Command Line Interface) is based mbed-os. Both NNN50 and NQ620 are supported.
Fork of NNN40_CLI by
BLE CLI Document can be downloaded here .
Note that when evaluate using Windows PC as the host, the Serial driver need to be installed in advance. The instruction is explained in the link below
https://developer.mbed.org/handbook/Windows-serial-configuration
Once installed, a device called 'mbed Serial Port (COM#)' should be recognized in Device Manager, as shown below
Please open the com port at 115200 8n1 as default
Revision 25:1423b707b705, committed 2017-05-12
- Comitter:
- tsungta
- Date:
- Fri May 12 01:53:35 2017 +0000
- Parent:
- 24:838a0b25934b
- Commit message:
- update mbed-os to revision 2992; Note that NNN50 is temporary not supported due to the memory constraint
Changed in this revision
--- a/CLI_Source/ble_cli.cpp Fri Nov 11 09:02:51 2016 +0000
+++ b/CLI_Source/ble_cli.cpp Fri May 12 01:53:35 2017 +0000
@@ -15,8 +15,8 @@
//0920 Silvia modify
#if defined(TARGET_DELTA_DFBM_NQ620)
#define MODULE_NAME "DFBM-NQ620"
-#else if defined(TARGET_DELTA_DFCM_NNN40)
-#define MODULE_NAME "DFCM-NNN40-DT1R"
+#else if defined(TARGET_DELTA_DFCM_NNN50)
+#define MODULE_NAME "DFCM-NNN50"
#endif
//0920 Silvia modify
@@ -395,7 +395,7 @@
#if defined(TARGET_DELTA_DFBM_NQ620)
const uint8_t NUM_TXPOW = 7;
int8_t validTxPow[NUM_TXPOW] = {-20, -16, -12, -8, -4, 0, 4};
-#else if defined(TARGET_DELTA_DFCM_NNN40)
+#else if defined(TARGET_DELTA_DFCM_NNN50)
const uint8_t NUM_TXPOW = 9;
int8_t validTxPow[NUM_TXPOW] = {-40, -30, -20, -16, -12, -8, -4, 0, 4};
#endif
@@ -405,8 +405,8 @@
if ( arg != NULL ) {
#if defined(TARGET_DELTA_DFBM_NQ620)
setValue = atoi((const char *)arg);
-#else if defined(TARGET_DELTA_DFCM_NNN40)
- setValue = cyntecAtoInt(arg);//work around for NNN40 since somehow atoi doesn't work properly
+#else if defined(TARGET_DELTA_DFCM_NNN50)
+ setValue = cyntecAtoInt(arg);//work around for NNN50 since somehow atoi doesn't work properly
#endif
for (i = 0; i < NUM_TXPOW; i++) {
if (setValue == validTxPow[i]) {
@@ -1203,7 +1203,7 @@
}
/*Tsungta, @0913 modify to compatiable with mbed os 5.0*/
-#include <mbed-events/events.h>
+//#include <mbed-events/events.h>
void onBleInitError(BLE &ble, ble_error_t error)
{
(void)ble;
@@ -1222,7 +1222,7 @@
void scheduleBleEventsProcessing(BLE::OnEventsToProcessCallbackContext* context) {
BLE &deltaBLE = BLE::Instance();
- eventQueue.post(Callback<void()>(&deltaBLE, &BLE::processEvents));
+ eventQueue.call(Callback<void()>(&deltaBLE, &BLE::processEvents));
}
void cynBLEInitCommand(void)
--- a/main.cpp Fri Nov 11 09:02:51 2016 +0000 +++ b/main.cpp Fri May 12 01:53:35 2017 +0000 @@ -1,4 +1,3 @@ -#include <mbed-events/events.h> #include <mbed.h> #include "Gap.h" @@ -7,8 +6,12 @@ #include "ble_cli.h" +#if defined(TARGET_DELTA_DFCM_NNN50) +#error Delta_CLI is not supported on NNN50 temporary due to the memory constraint +#endif + #define uart_buffer_size 64 //Do not increase uart_buffer_size to prevent out of memory, -#define uart_baudrate 38400 //supported baudrate range between 1200 to 230400 (38400) for NQ620 (NNN40) +#define uart_baudrate 38400 //supported baudrate range between 1200 to 230400 (38400) for NQ620 (NNN50) unsigned char uart_buf[uart_buffer_size]; unsigned int i = 0;
--- a/mbed-events/EventLoop.cpp Fri Nov 11 09:02:51 2016 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,50 +0,0 @@
-#ifdef MBED_CONF_RTOS_PRESENT
-#include "EventLoop.h"
-
-#include "events.h"
-#include "rtos.h"
-#include "mbed.h"
-
-
-EventLoop::EventLoop(
- osPriority priority,
- unsigned event_size,
- unsigned char *event_pointer,
- uint32_t stack_size,
- unsigned char *stack_pointer)
- : EventQueue(event_size, event_pointer)
- , _thread(priority, stack_size, stack_pointer)
- , _running(false) {
-}
-
-EventLoop::~EventLoop() {
- stop();
-}
-
-static void run(EventLoop *loop) {
- loop->dispatch();
-}
-
-osStatus EventLoop::start() {
- if (_running) {
- return osOK;
- }
-
- osStatus status = _thread.start(this, run);
- _running = (status == osOK);
- return status;
-}
-
-osStatus EventLoop::stop() {
- if (!_running) {
- return osOK;
- }
-
- break_();
- osStatus status = _thread.join();
- _running = false;
- return status;
-}
-
-#endif
-
--- a/mbed-events/EventLoop.h Fri Nov 11 09:02:51 2016 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,75 +0,0 @@
-/* events
- * Copyright (c) 2006-2013 ARM Limited
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifdef MBED_CONF_RTOS_PRESENT
-#ifndef EVENT_LOOP_H
-#define EVENT_LOOP_H
-
-#include "EventQueue.h"
-#include "Thread.h"
-
-namespace events {
-
-
-/** EventLoop
- *
- * An event queue wrapped in a thread
- */
-class EventLoop : public EventQueue {
-public:
- /** Create an event loop
- *
- * @param priority Initial priority of the thread
- * (default: osPriorityNormal)
- * @param queue_size Size of buffer to use for events
- * (default: DEFAULT_QUEUE_SIZE)
- * @param queue_pointer Pointer to memory region to use for events
- * (default: NULL)
- * @param stack_size Stack size (in bytes) requirements for the thread
- * (default: DEFAULT_STACK_SIZE)
- * @param stack_pointer Pointer to stack area to be used by the thread
- * (default: NULL)
- */
- EventLoop(osPriority priority=osPriorityNormal,
- unsigned event_size=DEFAULT_QUEUE_SIZE,
- unsigned char *event_pointer=NULL,
- uint32_t stack_size=DEFAULT_STACK_SIZE,
- unsigned char *stack_pointer=NULL);
-
- /** Clean up event loop
- */
- ~EventLoop();
-
- /** Starts an event loop running in a dedicated thread
- * @return status code that indicates the execution status of the function.
- */
- osStatus start();
-
- /** Stops an event loop cleanly, waiting for any currently executing events
- * @return status code that indicates the execution status of the function.
- */
- osStatus stop();
-
-private:
- rtos::Thread _thread;
- bool _running;
-};
-
-
-}
-
-#endif
-#endif
-
--- a/mbed-events/EventQueue.cpp Fri Nov 11 09:02:51 2016 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,36 +0,0 @@
-#include "EventQueue.h"
-
-#include "events-c/events.h"
-#include "events.h"
-#include "mbed.h"
-
-
-EventQueue::EventQueue(unsigned event_size, unsigned char *event_pointer) {
- if (!event_pointer) {
- equeue_create(&_equeue, event_size);
- } else {
- equeue_create_inplace(&_equeue, event_size, event_pointer);
- }
-}
-
-EventQueue::~EventQueue() {
- equeue_destroy(&_equeue);
-}
-
-void EventQueue::dispatch(int ms) {
- return equeue_dispatch(&_equeue, ms);
-}
-
-void EventQueue::break_() {
- return equeue_break(&_equeue);
-}
-
-unsigned EventQueue::get_tick() {
- return events_tick();
-}
-
-void EventQueue::cancel(int id) {
- return event_cancel(&_equeue, id);
-}
-
-
--- a/mbed-events/EventQueue.h Fri Nov 11 09:02:51 2016 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,294 +0,0 @@
-/* events
- * Copyright (c) 2006-2013 ARM Limited
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef EVENT_QUEUE_H
-#define EVENT_QUEUE_H
-
-#include "events-c/events.h"
-#include "Callback.h"
-#include <cstddef>
-#include <new>
-
-namespace events {
-
-
-/** DEFAULT_QUEUE_SIZE
- * default size of buffer for events
- */
-#define DEFAULT_QUEUE_SIZE \
- (32*(sizeof(struct event) + sizeof(mbed::Callback<void()>)))
-
-
-/** EventQueue
- *
- * Flexible event queue
- */
-class EventQueue {
-public:
- /** Create an event queue
- *
- * @param queue_size Size of buffer to use for events
- * (default: DEFAULT_QUEUE_SIZE)
- * @param queue_pointer Pointer to memory region to use for events
- * (default: NULL)
- */
- EventQueue(unsigned queue_size=DEFAULT_QUEUE_SIZE,
- unsigned char *queue_pointer=NULL);
-
- /** Destroy an event queue
- */
- ~EventQueue();
-
- /** Dispatch pending events
- * @param ms Time to wait for events in milliseconds, 0 will return
- * immediately if no events are pending, a negative
- * value will dispatch events forever
- * (default: -1)
- */
- void dispatch(int ms=-1);
-
- /* Monotonic counter for the event queue
- * @return A monotonically incrementing counter in milliseconds
- * this count intentionally overflows to 0 after 2^32-1
- */
- unsigned get_tick();
-
- /** Cancel events that are in flight
- *
- * If event has already been dispatched or does not exist, no error occurs.
- *
- * @param id Event id to cancel
- * @note This can not stop a currently executing event
- */
- void cancel(int id);
-
- /** Post an event to the queue
- *
- * @param f Function to call on event dispatch
- * @param a0..a4 Arguments to pass to the callback
- * @return A positive id representing the event in the queue,
- * or 0 on failure
- */
- template <typename F>
- int post(F f) {
- void *p = event_alloc(&_equeue, sizeof(F));
- if (!p) {
- return 0;
- }
-
- F *e = new (p) F(f);
- event_dtor(e, &EventQueue::dtor<F>);
- return event_post(&_equeue, &EventQueue::call<F>, e);
- }
-
- template <typename F, typename A0>
- int post(F f, A0 a0) {
- return post(Context1<F,A0>(f,a0));
- }
-
- template <typename F, typename A0, typename A1>
- int post(F f, A0 a0, A1 a1) {
- return post(Context2<F,A0,A1>(f,a0,a1));
- }
-
- template <typename F, typename A0, typename A1, typename A2>
- int post(F f, A0 a0, A1 a1, A2 a2) {
- return post(Context3<F,A0,A1,A2>(f,a0,a1,a2));
- }
-
- template <typename F, typename A0, typename A1, typename A2, typename A3>
- int post(F f, A0 a0, A1 a1, A2 a2, A3 a3) {
- return post(Context4<F,A0,A1,A2,A3>(f,a0,a1,a2,a3));
- }
-
- template <typename F, typename A0, typename A1, typename A2, typename A3, typename A4>
- int post(F f, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) {
- return post(Context5<F,A0,A1,A2,A3,A4>(f,a0,a1,a2,a3,a4));
- }
-
- /** Post an event to the queue after a specified delay
- *
- * @param f Function to call on event dispatch
- * @param a0..a4 Arguments to pass to the callback
- * @param ms Time to delay in milliseconds
- * @return A positive id representing the event in the queue,
- * or 0 on failure
- */
- template <typename F>
- int post_in(int ms, F f) {
- void *p = event_alloc(&_equeue, sizeof(F));
- if (!p) {
- return 0;
- }
-
- F *e = new (p) F(f);
- event_delay(e, ms);
- event_dtor(e, &EventQueue::dtor<F>);
- return event_post(&_equeue, &EventQueue::call<F>, e);
- }
-
- template <typename F, typename A0>
- int post_in(int ms, F f, A0 a0) {
- return post_in(ms, Context1<F,A0>(f,a0));
- }
-
- template <typename F, typename A0, typename A1>
- int post_in(int ms, F f, A0 a0, A1 a1) {
- return post_in(ms, Context2<F,A0,A1>(f,a0,a1));
- }
-
- template <typename F, typename A0, typename A1, typename A2>
- int post_in(int ms, F f, A0 a0, A1 a1, A2 a2) {
- return post_in(ms, Context3<F,A0,A1,A2>(f,a0,a1,a2));
- }
-
- template <typename F, typename A0, typename A1, typename A2, typename A3>
- int post_in(int ms, F f, A0 a0, A1 a1, A2 a2, A3 a3) {
- return post_in(ms, Context4<F,A0,A1,A2,A3>(f,a0,a1,a2,a3));
- }
-
- template <typename F, typename A0, typename A1, typename A2, typename A3, typename A4>
- int post_in(int ms, F f, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) {
- return post_in(ms, Context5<F,A0,A1,A2,A3,A4>(f,a0,a1,a2,a3,a4));
- }
-
- /** Post an event to the queue periodically
- *
- * @param f Function to call on event dispatch
- * @param a0..a4 Arguments to pass to the callback
- * @param ms Period of the event in milliseconds
- * @return A positive id representing the event in the queue,
- * or 0 on failure
- */
- template <typename F>
- int post_every(int ms, F f) {
- void *p = event_alloc(&_equeue, sizeof(F));
- if (!p) {
- return 0;
- }
-
- F *e = new (p) F(f);
- event_delay(e, ms);
- event_period(e, ms);
- event_dtor(e, &EventQueue::dtor<F>);
- return event_post(&_equeue, &EventQueue::call<F>, e);
- }
-
- template <typename F, typename A0>
- int post_every(int ms, F f, A0 a0) {
- return post_every(ms, Context1<F,A0>(f,a0));
- }
-
- template <typename F, typename A0, typename A1>
- int post_every(int ms, F f, A0 a0, A1 a1) {
- return post_every(ms, Context2<F,A0,A1>(f,a0,a1));
- }
-
- template <typename F, typename A0, typename A1, typename A2>
- int post_every(int ms, F f, A0 a0, A1 a1, A2 a2) {
- return post_every(ms, Context3<F,A0,A1,A2>(f,a0,a1,a2));
- }
-
- template <typename F, typename A0, typename A1, typename A2, typename A3>
- int post_every(int ms, F f, A0 a0, A1 a1, A2 a2, A3 a3) {
- return post_every(ms, Context4<F,A0,A1,A2,A3>(f,a0,a1,a2,a3));
- }
-
- template <typename F, typename A0, typename A1, typename A2, typename A3, typename A4>
- int post_every(int ms, F f, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) {
- return post_every(ms, Context5<F,A0,A1,A2,A3,A4>(f,a0,a1,a2,a3,a4));
- }
-
-protected:
- void break_();
-
- struct equeue _equeue;
-
- template <typename F, typename A0, typename A1, typename A2, typename A3, typename A4>
- struct Context5 {
- F f; A0 a0; A1 a1; A2 a2; A3 a3; A4 a4;
-
- Context5(F f, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4)
- : f(f), a0(a0), a1(a1), a2(a2), a3(a3), a4(a4) {}
-
- void operator()() {
- f(a0, a1, a2, a3, a4);
- }
- };
-
- template <typename F, typename A0, typename A1, typename A2, typename A3>
- struct Context4 {
- F f; A0 a0; A1 a1; A2 a2; A3 a3;
-
- Context4(F f, A0 a0, A1 a1, A2 a2, A3 a3)
- : f(f), a0(a0), a1(a1), a2(a2), a3(a3) {}
-
- void operator()() {
- f(a0, a1, a2, a3);
- }
- };
-
- template <typename F, typename A0, typename A1, typename A2>
- struct Context3 {
- F f; A0 a0; A1 a1; A2 a2;
-
- Context3(F f, A0 a0, A1 a1, A2 a2)
- : f(f), a0(a0), a1(a1), a2(a2) {}
-
- void operator()() {
- f(a0, a1, a2);
- }
- };
-
- template <typename F, typename A0, typename A1>
- struct Context2 {
- F f; A0 a0; A1 a1;
-
- Context2(F f, A0 a0, A1 a1)
- : f(f), a0(a0), a1(a1) {}
-
- void operator()() {
- f(a0, a1);
- }
- };
-
- template <typename F, typename A0>
- struct Context1 {
- F f; A0 a0;
-
- Context1(F f, A0 a0)
- : f(f), a0(a0) {}
-
- void operator()() {
- f(a0);
- }
- };
-
- template <typename T>
- static void call(void *p) {
- (*static_cast<T*>(p))();
- }
-
- template <typename T>
- static void dtor(void *p) {
- static_cast<T*>(p)->~T();
- }
-};
-
-
-}
-
-#endif
-
--- a/mbed-events/events-c/events.c Fri Nov 11 09:02:51 2016 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,336 +0,0 @@
-#include "events.h"
-
-#include <stdlib.h>
-#include <string.h>
-
-
-int equeue_create(equeue_t *q, unsigned size) {
- void *buffer = malloc(size);
- if (!buffer) {
- return -1;
- }
-
- int err = equeue_create_inplace(q, size, buffer);
- q->buffer = buffer;
- return err;
-}
-
-int equeue_create_inplace(equeue_t *q, unsigned size, void *buffer) {
- q->slab.size = size;
- q->slab.data = buffer;
- q->chunks = 0;
- q->buffer = 0;
-
- q->queue = 0;
- q->next_id = 42;
- q->break_ = (struct event){
- .id = 0,
- .period = -1,
- };
-
- int err;
- err = events_sema_create(&q->eventsema);
- if (err < 0) {
- return err;
- }
-
- err = events_mutex_create(&q->queuelock);
- if (err < 0) {
- return err;
- }
-
- err = events_mutex_create(&q->freelock);
- if (err < 0) {
- return err;
- }
-
- return 0;
-}
-
-void equeue_destroy(equeue_t *q) {
- while (q->queue) {
- struct event *e = q->queue;
- q->queue = e->next;
- event_dealloc(q, e+1);
- }
-
- events_mutex_destroy(&q->freelock);
- events_mutex_destroy(&q->queuelock);
- events_sema_destroy(&q->eventsema);
- free(q->buffer);
-}
-
-// equeue allocation functions
-static void *equeue_alloc(equeue_t *q, unsigned size) {
- size = size + sizeof(unsigned);
- size = (size + sizeof(unsigned)-1) & ~(sizeof(unsigned)-1);
- if (size < sizeof(struct equeue_chunk)) {
- size = sizeof(struct equeue_chunk);
- }
-
- events_mutex_lock(&q->freelock);
-
- for (struct equeue_chunk **p = &q->chunks; *p; p = &(*p)->nchunk) {
- if ((*p)->size >= size) {
- struct equeue_chunk *c = *p;
- if (c->next) {
- *p = c->next;
- (*p)->nchunk = c->nchunk;
- } else {
- *p = c->nchunk;
- }
- events_mutex_unlock(&q->freelock);
- return (unsigned *)c + 1;
- }
- }
-
- if (q->slab.size >= size) {
- struct equeue_chunk *c = (struct equeue_chunk *)q->slab.data;
- q->slab.data += size;
- q->slab.size -= size;
- c->size = size;
- events_mutex_unlock(&q->freelock);
- return (unsigned *)c + 1;
- }
-
- events_mutex_unlock(&q->freelock);
- return 0;
-}
-
-static void equeue_dealloc(equeue_t *q, void *e) {
- struct equeue_chunk *c = (struct equeue_chunk *)((unsigned *)e - 1);
-
- events_mutex_lock(&q->freelock);
-
- struct equeue_chunk **p = &q->chunks;
- while (*p && (*p)->size < c->size) {
- p = &(*p)->nchunk;
- }
-
- if (*p && (*p)->size == c->size) {
- c->next = *p;
- c->nchunk = (*p)->nchunk;
- } else {
- c->next = 0;
- c->nchunk = *p;
- }
- *p = c;
-
- events_mutex_unlock(&q->freelock);
-}
-
-// event allocation functions
-static inline int event_next_id(equeue_t *q) {
- int id = q->next_id++;
- if (q->next_id < 0) {
- q->next_id = 42;
- }
- return id;
-}
-
-void *event_alloc(equeue_t *q, unsigned size) {
- struct event *e = equeue_alloc(q, sizeof(struct event) + size);
- if (!e) {
- return 0;
- }
-
- e->id = event_next_id(q);
- e->target = 0;
- e->period = -1;
- e->dtor = 0;
-
- return e + 1;
-}
-
-void event_dealloc(equeue_t *q, void *p) {
- struct event *e = (struct event*)p - 1;
-
- if (e->dtor) {
- e->dtor(e+1);
- }
-
- equeue_dealloc(q, e);
-}
-
-// equeue scheduling functions
-static inline int equeue_tickdiff(unsigned a, unsigned b) {
- return (int)(a - b);
-}
-
-static void equeue_enqueue(equeue_t *q, struct event *e, unsigned ms) {
- e->target = events_tick() + ms;
-
- struct event **p = &q->queue;
- while (*p && equeue_tickdiff((*p)->target, e->target) <= 0) {
- p = &(*p)->next;
- }
-
- e->next = *p;
- *p = e;
-}
-
-static struct event *equeue_dequeue(equeue_t *q, int id) {
- for (struct event **p = &q->queue; *p; p = &(*p)->next) {
- if ((*p)->id == id) {
- struct event *e = *p;
- *p = (*p)->next;
- return e;
- }
- }
-
- return 0;
-}
-
-static int equeue_post(equeue_t *q, struct event *e, int ms) {
- int id = e->id;
- if (ms < 0) {
- event_dealloc(q, e+1);
- return id;
- }
-
- events_mutex_lock(&q->queuelock);
- equeue_enqueue(q, e, ms);
- events_mutex_unlock(&q->queuelock);
-
- events_sema_release(&q->eventsema);
- return id;
-}
-
-static void equeue_cancel(equeue_t *q, int id) {
- events_mutex_lock(&q->queuelock);
- struct event *e = equeue_dequeue(q, id);
- events_mutex_unlock(&q->queuelock);
-
- if (e) {
- event_dealloc(q, e+1);
- }
-}
-
-void equeue_break(equeue_t *q) {
- equeue_post(q, &q->break_, 0);
-}
-
-void equeue_dispatch(equeue_t *q, int ms) {
- if (ms >= 0) {
- equeue_post(q, &q->break_, ms);
- }
-
- while (1) {
- int deadline = -1;
-
- while (q->queue) {
- deadline = -1;
-
- events_mutex_lock(&q->queuelock);
- if (!q->queue) {
- events_mutex_unlock(&q->queuelock);
- break;
- }
-
- deadline = equeue_tickdiff(q->queue->target, events_tick());
- if (deadline > 0) {
- events_mutex_unlock(&q->queuelock);
- break;
- }
-
- struct event *e = q->queue;
- q->queue = e->next;
-
- if (e->period >= 0) {
- // requeue periodic tasks to avoid race conditions
- // in event_cancel
- equeue_enqueue(q, e, e->period);
- }
- events_mutex_unlock(&q->queuelock);
-
- if (e == &q->break_) {
- return;
- }
-
- // actually dispatch the callback
- e->cb(e + 1);
-
- if (e->period < 0) {
- event_dealloc(q, e+1);
- }
- }
-
- events_sema_wait(&q->eventsema, deadline);
- }
-}
-
-// event functions
-void event_delay(void *p, int ms) {
- struct event *e = (struct event*)p - 1;
- e->target = ms;
-}
-
-void event_period(void *p, int ms) {
- struct event *e = (struct event*)p - 1;
- e->period = ms;
-}
-
-void event_dtor(void *p, void (*dtor)(void *)) {
- struct event *e = (struct event*)p - 1;
- e->dtor = dtor;
-}
-
-// event operations
-int event_post(equeue_t *q, void (*cb)(void*), void *p) {
- struct event *e = (struct event*)p - 1;
- e->cb = cb;
- int id = equeue_post(q, e, e->target);
- return id;
-}
-
-void event_cancel(equeue_t *q, int id) {
- equeue_cancel(q, id);
-}
-
-// simple callbacks
-struct ecallback {
- void (*cb)(void*);
- void *data;
-};
-
-static void ecallback_dispatch(void *p) {
- struct ecallback *e = (struct ecallback*)p;
- e->cb(e->data);
-}
-
-int event_call(equeue_t *q, void (*cb)(void*), void *data) {
- struct ecallback *e = event_alloc(q, sizeof(struct ecallback));
- if (!e) {
- return 0;
- }
-
- e->cb = cb;
- e->data = data;
- return event_post(q, ecallback_dispatch, e);
-}
-
-int event_call_in(equeue_t *q, int ms, void (*cb)(void*), void *data) {
- struct ecallback *e = event_alloc(q, sizeof(struct ecallback));
- if (!e) {
- return 0;
- }
-
- event_delay(e, ms);
- e->cb = cb;
- e->data = data;
- return event_post(q, ecallback_dispatch, e);
-}
-
-int event_call_every(equeue_t *q, int ms, void (*cb)(void*), void *data) {
- struct ecallback *e = event_alloc(q, sizeof(struct ecallback));
- if (!e) {
- return 0;
- }
-
- event_delay(e, ms);
- event_period(e, ms);
- e->cb = cb;
- e->data = data;
- return event_post(q, ecallback_dispatch, e);
-}
-
--- a/mbed-events/events-c/events.h Fri Nov 11 09:02:51 2016 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,129 +0,0 @@
-/*
- * Flexible event queue for dispatching events
- */
-#ifndef EVENTS_H
-#define EVENTS_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-// System specific files
-#include "events_tick.h"
-#include "events_mutex.h"
-#include "events_sema.h"
-
-
-// Event/queue structures
-struct event {
- struct event *next;
- int id;
- unsigned target;
- int period;
- void (*dtor)(void *);
-
- void (*cb)(void *);
- // data follows
-};
-
-typedef struct equeue {
- struct event *queue;
- int next_id;
-
- void *buffer;
- struct equeue_chunk {
- unsigned size;
- struct equeue_chunk *next;
- struct equeue_chunk *nchunk;
- } *chunks;
- struct equeue_slab {
- unsigned size;
- unsigned char *data;
- } slab;
-
- struct event break_;
-
- events_sema_t eventsema;
- events_mutex_t queuelock;
- events_mutex_t freelock;
-} equeue_t;
-
-// Queue operations
-//
-// Creation results in negative value on failure.
-int equeue_create(equeue_t *queue, unsigned size);
-int equeue_create_inplace(equeue_t *queue, unsigned size, void *buffer);
-void equeue_destroy(equeue_t *queue);
-
-// Dispatch events
-//
-// Executes any callbacks enqueued for the specified time in milliseconds,
-// or forever if ms is negative
-void equeue_dispatch(equeue_t *queue, int ms);
-
-// Break a running event loop
-//
-// Shuts down an unbounded event loop. Already pending events may finish
-// executing, but the queue will not continue looping indefinitely.
-void equeue_break(equeue_t *queue);
-
-// Simple event calls
-//
-// Passed callback will be executed in the associated equeue's
-// dispatch call with the data pointer passed unmodified
-//
-// event_call - Immediately post an event to the queue
-// event_call_in - Post an event after a specified time in milliseconds
-// event_call_every - Post an event periodically in milliseconds
-//
-// These calls will result in 0 if no memory is available, otherwise they
-// will result in a unique identifier that can be passed to event_cancel.
-int event_call(equeue_t *queue, void (*cb)(void *), void *data);
-int event_call_in(equeue_t *queue, int ms, void (*cb)(void *), void *data);
-int event_call_every(equeue_t *queue, int ms, void (*cb)(void *), void *data);
-
-// Events with queue handled blocks of memory
-//
-// Argument to event_post must point to a result of a event_alloc call
-// and the associated memory is automatically freed after the event
-// is dispatched.
-//
-// event_alloc will result in null if no memory is available
-// or the requested size is less than the size passed to equeue_create.
-void *event_alloc(equeue_t *queue, unsigned size);
-void event_dealloc(equeue_t *queue, void *event);
-
-// Configure an allocated event
-//
-// event_delay - Specify a millisecond delay before posting an event
-// event_period - Specify a millisecond period to repeatedly post an event
-// event_dtor - Specify a destructor to run before the memory is deallocated
-void event_delay(void *event, int ms);
-void event_period(void *event, int ms);
-void event_dtor(void *event, void (*dtor)(void *));
-
-// Post an allocted event to the event queue
-//
-// Argument to event_post must point to a result of a event_alloc call
-// and the associated memory is automatically freed after the event
-// is dispatched.
-//
-// This call results in an unique identifier that can be passed to
-// event_cancel.
-int event_post(equeue_t *queue, void (*cb)(void *), void *event);
-
-// Cancel events that are in flight
-//
-// Every event_call function returns a non-negative identifier on success
-// that can be used to cancel an in-flight event. If the event has already
-// been dispatched or does not exist, no error occurs. Note, this can not
-// stop a currently executing event
-void event_cancel(equeue_t *queue, int event);
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
-
--- a/mbed-events/events-c/events_mbed.cpp Fri Nov 11 09:02:51 2016 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,103 +0,0 @@
-#if defined(__MBED__)
-
-#include "events_tick.h"
-#include "events_sema.h"
-#include "events_mutex.h"
-
-#include <stdbool.h>
-#include "mbed.h"
-#ifdef MBED_CONF_RTOS_PRESENT
-#include "rtos.h"
-#endif
-
-
-// Ticker operations
-static class GlobalTicker {
-public:
- GlobalTicker() {
- _tick = 0;
- _timer.start();
- _ticker.attach_us(this, &GlobalTicker::step, (1 << 16) * 1000);
- };
-
- void step() {
- _timer.reset();
- _tick += 1 << 16;
- }
-
- unsigned tick() {
- return _tick + (unsigned)_timer.read_ms();
- }
-
-private:
- unsigned _tick;
- Timer _timer;
- Ticker _ticker;
-} gticker;
-
-unsigned events_tick() {
- return gticker.tick();
-}
-
-
-// Mutex operations
-int events_mutex_create(events_mutex_t *m) { return 0; }
-void events_mutex_destroy(events_mutex_t *m) { }
-
-void events_mutex_lock(events_mutex_t *m) {
- *m = __get_PRIMASK();
- __disable_irq();
-}
-
-void events_mutex_unlock(events_mutex_t *m) {
- __set_PRIMASK(*m);
-}
-
-
-// Semaphore operations
-#ifdef MBED_CONF_RTOS_PRESENT
-
-static inline Semaphore *sema(events_sema_t *s) {
- return static_cast<Semaphore*>(*s);
-}
-
-int events_sema_create(events_sema_t *s) {
- *s = new Semaphore(0);
- return sema(s) ? 0 : -1;
-}
-
-void events_sema_destroy(events_sema_t *s) {
- delete sema(s);
-}
-
-void events_sema_release(events_sema_t *s) {
- sema(s)->release();
-}
-
-bool events_sema_wait(events_sema_t *s, int ms) {
- int t = sema(s)->wait(ms < 0 ? osWaitForever : ms);
- return t > 0;
-}
-
-#else
-
-// Semaphore operations
-int events_sema_create(events_sema_t *s) { return 0; }
-void events_sema_destroy(events_sema_t *s) {}
-void events_sema_release(events_sema_t *s) {}
-
-static void events_sema_wakeup() {}
-
-bool events_sema_wait(events_sema_t *s, int ms) {
- Timeout timeout;
- timeout.attach_us(events_sema_wakeup, ms*1000);
-
- __WFI();
-
- return true;
-}
-
-#endif
-
-#endif
-
--- a/mbed-events/events-c/events_mutex.h Fri Nov 11 09:02:51 2016 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,37 +0,0 @@
-/*
- * System specific mutex implementation
- */
-#ifndef EVENTS_MUTEX_H
-#define EVENTS_MUTEX_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
-// Mutex type
-//
-// If this type is safe in interrupt contexts, then
-// the associated event queue will also be safe in
-// interrupt contexts.
-#if defined(__unix__)
-#include <pthread.h>
-typedef pthread_mutex_t events_mutex_t;
-#elif defined(__MBED__)
-typedef unsigned events_mutex_t;
-#endif
-
-
-// Mutex operations
-int events_mutex_create(events_mutex_t *mutex);
-void events_mutex_destroy(events_mutex_t *mutex);
-void events_mutex_lock(events_mutex_t *mutex);
-void events_mutex_unlock(events_mutex_t *mutex);
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
-
--- a/mbed-events/events-c/events_posix.c Fri Nov 11 09:02:51 2016 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,92 +0,0 @@
-#if defined(__unix__)
-
-#include "events_tick.h"
-#include "events_sema.h"
-#include "events_mutex.h"
-
-#include <time.h>
-
-
-// Tick operations
-#ifdef _POSIX_TIMERS
-
-unsigned events_tick(void) {
- struct timespec ts;
- clock_gettime(CLOCK_MONOTONIC, &ts);
- return (unsigned)(ts.tv_sec*1000 + ts.tv_nsec/1000000);
-}
-
-#else
-#include <sys/time.h>
-
-unsigned events_tick(void) {
- struct timeval tv;
- gettimeofday(&tv, 0);
- return (unsigned)(tv.tv_sec*1000 + tv.tv_usec/1000);
-}
-
-#endif
-
-
-// Mutex operations
-int events_mutex_create(events_mutex_t *m) {
- return pthread_mutex_init(m, 0);
-}
-
-void events_mutex_destroy(events_mutex_t *m) {
- pthread_mutex_destroy(m);
-}
-
-void events_mutex_lock(events_mutex_t *m) {
- pthread_mutex_lock(m);
-}
-
-void events_mutex_unlock(events_mutex_t *m) {
- pthread_mutex_unlock(m);
-}
-
-
-int events_sema_create(events_sema_t *s) {
- int err = pthread_mutex_init(&s->mutex, 0);
- if (err) {
- return err;
- }
-
- err = pthread_cond_init(&s->cond, 0);
- if (err) {
- return err;
- }
-
- return 0;
-}
-
-void events_sema_destroy(events_sema_t *s) {
- pthread_mutex_destroy(&s->mutex);
- pthread_cond_destroy(&s->cond);
-}
-
-void events_sema_release(events_sema_t *s) {
- pthread_cond_signal(&s->cond);
-}
-
-bool events_sema_wait(events_sema_t *s, int ms) {
- int err;
- pthread_mutex_lock(&s->mutex);
-
- if (ms < 0) {
- err = pthread_cond_wait(&s->cond, &s->mutex);
- } else {
- ms += events_tick();
- struct timespec ts = {
- .tv_sec = ms/1000,
- .tv_nsec = ms*1000000,
- };
- err = pthread_cond_timedwait(&s->cond, &s->mutex, &ts);
- }
-
- pthread_mutex_unlock(&s->mutex);
- return !err;
-}
-
-#endif
-
--- a/mbed-events/events-c/events_sema.h Fri Nov 11 09:02:51 2016 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,45 +0,0 @@
-/*
- * System specific semaphore implementation
- */
-#ifndef EVENTS_SEMA_H
-#define EVENTS_SEMA_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <stdbool.h>
-
-
-// Semaphore type
-//
-// Optimal implementation is a binary semaphore,
-// however a regular semaphore is sufficient.
-#if defined(__unix__)
-#include <pthread.h>
-typedef struct {
- pthread_mutex_t mutex;
- pthread_cond_t cond;
-} events_sema_t;
-#elif defined(__MBED__)
-#ifdef MBED_CONF_RTOS_PRESENT
-typedef void *events_sema_t;
-#else
-typedef struct {} events_sema_t;
-#endif
-#endif
-
-
-// Semaphore operations
-int events_sema_create(events_sema_t *sema);
-void events_sema_destroy(events_sema_t *sema);
-void events_sema_release(events_sema_t *sema);
-bool events_sema_wait(events_sema_t *sema, int ms);
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
-
--- a/mbed-events/events-c/events_tick.h Fri Nov 11 09:02:51 2016 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
-/*
- * System specific tick implementation
- */
-#ifndef EVENTS_TICK_H
-#define EVENTS_TICK_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
-// Monotonic tick
-//
-// Returns a tick that is incremented every millisecond,
-// must intentionally overflow to 0 after 2^32-1
-unsigned events_tick(void);
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
-
--- a/mbed-events/events.h Fri Nov 11 09:02:51 2016 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,25 +0,0 @@ -/* events - * Copyright (c) 2006-2013 ARM Limited - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -#ifndef EVENTS_CPP_H -#define EVENTS_CPP_H - -#include "EventQueue.h" -#include "EventLoop.h" - -using namespace events; - -#endif -
--- a/mbed-os.lib Fri Nov 11 09:02:51 2016 +0000 +++ b/mbed-os.lib Fri May 12 01:53:35 2017 +0000 @@ -1,1 +1,1 @@ -https://github.com/ARMmbed/mbed-os/#a6f3fd1a60d5df59246d7caf3f108c4d34e1808e +https://github.com/ARMmbed/mbed-os/#42be5c01a7f91292d5e27124ad9584236025f6ab
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed_app.json Fri May 12 01:53:35 2017 +0000
@@ -0,0 +1,17 @@
+{
+ "config": {
+ "lf_clock_rc_calib_timer_interval": {
+ "value": 16,
+ "macro_name": "MBED_CONF_NORDIC_NRF_LF_CLOCK_CALIB_TIMER_INTERVAL"
+ },
+ "lf_clock_rc_calib_mode_config": {
+ "value": 0,
+ "macro_name": "MBED_CONF_NORDIC_NRF_LF_CLOCK_CALIB_MODE_CONFIG"
+ },
+ "uart_hwfc": {
+ "help": "Value: 1 for enable, 0 for disable",
+ "value": 0,
+ "macro_name": "MBED_CONF_NORDIC_UART_HWFC"
+ }
+ }
+}
\ No newline at end of file
