Skip to content

Commit a796bc1

Browse files
mark9064NeroBurner
authored andcommitted
Fixes for PR 2041 (Continuous time updates)
1 parent a16ff8c commit a796bc1

9 files changed

Lines changed: 77 additions & 23 deletions

File tree

CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ add_library(sim-base STATIC
6565
sim/timers.cpp
6666
sim/queue.h
6767
sim/queue.cpp
68+
sim/semphr.h
69+
sim/semphr.cpp
6870
# src/FreeRTOS
6971
sim/portmacro_cmsis.h
7072
sim/portmacro_cmsis.cpp

sim/components/ble/SimpleWeatherService.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ int WeatherCallback(uint16_t /*connHandle*/, uint16_t /*attrHandle*/, struct ble
6262
return static_cast<Pinetime::Controllers::SimpleWeatherService*>(arg)->OnCommand(ctxt);
6363
}
6464

65-
SimpleWeatherService::SimpleWeatherService(const DateTime& dateTimeController) : dateTimeController(dateTimeController) {
65+
SimpleWeatherService::SimpleWeatherService(DateTime& dateTimeController) : dateTimeController(dateTimeController) {
6666
}
6767

6868
void SimpleWeatherService::Init() {

sim/components/ble/SimpleWeatherService.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ namespace Controllers {
2424

2525
class SimpleWeatherService {
2626
public:
27-
explicit SimpleWeatherService(const DateTime& dateTimeController);
27+
explicit SimpleWeatherService(DateTime& dateTimeController);
2828

2929
void Init();
3030

@@ -127,7 +127,7 @@ class SimpleWeatherService {
127127

128128
uint16_t eventHandle {};
129129

130-
const Pinetime::Controllers::DateTime& dateTimeController;
130+
Pinetime::Controllers::DateTime& dateTimeController;
131131

132132
std::optional<CurrentWeather> currentWeather;
133133
std::optional<Forecast> forecast;

sim/nrf_assert.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
#define ASSERT(expr) assert(expr)

sim/portmacro_cmsis.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ extern "C" {
3737

3838
typedef uint32_t TickType_t;
3939
#define portMAX_DELAY ( TickType_t ) 0xffffffffUL
40+
#define portNRF_RTC_MAXTICKS ((1U<<24)-1U)
4041

4142
typedef long BaseType_t;
4243
typedef unsigned long UBaseType_t;

sim/queue.cpp

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,43 +5,45 @@
55

66
QueueHandle_t xQueueCreate(const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize)
77
{
8-
QueueHandle_t xQueue;
8+
Queue_t *xQueue = new Queue_t;
99
if (uxItemSize != 1) {
1010
throw std::runtime_error("uxItemSize must be 1");
1111
}
12-
xQueue.queue.reserve(uxQueueLength);
12+
xQueue->queue.reserve(uxQueueLength);
1313
return xQueue;
1414
}
1515

16-
BaseType_t xQueueSend(QueueHandle_t &xQueue, const void * const pvItemToQueue, TickType_t xTicksToWait)
16+
BaseType_t xQueueSend(QueueHandle_t xQueue, const void * const pvItemToQueue, TickType_t xTicksToWait)
1717
{
18-
std::lock_guard<std::mutex> guard(xQueue.mutex);
19-
xQueue.queue.push_back(*reinterpret_cast<const uint8_t *const>(pvItemToQueue));
18+
Queue_t* pxQueue = ( Queue_t * ) xQueue;
19+
std::lock_guard<std::mutex> guard(pxQueue->mutex);
20+
pxQueue->queue.push_back(*reinterpret_cast<const uint8_t *const>(pvItemToQueue));
2021
return true;
2122
}
2223

23-
BaseType_t xQueueSendFromISR(QueueHandle_t &xQueue, const void * const pvItemToQueue, BaseType_t *xHigherPriorityTaskWoken)
24+
BaseType_t xQueueSendFromISR(QueueHandle_t xQueue, const void * const pvItemToQueue, BaseType_t *xHigherPriorityTaskWoken)
2425
{
2526
TickType_t xTicksToWait = 0;
2627
*xHigherPriorityTaskWoken = pdFALSE;
2728
return xQueueSend(xQueue, pvItemToQueue, 0.0);
2829
}
2930

30-
BaseType_t xQueueReceive(QueueHandle_t &xQueue, void * const pvBuffer, TickType_t xTicksToWait)
31+
BaseType_t xQueueReceive(QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait)
3132
{
32-
while (xQueue.queue.empty()) {
33+
Queue_t* pxQueue = ( Queue_t * ) xQueue;
34+
while (pxQueue->queue.empty()) {
3335
if (xTicksToWait <= 25) {
3436
return false;
3537
}
3638
SDL_Delay(25);
3739
xTicksToWait -= 25;
3840
}
39-
if (xQueue.queue.empty()) {
41+
if (pxQueue->queue.empty()) {
4042
return false;
4143
}
42-
std::lock_guard<std::mutex> guard(xQueue.mutex);
44+
std::lock_guard<std::mutex> guard(pxQueue->mutex);
4345
uint8_t *buf = reinterpret_cast<uint8_t * const>(pvBuffer);
44-
*buf = xQueue.queue.at(0);
45-
xQueue.queue.erase(xQueue.queue.begin());
46+
*buf = pxQueue->queue.at(0);
47+
pxQueue->queue.erase(pxQueue->queue.begin());
4648
return true;
4749
}

sim/queue.h

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,22 @@
88
* returns an QueueHandle_t variable that can then be used as a parameter to
99
* xQueueSend(), xQueueReceive(), etc.
1010
*/
11-
//typedef void * QueueHandle_t;
12-
struct QueueHandle_t {
11+
typedef void * QueueHandle_t;
12+
struct Queue_t {
1313
std::mutex mutex;
1414
std::vector<uint8_t> queue;
15-
QueueHandle_t() {}
16-
QueueHandle_t(const QueueHandle_t &o) {
15+
Queue_t() {}
16+
Queue_t(const Queue_t &o) {
1717
queue=o.queue;
1818
}
19-
QueueHandle_t &operator=(const QueueHandle_t &o) {
19+
Queue_t &operator=(const Queue_t &o) {
2020
queue=o.queue;
2121
return *this;
2222
}
2323
};
2424
//using QueueHandle_t = std::vector<uint8_t>;
2525

2626
QueueHandle_t xQueueCreate(const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize);
27-
BaseType_t xQueueSend(QueueHandle_t &xQueue, const void * const pvItemToQueue, TickType_t xTicksToWait);
28-
BaseType_t xQueueSendFromISR(QueueHandle_t &xQueue, const void * const pvItemToQueue, BaseType_t *xHigherPriorityTaskWoken);
29-
BaseType_t xQueueReceive(QueueHandle_t &xQueue, void * const pvBuffer, TickType_t xTicksToWait );
27+
BaseType_t xQueueSend(QueueHandle_t xQueue, const void * const pvItemToQueue, TickType_t xTicksToWait);
28+
BaseType_t xQueueSendFromISR(QueueHandle_t xQueue, const void * const pvItemToQueue, BaseType_t *xHigherPriorityTaskWoken);
29+
BaseType_t xQueueReceive(QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait );

sim/semphr.cpp

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
#include "semphr.h"
2+
#include <SDL2/SDL.h>
3+
#include <stdexcept>
4+
5+
QueueHandle_t xSemaphoreCreateMutex() {
6+
SemaphoreHandle_t xSemaphore = xQueueCreate(1, 1);
7+
Queue_t *pxQueue = (Queue_t *)xSemaphore;
8+
pxQueue->queue.push_back(0);
9+
return xSemaphore;
10+
};
11+
12+
BaseType_t xSemaphoreTake(SemaphoreHandle_t xSemaphore,
13+
TickType_t xTicksToWait) {
14+
Queue_t *pxQueue = (Queue_t *)xSemaphore;
15+
while (!pxQueue->queue.empty()) {
16+
if (xTicksToWait <= 25) {
17+
return false;
18+
}
19+
SDL_Delay(25);
20+
xTicksToWait -= 25;
21+
}
22+
std::lock_guard<std::mutex> guard(pxQueue->mutex);
23+
if (!pxQueue->queue.empty()) {
24+
return false;
25+
}
26+
pxQueue->queue.push_back(0);
27+
return true;
28+
}
29+
BaseType_t xSemaphoreGive(SemaphoreHandle_t xSemaphore) {
30+
Queue_t *pxQueue = (Queue_t *)xSemaphore;
31+
std::lock_guard<std::mutex> guard(pxQueue->mutex);
32+
if (pxQueue->queue.size() != 1) {
33+
throw std::runtime_error("Mutex released without being held");
34+
}
35+
pxQueue->queue.pop_back();
36+
return true;
37+
}

sim/semphr.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#pragma once
2+
3+
#include "FreeRTOS.h"
4+
#include "queue.h"
5+
6+
typedef QueueHandle_t SemaphoreHandle_t;
7+
8+
QueueHandle_t xSemaphoreCreateMutex();
9+
10+
BaseType_t xSemaphoreTake( SemaphoreHandle_t xSemaphore, TickType_t xTicksToWait);
11+
BaseType_t xSemaphoreGive( SemaphoreHandle_t xSemaphore);

0 commit comments

Comments
 (0)