Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: BMP280 ELEC350-Practicals-FZ429 TextLCD BME280 ntp-client
Revision 2:38d31b2e0956, committed 2018-11-25
- Comitter:
- O_Thom
- Date:
- Sun Nov 25 17:49:47 2018 +0000
- Parent:
- 1:f89c930c6491
- Child:
- 3:82612f4ae4c5
- Commit message:
- Inclusion of the mail queue code - Single queue added. Multiple to be added later to route to the LCD, Networking, Serial Port, etc. threads.
Changed in this revision
| Sampler.hpp | Show annotated file Show diff for this revision Revisions of this file |
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/Sampler.hpp Sun Nov 25 16:19:10 2018 +0000
+++ b/Sampler.hpp Sun Nov 25 17:49:47 2018 +0000
@@ -1,42 +1,77 @@
#include "mbed.h"
#define Activate_Flag 1
+// Class for Sampled Data
+class message_t
+{
+public:
+ float temp;
+ float pressure;
+ int sw1State;
+ int sw2State;
+ message_t(float f1, float f2, int s1, int s2)
+ {
+ temp = f1;
+ pressure = f2;
+ sw1State = s1;
+ sw2State = s2;
+ }
+};
+
+class MailQueue
+// Potentially place all of the mail queue code into a class. Include pushing and popping functions
+// Circular buffer management also - Rewrite the oldest sample -> Include in the mail queue or in each respective thread??
+{
+ private:
+
+ public:
+
+};
+
class Sampler
{
-friend class Ticker; // Share the private and protected sections to the non-member function
-
private:
- Ticker t; // Time Initialisation
- Thread t1; // Sample Thread
-public:
-
- void start()
+ Thread t1; // Sample Thread
+ MemoryPool<message_t, 20> mpool; //Memory Pool has 20 data blocks
+ Queue<message_t, 20> queue; //Message queue
+public:
+ void mailqueuePush(float tsample, float psample, int switch1State, int switch2State)
{
- t.attach(Callback<void()>(this, &Sampler::doISR), 15);
- post(); // Hardware Testing
+ message_t *message = mpool.alloc(); // Allocate a block from the memory pool
+ if (message == NULL) // Catch the error if the pool is full
+ {
+ printf("Memory Full"); // Complete the handling of this
+ return;
+ }
+ message->temp = tsample; // Load data into the message object
+ message->pressure = psample;
+ message->sw1State = switch1State;
+ message->sw2State = switch2State;
+ osStatus stat = queue.put(message); // Write the pointer of the message to the queue
+ if (stat == osErrorResource) // Catch the error if the 'put' failed
+ {
+ printf("queue->put() Error code: %4Xh\r\n", stat);
+ mpool.free(message);
+ return;
+ }
}
- void doISR()
+ void activate()
{
t1.signal_set(Activate_Flag); // Signal the sampling thread to move from WAITING to READY
}
-
- void mailqueuePush()
+
+ void samplingThread()
{
-
- }
-
- static void samplingThread()
- {
- int idx = 0;
while(1)
{
Thread::signal_wait(Activate_Flag);
- idx++;
printf("\033[2J"); // Clear screen
printf("\033[H"); // Home Position
- printf("**********Sample %d**********\n", idx);
- printf("SW1: %d\tSW2: %d\n\r", SW1.read(), SW2.read());
+ printf("**********Sample**********\n");
+ int sw1State = SW1.read();
+ int sw2state = SW2.read();
+ printf("SW1: %d\tSW2: %d\n\r", sw1State, sw2state);
printf("LDR: %3.5f\n\r", adcIn.read()*4095);
float temp = sensor.getTemperature();
float pressure = sensor.getPressure();
@@ -47,25 +82,25 @@
printf("Pressure: %5.1f\n", pressure);
#ifdef BME
printf("Pressure: %5.1f\n", humidity);
- #endif
- puts("**********POST END**********");
- }
+ #endif
+ mailqueuePush(temp, pressure, sw1State, sw2state); // Place onto the mailqueue
+ }
}
Sampler()
- { //Constructor
+ { //Constructor
// IDs
osThreadId idMain;
osThreadId idSample;
- idMain = osThreadGetId(); // CMSIS RTOS Call
- idSample = t1.gettid(); // Assign the id to the thread handle (Check this)
- t1.start(samplingThread); // Start the sampling thread
+ idMain = osThreadGetId(); // CMSIS RTOS Call
+ idSample = t1.gettid(); // Assign the id to the thread handle (Check this)
+ t1.start(this, &Sampler::samplingThread); // Start the sampling thread
// NVIC_SetPriority(TIMER0_IRQn,osPriorityHigh); // Uncomment for priority setting in the NVIC
}
//Destructor - should the instance go out of scope, this is called
~Sampler()
{
- t.detach();
+
}
};
\ No newline at end of file
--- a/main.cpp Sun Nov 25 16:19:10 2018 +0000
+++ b/main.cpp Sun Nov 25 17:49:47 2018 +0000
@@ -6,9 +6,17 @@
EventQueue mainQueue;
Sampler s; // Initialise the s object
+Ticker t; // Time Initialisation
+
+void doISR()
+{
+ s.activate(); // Signal the sampling thread to move from WAITING to READY
+}
+
int main()
{
- s.start();
+ t.attach(&doISR, 15);
Thread::wait(osWaitForever);
}
+
\ No newline at end of file