![](/media/cache/group/logo.jpg.50x50_q85.jpg)
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
diff -r 838a0b25934b -r 1423b707b705 CLI_Source/ble_cli.cpp --- 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)
diff -r 838a0b25934b -r 1423b707b705 main.cpp --- 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;
diff -r 838a0b25934b -r 1423b707b705 mbed-events/EventLoop.cpp --- 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 -
diff -r 838a0b25934b -r 1423b707b705 mbed-events/EventLoop.h --- 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 -
diff -r 838a0b25934b -r 1423b707b705 mbed-events/EventQueue.cpp --- 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); -} - -
diff -r 838a0b25934b -r 1423b707b705 mbed-events/EventQueue.h --- 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 -
diff -r 838a0b25934b -r 1423b707b705 mbed-events/events-c/events.c --- 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); -} -
diff -r 838a0b25934b -r 1423b707b705 mbed-events/events-c/events.h --- 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 -
diff -r 838a0b25934b -r 1423b707b705 mbed-events/events-c/events_mbed.cpp --- 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 -
diff -r 838a0b25934b -r 1423b707b705 mbed-events/events-c/events_mutex.h --- 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 -
diff -r 838a0b25934b -r 1423b707b705 mbed-events/events-c/events_posix.c --- 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 -
diff -r 838a0b25934b -r 1423b707b705 mbed-events/events-c/events_sema.h --- 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 -
diff -r 838a0b25934b -r 1423b707b705 mbed-events/events-c/events_tick.h --- 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 -
diff -r 838a0b25934b -r 1423b707b705 mbed-events/events.h --- 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 -
diff -r 838a0b25934b -r 1423b707b705 mbed-os.lib --- 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
diff -r 838a0b25934b -r 1423b707b705 mbed_app.json --- /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