update code

Dependencies:   X_NUCLEO_IKS01A1 mbed-rtos mbed

Committer:
acarter2
Date:
Mon May 02 15:26:28 2016 +0000
Revision:
0:4a8b751dbe7c
Child:
1:4cd93767691a
buffer

Who changed what in which revision?

UserRevisionLine numberNew contents of line
acarter2 0:4a8b751dbe7c 1 #include <stdlib.h>
acarter2 0:4a8b751dbe7c 2 #include <pthread.h>
acarter2 0:4a8b751dbe7c 3 #include <semaphore.h>
acarter2 0:4a8b751dbe7c 4 #include "buffer.h"
acarter2 0:4a8b751dbe7c 5
acarter2 0:4a8b751dbe7c 6 #include "mbed.h"
acarter2 0:4a8b751dbe7c 7
acarter2 0:4a8b751dbe7c 8 //#include "string.h"
acarter2 0:4a8b751dbe7c 9 #include <stdio.h>
acarter2 0:4a8b751dbe7c 10 #include <ctype.h>
acarter2 0:4a8b751dbe7c 11 #include "x_nucleo_iks01a1.h"
acarter2 0:4a8b751dbe7c 12 #include "rtos.h"
acarter2 0:4a8b751dbe7c 13
acarter2 0:4a8b751dbe7c 14 #define RAND_DIVISOR 100000000
acarter2 0:4a8b751dbe7c 15 #define TRUE 1
acarter2 0:4a8b751dbe7c 16
acarter2 0:4a8b751dbe7c 17 //setting out variables
acarter2 0:4a8b751dbe7c 18
acarter2 0:4a8b751dbe7c 19 /**
acarter2 0:4a8b751dbe7c 20 / this is setting up the connection from the board
acarter2 0:4a8b751dbe7c 21 **/
acarter2 0:4a8b751dbe7c 22
acarter2 0:4a8b751dbe7c 23 static X_NUCLEO_IKS01A1 *mems_expansion_board = X_NUCLEO_IKS01A1::Instance(D14, D15);
acarter2 0:4a8b751dbe7c 24 static HumiditySensor *humidity_sensor = mems_expansion_board->ht_sensor;
acarter2 0:4a8b751dbe7c 25 static PressureSensor *pressure_sensor = mems_expansion_board->pt_sensor;
acarter2 0:4a8b751dbe7c 26 static TempSensor *temp_sensor1 = mems_expansion_board->ht_sensor;
acarter2 0:4a8b751dbe7c 27 static TempSensor *temp_sensor2 = mems_expansion_board->pt_sensor;
acarter2 0:4a8b751dbe7c 28
acarter2 0:4a8b751dbe7c 29 typedf int buffer_item;
acarter2 0:4a8b751dbe7c 30 #define BUFFER_SIZE 75
acarter2 0:4a8b751dbe7c 31
acarter2 0:4a8b751dbe7c 32 // mutex lock
acarter2 0:4a8b751dbe7c 33 pthread_mutex_t mutex;
acarter2 0:4a8b751dbe7c 34
acarter2 0:4a8b751dbe7c 35 //semaphores
acarter2 0:4a8b751dbe7c 36 sem_t full, empty;
acarter2 0:4a8b751dbe7c 37
acarter2 0:4a8b751dbe7c 38 //buffer
acarter2 0:4a8b751dbe7c 39 buffer_item buffer[BUFFER_SIZE];
acarter2 0:4a8b751dbe7c 40
acarter2 0:4a8b751dbe7c 41 //buffer counter
acarter2 0:4a8b751dbe7c 42 int counter;
acarter2 0:4a8b751dbe7c 43
acarter2 0:4a8b751dbe7c 44 pthread_t tid; //thread id
acarter2 0:4a8b751dbe7c 45 pthread_attr_t attr; //set of thread attributes
acarter2 0:4a8b751dbe7c 46
acarter2 0:4a8b751dbe7c 47 void *producer(void *param); //producer thread
acarter2 0:4a8b751dbe7c 48 void *consumer(void *param); //consumer thread
acarter2 0:4a8b751dbe7c 49
acarter2 0:4a8b751dbe7c 50 volatile char memorySample[150][200];
acarter2 0:4a8b751dbe7c 51
acarter2 0:4a8b751dbe7c 52 char values[20][20];
acarter2 0:4a8b751dbe7c 53
acarter2 0:4a8b751dbe7c 54 /*
acarter2 0:4a8b751dbe7c 55 / this is will make sure the contant valid of how much data will be sorted or not as this
acarter2 0:4a8b751dbe7c 56 /could help when the data range.
acarter2 0:4a8b751dbe7c 57 */
acarter2 0:4a8b751dbe7c 58 int amountOfSample = 150;
acarter2 0:4a8b751dbe7c 59
acarter2 0:4a8b751dbe7c 60
acarter2 0:4a8b751dbe7c 61 uint8_t id;
acarter2 0:4a8b751dbe7c 62
acarter2 0:4a8b751dbe7c 63
acarter2 0:4a8b751dbe7c 64 //class
acarter2 0:4a8b751dbe7c 65
acarter2 0:4a8b751dbe7c 66 class KeyLocks {
acarter2 0:4a8b751dbe7c 67
acarter2 0:4a8b751dbe7c 68 public:
acarter2 0:4a8b751dbe7c 69 int key;
acarter2 0:4a8b751dbe7c 70
acarter2 0:4a8b751dbe7c 71 KeyLocks(){
acarter2 0:4a8b751dbe7c 72
acarter2 0:4a8b751dbe7c 73 key = 0;
acarter2 0:4a8b751dbe7c 74
acarter2 0:4a8b751dbe7c 75 }
acarter2 0:4a8b751dbe7c 76
acarter2 0:4a8b751dbe7c 77 bool unlock(void)
acarter2 0:4a8b751dbe7c 78 {
acarter2 0:4a8b751dbe7c 79 if(key == 0){
acarter2 0:4a8b751dbe7c 80
acarter2 0:4a8b751dbe7c 81 key = 1;
acarter2 0:4a8b751dbe7c 82 return true;
acarter2 0:4a8b751dbe7c 83
acarter2 0:4a8b751dbe7c 84 }else{
acarter2 0:4a8b751dbe7c 85 return false;
acarter2 0:4a8b751dbe7c 86
acarter2 0:4a8b751dbe7c 87 }
acarter2 0:4a8b751dbe7c 88 }
acarter2 0:4a8b751dbe7c 89
acarter2 0:4a8b751dbe7c 90 bool lock(void)
acarter2 0:4a8b751dbe7c 91 {
acarter2 0:4a8b751dbe7c 92 if(key == 1){
acarter2 0:4a8b751dbe7c 93
acarter2 0:4a8b751dbe7c 94 key = 0;
acarter2 0:4a8b751dbe7c 95 return true;
acarter2 0:4a8b751dbe7c 96
acarter2 0:4a8b751dbe7c 97 }else{
acarter2 0:4a8b751dbe7c 98 return false;
acarter2 0:4a8b751dbe7c 99
acarter2 0:4a8b751dbe7c 100 }
acarter2 0:4a8b751dbe7c 101 }
acarter2 0:4a8b751dbe7c 102
acarter2 0:4a8b751dbe7c 103 };
acarter2 0:4a8b751dbe7c 104
acarter2 0:4a8b751dbe7c 105 class SampleRate : public KeyLocks
acarter2 0:4a8b751dbe7c 106 {
acarter2 0:4a8b751dbe7c 107 public:
acarter2 0:4a8b751dbe7c 108 /*
acarter2 0:4a8b751dbe7c 109 /this is going the amount of time which the data sample will be taking and this will have
acarter2 0:4a8b751dbe7c 110 /a default stating of every 15 second but can be changed
acarter2 0:4a8b751dbe7c 111 */
acarter2 0:4a8b751dbe7c 112 int sampleRate;
acarter2 0:4a8b751dbe7c 113
acarter2 0:4a8b751dbe7c 114 SampleRate(){
acarter2 0:4a8b751dbe7c 115
acarter2 0:4a8b751dbe7c 116 sampleRate = 15;
acarter2 0:4a8b751dbe7c 117
acarter2 0:4a8b751dbe7c 118 }
acarter2 0:4a8b751dbe7c 119
acarter2 0:4a8b751dbe7c 120 int getSampleRate(void)
acarter2 0:4a8b751dbe7c 121 {
acarter2 0:4a8b751dbe7c 122 return sampleRate;
acarter2 0:4a8b751dbe7c 123 }
acarter2 0:4a8b751dbe7c 124 void setSampleRate(double newSampleRate){
acarter2 0:4a8b751dbe7c 125
acarter2 0:4a8b751dbe7c 126 sampleRate = newSampleRate;
acarter2 0:4a8b751dbe7c 127
acarter2 0:4a8b751dbe7c 128 }
acarter2 0:4a8b751dbe7c 129
acarter2 0:4a8b751dbe7c 130
acarter2 0:4a8b751dbe7c 131
acarter2 0:4a8b751dbe7c 132 };
acarter2 0:4a8b751dbe7c 133
acarter2 0:4a8b751dbe7c 134
acarter2 0:4a8b751dbe7c 135 class TakeSample : public KeyLocks
acarter2 0:4a8b751dbe7c 136 {
acarter2 0:4a8b751dbe7c 137 public:
acarter2 0:4a8b751dbe7c 138 /*
acarter2 0:4a8b751dbe7c 139 /this is going to take the sample or not as this can change if the person thing it could happen
acarter2 0:4a8b751dbe7c 140 /which will see if the data is stored
acarter2 0:4a8b751dbe7c 141 */
acarter2 0:4a8b751dbe7c 142 bool takeSample;
acarter2 0:4a8b751dbe7c 143
acarter2 0:4a8b751dbe7c 144 TakeSample(){
acarter2 0:4a8b751dbe7c 145 takeSample = true;
acarter2 0:4a8b751dbe7c 146 }
acarter2 0:4a8b751dbe7c 147
acarter2 0:4a8b751dbe7c 148 int getTakeSample(void)
acarter2 0:4a8b751dbe7c 149 {
acarter2 0:4a8b751dbe7c 150 return takeSample;
acarter2 0:4a8b751dbe7c 151 }
acarter2 0:4a8b751dbe7c 152 void setTakeSample(bool newTakeSample){
acarter2 0:4a8b751dbe7c 153
acarter2 0:4a8b751dbe7c 154 takeSample = newTakeSample;
acarter2 0:4a8b751dbe7c 155
acarter2 0:4a8b751dbe7c 156 }
acarter2 0:4a8b751dbe7c 157 };
acarter2 0:4a8b751dbe7c 158
acarter2 0:4a8b751dbe7c 159
acarter2 0:4a8b751dbe7c 160
acarter2 0:4a8b751dbe7c 161 class SampleTemp: public KeyLocks
acarter2 0:4a8b751dbe7c 162 {
acarter2 0:4a8b751dbe7c 163 public:
acarter2 0:4a8b751dbe7c 164
acarter2 0:4a8b751dbe7c 165 SampleTemp(){}
acarter2 0:4a8b751dbe7c 166 float currentTemp;
acarter2 0:4a8b751dbe7c 167 /*
acarter2 0:4a8b751dbe7c 168 /this is the fuction which will get the humidity for the external devices
acarter2 0:4a8b751dbe7c 169 */
acarter2 0:4a8b751dbe7c 170 float getTemp(void)
acarter2 0:4a8b751dbe7c 171 {
acarter2 0:4a8b751dbe7c 172 temp_sensor1->GetTemperature(&currentTemp);
acarter2 0:4a8b751dbe7c 173 return currentTemp;
acarter2 0:4a8b751dbe7c 174 }
acarter2 0:4a8b751dbe7c 175 };
acarter2 0:4a8b751dbe7c 176
acarter2 0:4a8b751dbe7c 177 class SampleHumitaty: public KeyLocks
acarter2 0:4a8b751dbe7c 178 {
acarter2 0:4a8b751dbe7c 179 public:
acarter2 0:4a8b751dbe7c 180
acarter2 0:4a8b751dbe7c 181 SampleHumitaty(){}
acarter2 0:4a8b751dbe7c 182
acarter2 0:4a8b751dbe7c 183 float currentHumitaty;
acarter2 0:4a8b751dbe7c 184 /*
acarter2 0:4a8b751dbe7c 185 /this is the fuction which will get the humidity for the external devices
acarter2 0:4a8b751dbe7c 186 */
acarter2 0:4a8b751dbe7c 187 float getHumidity()
acarter2 0:4a8b751dbe7c 188 {
acarter2 0:4a8b751dbe7c 189 humidity_sensor->GetHumidity(&currentHumitaty);
acarter2 0:4a8b751dbe7c 190 return currentHumitaty;
acarter2 0:4a8b751dbe7c 191
acarter2 0:4a8b751dbe7c 192 }
acarter2 0:4a8b751dbe7c 193 };
acarter2 0:4a8b751dbe7c 194
acarter2 0:4a8b751dbe7c 195
acarter2 0:4a8b751dbe7c 196 class SamplePressure: public KeyLocks
acarter2 0:4a8b751dbe7c 197
acarter2 0:4a8b751dbe7c 198 {
acarter2 0:4a8b751dbe7c 199 public:
acarter2 0:4a8b751dbe7c 200
acarter2 0:4a8b751dbe7c 201 SamplePressure(){}
acarter2 0:4a8b751dbe7c 202
acarter2 0:4a8b751dbe7c 203 float currentPressure;
acarter2 0:4a8b751dbe7c 204 /*
acarter2 0:4a8b751dbe7c 205 /this is the fuction which will get the pressure for the external devices
acarter2 0:4a8b751dbe7c 206 */
acarter2 0:4a8b751dbe7c 207 float getPressure()
acarter2 0:4a8b751dbe7c 208 {
acarter2 0:4a8b751dbe7c 209 pressure_sensor->GetPressure(&currentPressure);
acarter2 0:4a8b751dbe7c 210 return currentPressure;
acarter2 0:4a8b751dbe7c 211 }
acarter2 0:4a8b751dbe7c 212 };
acarter2 0:4a8b751dbe7c 213
acarter2 0:4a8b751dbe7c 214 class SampleDisplay: public KeyLocks
acarter2 0:4a8b751dbe7c 215 {
acarter2 0:4a8b751dbe7c 216 public:
acarter2 0:4a8b751dbe7c 217 /*
acarter2 0:4a8b751dbe7c 218 /this is the variable to see if the data will be display or not after the data being sorted
acarter2 0:4a8b751dbe7c 219 /this can change by the user input
acarter2 0:4a8b751dbe7c 220 */
acarter2 0:4a8b751dbe7c 221
acarter2 0:4a8b751dbe7c 222 bool display;
acarter2 0:4a8b751dbe7c 223
acarter2 0:4a8b751dbe7c 224 SampleDisplay(){
acarter2 0:4a8b751dbe7c 225 display = false;
acarter2 0:4a8b751dbe7c 226 }
acarter2 0:4a8b751dbe7c 227
acarter2 0:4a8b751dbe7c 228 bool getTakeDisplay(void)
acarter2 0:4a8b751dbe7c 229 {
acarter2 0:4a8b751dbe7c 230 return display;
acarter2 0:4a8b751dbe7c 231 }
acarter2 0:4a8b751dbe7c 232 void setDisplay(bool newSampleDisplay){
acarter2 0:4a8b751dbe7c 233
acarter2 0:4a8b751dbe7c 234 display = newSampleDisplay;
acarter2 0:4a8b751dbe7c 235
acarter2 0:4a8b751dbe7c 236 }
acarter2 0:4a8b751dbe7c 237 };
acarter2 0:4a8b751dbe7c 238
acarter2 0:4a8b751dbe7c 239
acarter2 0:4a8b751dbe7c 240
acarter2 0:4a8b751dbe7c 241
acarter2 0:4a8b751dbe7c 242 class BufferStartPointer: public KeyLocks
acarter2 0:4a8b751dbe7c 243 {
acarter2 0:4a8b751dbe7c 244 public:
acarter2 0:4a8b751dbe7c 245 /*
acarter2 0:4a8b751dbe7c 246 /this is the pointer to start of the buffer as this will make the buffer be cycler
acarter2 0:4a8b751dbe7c 247 */
acarter2 0:4a8b751dbe7c 248 int bufferStartPointer;
acarter2 0:4a8b751dbe7c 249
acarter2 0:4a8b751dbe7c 250 BufferStartPointer(){
acarter2 0:4a8b751dbe7c 251 bufferStartPointer = 0;
acarter2 0:4a8b751dbe7c 252 }
acarter2 0:4a8b751dbe7c 253
acarter2 0:4a8b751dbe7c 254 int getBufferStartPointer (void)
acarter2 0:4a8b751dbe7c 255 {
acarter2 0:4a8b751dbe7c 256 return bufferStartPointer;
acarter2 0:4a8b751dbe7c 257 }
acarter2 0:4a8b751dbe7c 258 void setBufferStartPointer (int newBufferStartPointer ){
acarter2 0:4a8b751dbe7c 259
acarter2 0:4a8b751dbe7c 260 bufferStartPointer = newBufferStartPointer;
acarter2 0:4a8b751dbe7c 261
acarter2 0:4a8b751dbe7c 262 }
acarter2 0:4a8b751dbe7c 263 };
acarter2 0:4a8b751dbe7c 264
acarter2 0:4a8b751dbe7c 265
acarter2 0:4a8b751dbe7c 266 class BufferEndPointer: public KeyLocks
acarter2 0:4a8b751dbe7c 267 {
acarter2 0:4a8b751dbe7c 268 public:
acarter2 0:4a8b751dbe7c 269 /*
acarter2 0:4a8b751dbe7c 270 /this is the pointer to End of the buffer as this will make the buffer be cycler
acarter2 0:4a8b751dbe7c 271 */
acarter2 0:4a8b751dbe7c 272 int bufferEndPointer;
acarter2 0:4a8b751dbe7c 273
acarter2 0:4a8b751dbe7c 274 BufferEndPointer(){
acarter2 0:4a8b751dbe7c 275 bufferEndPointer = 0;
acarter2 0:4a8b751dbe7c 276 }
acarter2 0:4a8b751dbe7c 277
acarter2 0:4a8b751dbe7c 278 int getBufferEndPointer (void)
acarter2 0:4a8b751dbe7c 279 {
acarter2 0:4a8b751dbe7c 280 return bufferEndPointer;
acarter2 0:4a8b751dbe7c 281 }
acarter2 0:4a8b751dbe7c 282 void setBufferEndPointer (int newBufferEndPointer ){
acarter2 0:4a8b751dbe7c 283
acarter2 0:4a8b751dbe7c 284 bufferEndPointer = newBufferEndPointer;
acarter2 0:4a8b751dbe7c 285
acarter2 0:4a8b751dbe7c 286 }
acarter2 0:4a8b751dbe7c 287 };
acarter2 0:4a8b751dbe7c 288
acarter2 0:4a8b751dbe7c 289 void initialiseBufferData(){
acarter2 0:4a8b751dbe7c 290 //create mutex lock
acarter2 0:4a8b751dbe7c 291 pthread_mutex_init(&mutex, NULL);
acarter2 0:4a8b751dbe7c 292
acarter2 0:4a8b751dbe7c 293 //create full semaphore and initialise to 0
acarter2 0:4a8b751dbe7c 294 sem_init(&full, 0, 0);
acarter2 0:4a8b751dbe7c 295
acarter2 0:4a8b751dbe7c 296 //create empty semaphore and initialise to BUFFER_SIZE
acarter2 0:4a8b751dbe7c 297 sem_init(&empty, 0, BUFFER_SIZE);
acarter2 0:4a8b751dbe7c 298
acarter2 0:4a8b751dbe7c 299 //get default attributes
acarter2 0:4a8b751dbe7c 300 pthread_attr_init(&attr);
acarter2 0:4a8b751dbe7c 301
acarter2 0:4a8b751dbe7c 302 //init buffer
acarter2 0:4a8b751dbe7c 303 counter = 0;
acarter2 0:4a8b751dbe7c 304 }
acarter2 0:4a8b751dbe7c 305
acarter2 0:4a8b751dbe7c 306 //producer thread
acarter2 0:4a8b751dbe7c 307 void *producer(void *param){
acarter2 0:4a8b751dbe7c 308 buffer_item item;
acarter2 0:4a8b751dbe7c 309
acarter2 0:4a8b751dbe7c 310 while(TRUE){
acarter2 0:4a8b751dbe7c 311 //sleep for random amount of time
acarter2 0:4a8b751dbe7c 312 int rNum = rand() / RAND_DIVISOR;
acarter2 0:4a8b751dbe7c 313 sleep(rNum);
acarter2 0:4a8b751dbe7c 314
acarter2 0:4a8b751dbe7c 315 //generate random number
acarter2 0:4a8b751dbe7c 316 item = rand();
acarter2 0:4a8b751dbe7c 317
acarter2 0:4a8b751dbe7c 318 //get empty lock
acarter2 0:4a8b751dbe7c 319 sem_wait(&empty);
acarter2 0:4a8b751dbe7c 320 //get mutex lock
acarter2 0:4a8b751dbe7c 321 pthread_mutex_lock(&mutex);
acarter2 0:4a8b751dbe7c 322
acarter2 0:4a8b751dbe7c 323 if(insert_item(item)){
acarter2 0:4a8b751dbe7c 324 fprint(stderr, "Producer report error condition\n");
acarter2 0:4a8b751dbe7c 325 }
acarter2 0:4a8b751dbe7c 326 else{
acarter2 0:4a8b751dbe7c 327 printf("producer produced %d\n", item);
acarter2 0:4a8b751dbe7c 328 }
acarter2 0:4a8b751dbe7c 329 //release mutex lock
acarter2 0:4a8b751dbe7c 330 pthread_mutex_unlock(&mutex);
acarter2 0:4a8b751dbe7c 331 //signal full
acarter2 0:4a8b751dbe7c 332 sem_post(&full);
acarter2 0:4a8b751dbe7c 333 }
acarter2 0:4a8b751dbe7c 334 }
acarter2 0:4a8b751dbe7c 335
acarter2 0:4a8b751dbe7c 336 //consumer thread
acarter2 0:4a8b751dbe7c 337 void *consumer(void {
acarter2 0:4a8b751dbe7c 338 buffer_item item;
acarter2 0:4a8b751dbe7c 339
acarter2 0:4a8b751dbe7c 340 while(TRUE){
acarter2 0:4a8b751dbe7c 341 //sleep for random amount of time
acarter2 0:4a8b751dbe7c 342 int rNum = rand() / RAND_DIVISOR;
acarter2 0:4a8b751dbe7c 343 sleep(rNum);
acarter2 0:4a8b751dbe7c 344
acarter2 0:4a8b751dbe7c 345 //get full lock
acarter2 0:4a8b751dbe7c 346 sem_wait(&full);
acarter2 0:4a8b751dbe7c 347 //get mutex lock
acarter2 0:4a8b751dbe7c 348 pthread_mutex_lock(&mutex);
acarter2 0:4a8b751dbe7c 349 if(remove_item(&item)){
acarter2 0:4a8b751dbe7c 350 fprint(stderr, "Consumer report error condition\n");
acarter2 0:4a8b751dbe7c 351 }
acarter2 0:4a8b751dbe7c 352 else{
acarter2 0:4a8b751dbe7c 353 printf("Consumer consumer %d\n", item);
acarter2 0:4a8b751dbe7c 354 }
acarter2 0:4a8b751dbe7c 355
acarter2 0:4a8b751dbe7c 356 //release mutex ock
acarter2 0:4a8b751dbe7c 357 pthread_mutex_unlock(&mutex);
acarter2 0:4a8b751dbe7c 358 //signal empty
acarter2 0:4a8b751dbe7c 359 sem_post(&empty);
acarter2 0:4a8b751dbe7c 360 }
acarter2 0:4a8b751dbe7c 361 }
acarter2 0:4a8b751dbe7c 362
acarter2 0:4a8b751dbe7c 363 //add item to buffer
acarter2 0:4a8b751dbe7c 364 int insert_item(buffer_item item) {
acarter2 0:4a8b751dbe7c 365 //when buffer not full add item and increase counter
acarter2 0:4a8b751dbe7c 366 if(counter < BUFFER_SIZE){
acarter2 0:4a8b751dbe7c 367 buffer[counter] = item;
acarter2 0:4a8b751dbe7c 368 counter++
acarter2 0:4a8b751dbe7c 369 return 0;
acarter2 0:4a8b751dbe7c 370 }
acarter2 0:4a8b751dbe7c 371 else{ //buffer full error
acarter2 0:4a8b751dbe7c 372 return -1
acarter2 0:4a8b751dbe7c 373 }
acarter2 0:4a8b751dbe7c 374 }
acarter2 0:4a8b751dbe7c 375
acarter2 0:4a8b751dbe7c 376 //remove item from buffer
acarter2 0:4a8b751dbe7c 377 int remove_item(buffer_item *item){
acarter2 0:4a8b751dbe7c 378 //when buffer not empty remove item and decrease counter
acarter2 0:4a8b751dbe7c 379 if(counter > 0){
acarter2 0:4a8b751dbe7c 380 *item = buffer[(counter-1)];
acarter2 0:4a8b751dbe7c 381 counter--;
acarter2 0:4a8b751dbe7c 382 return 0;
acarter2 0:4a8b751dbe7c 383 }
acarter2 0:4a8b751dbe7c 384 else{ //empty buffer error
acarter2 0:4a8b751dbe7c 385 return -1;
acarter2 0:4a8b751dbe7c 386 }
acarter2 0:4a8b751dbe7c 387 }
acarter2 0:4a8b751dbe7c 388
acarter2 0:4a8b751dbe7c 389
acarter2 0:4a8b751dbe7c 390
acarter2 0:4a8b751dbe7c 391
acarter2 0:4a8b751dbe7c 392
acarter2 0:4a8b751dbe7c 393
acarter2 0:4a8b751dbe7c 394
acarter2 0:4a8b751dbe7c 395
acarter2 0:4a8b751dbe7c 396 //this is setting all the function for the treads in the program
acarter2 0:4a8b751dbe7c 397
acarter2 0:4a8b751dbe7c 398
acarter2 0:4a8b751dbe7c 399 /*
acarter2 0:4a8b751dbe7c 400 /this is fucntion which the important the updateSample rate
acarter2 0:4a8b751dbe7c 401 */
acarter2 0:4a8b751dbe7c 402 void updateSample(SamplePressure* pressure, SampleHumitaty* humitaty, SampleTemp* tempeture)
acarter2 0:4a8b751dbe7c 403 {
acarter2 0:4a8b751dbe7c 404 while(!pressure->lock()){};
acarter2 0:4a8b751dbe7c 405
acarter2 0:4a8b751dbe7c 406 float currentPressure = pressure->getPressure();
acarter2 0:4a8b751dbe7c 407 pressure->unlock();
acarter2 0:4a8b751dbe7c 408
acarter2 0:4a8b751dbe7c 409 while(!humitaty->lock()){};
acarter2 0:4a8b751dbe7c 410
acarter2 0:4a8b751dbe7c 411 float current= humitaty->getHumidity();
acarter2 0:4a8b751dbe7c 412 humitaty->unlock();
acarter2 0:4a8b751dbe7c 413
acarter2 0:4a8b751dbe7c 414
acarter2 0:4a8b751dbe7c 415 while(!tempeture->lock()){};
acarter2 0:4a8b751dbe7c 416
acarter2 0:4a8b751dbe7c 417 float currentTemp= tempeture->getTemp();
acarter2 0:4a8b751dbe7c 418 tempeture->unlock();
acarter2 0:4a8b751dbe7c 419
acarter2 0:4a8b751dbe7c 420 }
acarter2 0:4a8b751dbe7c 421
acarter2 0:4a8b751dbe7c 422
acarter2 0:4a8b751dbe7c 423 void splitString(char inputString[]){
acarter2 0:4a8b751dbe7c 424 int sizeOfArray = 1000;
acarter2 0:4a8b751dbe7c 425 char opertaion[sizeOfArray];
acarter2 0:4a8b751dbe7c 426 char data[sizeOfArray];
acarter2 0:4a8b751dbe7c 427
acarter2 0:4a8b751dbe7c 428 for (int i = 0; i < 20; i++){
acarter2 0:4a8b751dbe7c 429 for (int j = 0; i < 20; j++){
acarter2 0:4a8b751dbe7c 430 values[i][j] =' ';
acarter2 0:4a8b751dbe7c 431
acarter2 0:4a8b751dbe7c 432 }
acarter2 0:4a8b751dbe7c 433 }
acarter2 0:4a8b751dbe7c 434
acarter2 0:4a8b751dbe7c 435 for (int i = 0; i < sizeOfArray; i++){
acarter2 0:4a8b751dbe7c 436
acarter2 0:4a8b751dbe7c 437 if(inputString[i] == '<'){
acarter2 0:4a8b751dbe7c 438 for(int j=0; j < i; j++){
acarter2 0:4a8b751dbe7c 439
acarter2 0:4a8b751dbe7c 440 opertaion[j] = inputString[j];
acarter2 0:4a8b751dbe7c 441
acarter2 0:4a8b751dbe7c 442 }
acarter2 0:4a8b751dbe7c 443
acarter2 0:4a8b751dbe7c 444 int index = 0;
acarter2 0:4a8b751dbe7c 445
acarter2 0:4a8b751dbe7c 446 for(int k=i+1; k < sizeOfArray - 1; k++){
acarter2 0:4a8b751dbe7c 447
acarter2 0:4a8b751dbe7c 448 data[index] = (inputString[k]);
acarter2 0:4a8b751dbe7c 449 index++;
acarter2 0:4a8b751dbe7c 450
acarter2 0:4a8b751dbe7c 451 }
acarter2 0:4a8b751dbe7c 452
acarter2 0:4a8b751dbe7c 453
acarter2 0:4a8b751dbe7c 454
acarter2 0:4a8b751dbe7c 455 for(int y = 0; y < 20; y++){
acarter2 0:4a8b751dbe7c 456 values[0][y] = opertaion[y];
acarter2 0:4a8b751dbe7c 457 }
acarter2 0:4a8b751dbe7c 458
acarter2 0:4a8b751dbe7c 459 for(int z = 0;z < 20; z++){
acarter2 0:4a8b751dbe7c 460 values[1][z] = data[z];
acarter2 0:4a8b751dbe7c 461 }
acarter2 0:4a8b751dbe7c 462
acarter2 0:4a8b751dbe7c 463 break;
acarter2 0:4a8b751dbe7c 464
acarter2 0:4a8b751dbe7c 465 }
acarter2 0:4a8b751dbe7c 466 }
acarter2 0:4a8b751dbe7c 467 }
acarter2 0:4a8b751dbe7c 468
acarter2 0:4a8b751dbe7c 469 /*
acarter2 0:4a8b751dbe7c 470 /this is going to sort the string to see the opertion which will picked the opertion which
acarter2 0:4a8b751dbe7c 471 /need the be carried out and the put the data in to the tread to then which the tread will
acarter2 0:4a8b751dbe7c 472 /do it operation
acarter2 0:4a8b751dbe7c 473 */
acarter2 0:4a8b751dbe7c 474 void sortString(char inputString[])
acarter2 0:4a8b751dbe7c 475 {
acarter2 0:4a8b751dbe7c 476
acarter2 0:4a8b751dbe7c 477 //if("DELETE" == values[0]){
acarter2 0:4a8b751dbe7c 478
acarter2 0:4a8b751dbe7c 479 //printCurrentRecord(values[]);
acarter2 0:4a8b751dbe7c 480
acarter2 0:4a8b751dbe7c 481 //}
acarter2 0:4a8b751dbe7c 482
acarter2 0:4a8b751dbe7c 483 //https://developer.mbed.org/teams/Students-Plymouth-University-UK-SoCEM/
acarter2 0:4a8b751dbe7c 484
acarter2 0:4a8b751dbe7c 485 }
acarter2 0:4a8b751dbe7c 486
acarter2 0:4a8b751dbe7c 487
acarter2 0:4a8b751dbe7c 488
acarter2 0:4a8b751dbe7c 489
acarter2 0:4a8b751dbe7c 490 /*
acarter2 0:4a8b751dbe7c 491 /this is function that will written to the memory of the from the buffer so that will be fast
acarter2 0:4a8b751dbe7c 492 / and did not lose anydata
acarter2 0:4a8b751dbe7c 493 */
acarter2 0:4a8b751dbe7c 494 void writtenToMemory(const void* arg )
acarter2 0:4a8b751dbe7c 495 {
acarter2 0:4a8b751dbe7c 496
acarter2 0:4a8b751dbe7c 497 }
acarter2 0:4a8b751dbe7c 498
acarter2 0:4a8b751dbe7c 499
acarter2 0:4a8b751dbe7c 500 /*
acarter2 0:4a8b751dbe7c 501 /this is he deleteRecords which will move the buffer regard so that the bufferent will over
acarter2 0:4a8b751dbe7c 502 /write to the old data in the fifo buffer
acarter2 0:4a8b751dbe7c 503 */
acarter2 0:4a8b751dbe7c 504 void deleteRecord(const void* arg )
acarter2 0:4a8b751dbe7c 505 {
acarter2 0:4a8b751dbe7c 506
acarter2 0:4a8b751dbe7c 507 }
acarter2 0:4a8b751dbe7c 508
acarter2 0:4a8b751dbe7c 509
acarter2 0:4a8b751dbe7c 510 /*
acarter2 0:4a8b751dbe7c 511 /read Record is the most reason data which which is store in the data
acarter2 0:4a8b751dbe7c 512 */
acarter2 0:4a8b751dbe7c 513 void readRecord(const void* arg )
acarter2 0:4a8b751dbe7c 514 {
acarter2 0:4a8b751dbe7c 515
acarter2 0:4a8b751dbe7c 516 }
acarter2 0:4a8b751dbe7c 517
acarter2 0:4a8b751dbe7c 518
acarter2 0:4a8b751dbe7c 519 /*
acarter2 0:4a8b751dbe7c 520 /read Record is the selected data which be passed in as a a string
acarter2 0:4a8b751dbe7c 521 */
acarter2 0:4a8b751dbe7c 522 void printCurrentRecord(char displayString[], int length)
acarter2 0:4a8b751dbe7c 523 {
acarter2 0:4a8b751dbe7c 524
acarter2 0:4a8b751dbe7c 525 for(int i = 0; i < length - 1; i++){
acarter2 0:4a8b751dbe7c 526
acarter2 0:4a8b751dbe7c 527 const char letter = displayString[i];
acarter2 0:4a8b751dbe7c 528 printf('%c', letter);
acarter2 0:4a8b751dbe7c 529
acarter2 0:4a8b751dbe7c 530
acarter2 0:4a8b751dbe7c 531 }
acarter2 0:4a8b751dbe7c 532
acarter2 0:4a8b751dbe7c 533 char letter = displayString[length - 1];
acarter2 0:4a8b751dbe7c 534 //printf('%c\n',letter);
acarter2 0:4a8b751dbe7c 535
acarter2 0:4a8b751dbe7c 536
acarter2 0:4a8b751dbe7c 537 }
acarter2 0:4a8b751dbe7c 538
acarter2 0:4a8b751dbe7c 539 void deleteAll(BufferStartPointer* bufferStart, BufferEndPointer* bufferEnd){
acarter2 0:4a8b751dbe7c 540
acarter2 0:4a8b751dbe7c 541 while(bufferStart -> lock()){}
acarter2 0:4a8b751dbe7c 542 bufferStart -> setBufferStartPointer(0);
acarter2 0:4a8b751dbe7c 543 bufferStart -> unlock();
acarter2 0:4a8b751dbe7c 544
acarter2 0:4a8b751dbe7c 545 while(bufferEnd -> lock()){};
acarter2 0:4a8b751dbe7c 546 bufferEnd -> setBufferEndPointer(0);
acarter2 0:4a8b751dbe7c 547 bufferEnd -> unlock();
acarter2 0:4a8b751dbe7c 548
acarter2 0:4a8b751dbe7c 549
acarter2 0:4a8b751dbe7c 550 // need the ram memory
acarter2 0:4a8b751dbe7c 551
acarter2 0:4a8b751dbe7c 552
acarter2 0:4a8b751dbe7c 553
acarter2 0:4a8b751dbe7c 554
acarter2 0:4a8b751dbe7c 555
acarter2 0:4a8b751dbe7c 556 }
acarter2 0:4a8b751dbe7c 557
acarter2 0:4a8b751dbe7c 558 /*
acarter2 0:4a8b751dbe7c 559 /this is the fuction which update the the sample rate so the int to
acarter2 0:4a8b751dbe7c 560 /update the value whoch might hange
acarter2 0:4a8b751dbe7c 561 */
acarter2 0:4a8b751dbe7c 562 void updateSampleRate(double newSampleRate, SampleRate* sampleRate)
acarter2 0:4a8b751dbe7c 563 {
acarter2 0:4a8b751dbe7c 564 while(!sampleRate -> lock()){};
acarter2 0:4a8b751dbe7c 565 char outputString[20];
acarter2 0:4a8b751dbe7c 566 if(newSampleRate =>0.1 && newSampleRate =<60.0){
acarter2 0:4a8b751dbe7c 567 sampleRate -> setSampleRate(newSampleRate);
acarter2 0:4a8b751dbe7c 568 outputString = 'UPDATE<' + sampleRate+ '>';
acarter2 0:4a8b751dbe7c 569 }else{
acarter2 0:4a8b751dbe7c 570 outputString = 'OUT OF RANGE';
acarter2 0:4a8b751dbe7c 571 }
acarter2 0:4a8b751dbe7c 572 sampleRate -> unlock();
acarter2 0:4a8b751dbe7c 573
acarter2 0:4a8b751dbe7c 574 }
acarter2 0:4a8b751dbe7c 575
acarter2 0:4a8b751dbe7c 576 /*/
acarter2 0:4a8b751dbe7c 577 /this is update the the log so see if the log if the the sample rate
acarter2 0:4a8b751dbe7c 578 ozr not
acarter2 0:4a8b751dbe7c 579 */
acarter2 0:4a8b751dbe7c 580 void updateLog(char logType[], TakeSample* takeSample)
acarter2 0:4a8b751dbe7c 581 {
acarter2 0:4a8b751dbe7c 582 char output[20];
acarter2 0:4a8b751dbe7c 583
acarter2 0:4a8b751dbe7c 584 while(!takeSample -> lock()){}();
acarter2 0:4a8b751dbe7c 585 if(logType[0] == 'N' || logType[0] == 'N'){
acarter2 0:4a8b751dbe7c 586 if(logType[1] == 'O' || logType[0] == 'o'){
acarter2 0:4a8b751dbe7c 587 takeSample -> setTakeSample(false);
acarter2 0:4a8b751dbe7c 588 output ='Log<ON>';
acarter2 0:4a8b751dbe7c 589 }
acarter2 0:4a8b751dbe7c 590
acarter2 0:4a8b751dbe7c 591 }
acarter2 0:4a8b751dbe7c 592
acarter2 0:4a8b751dbe7c 593 if(logType[0] == 'Y' || logType[0] == 'y'){
acarter2 0:4a8b751dbe7c 594 if(logType[1] == 'E' || logType[0] == 'e'){
acarter2 0:4a8b751dbe7c 595 if(logType[2] == 'E' || logType[0] == 'e'){
acarter2 0:4a8b751dbe7c 596 takeSample -> setTakeSample(true);
acarter2 0:4a8b751dbe7c 597 output ='Log<OFF>';
acarter2 0:4a8b751dbe7c 598 }
acarter2 0:4a8b751dbe7c 599 }
acarter2 0:4a8b751dbe7c 600 }
acarter2 0:4a8b751dbe7c 601 takeSample -> unlock();
acarter2 0:4a8b751dbe7c 602
acarter2 0:4a8b751dbe7c 603 //need output tread
acarter2 0:4a8b751dbe7c 604
acarter2 0:4a8b751dbe7c 605 }
acarter2 0:4a8b751dbe7c 606
acarter2 0:4a8b751dbe7c 607 /*
acarter2 0:4a8b751dbe7c 608 /tthis is update th date which the system will go from and with change
acarter2 0:4a8b751dbe7c 609 / the date so that the records are set with the date.
acarter2 0:4a8b751dbe7c 610 */
acarter2 0:4a8b751dbe7c 611 void updateDate(char newDate[])
acarter2 0:4a8b751dbe7c 612 {
acarter2 0:4a8b751dbe7c 613
acarter2 0:4a8b751dbe7c 614 }
acarter2 0:4a8b751dbe7c 615
acarter2 0:4a8b751dbe7c 616 /*
acarter2 0:4a8b751dbe7c 617 /tthis is update th time which the system will go from and with change
acarter2 0:4a8b751dbe7c 618 / the time so that the records are set with the date.
acarter2 0:4a8b751dbe7c 619 */
acarter2 0:4a8b751dbe7c 620 void updateTime(char newTime[])
acarter2 0:4a8b751dbe7c 621 {
acarter2 0:4a8b751dbe7c 622
acarter2 0:4a8b751dbe7c 623 }
acarter2 0:4a8b751dbe7c 624
acarter2 0:4a8b751dbe7c 625 void updateDisplayState(SampleDisplay* sampleDisplay, char displayString[]){
acarter2 0:4a8b751dbe7c 626
acarter2 0:4a8b751dbe7c 627 char output[20];
acarter2 0:4a8b751dbe7c 628
acarter2 0:4a8b751dbe7c 629 while(!sampleDisplay -> lock()){};
acarter2 0:4a8b751dbe7c 630 if(displayString[0] == 'N' || displayString[0] == 'N'){
acarter2 0:4a8b751dbe7c 631 if(displayString[1] == 'O' || displayString[1] == 'o'){
acarter2 0:4a8b751dbe7c 632 sampleDisplay -> setDisplay(false);
acarter2 0:4a8b751dbe7c 633 output ='SAMPLING<ON>';
acarter2 0:4a8b751dbe7c 634 }
acarter2 0:4a8b751dbe7c 635
acarter2 0:4a8b751dbe7c 636 }
acarter2 0:4a8b751dbe7c 637
acarter2 0:4a8b751dbe7c 638 if(displayString[0] == 'Y' || displayString[0] == 'y'){
acarter2 0:4a8b751dbe7c 639 if(displayString[1] == 'E' || displayString[0] == 'e'){
acarter2 0:4a8b751dbe7c 640 if(displayString[2] == 'E' || displayString[0] == 'e'){
acarter2 0:4a8b751dbe7c 641 sampleDisplay -> setDisplay(true);
acarter2 0:4a8b751dbe7c 642 output ='SAMPLING<OFF>';
acarter2 0:4a8b751dbe7c 643 }
acarter2 0:4a8b751dbe7c 644 }
acarter2 0:4a8b751dbe7c 645 }
acarter2 0:4a8b751dbe7c 646 sampleDisplay -> unlock();
acarter2 0:4a8b751dbe7c 647
acarter2 0:4a8b751dbe7c 648 }
acarter2 0:4a8b751dbe7c 649
acarter2 0:4a8b751dbe7c 650 void readInput(){
acarter2 0:4a8b751dbe7c 651
acarter2 0:4a8b751dbe7c 652 char ch;
acarter2 0:4a8b751dbe7c 653 char input[100];
acarter2 0:4a8b751dbe7c 654 int index = 0;
acarter2 0:4a8b751dbe7c 655 do
acarter2 0:4a8b751dbe7c 656 {
acarter2 0:4a8b751dbe7c 657 ch = getchar();
acarter2 0:4a8b751dbe7c 658 if(ch != EOF || ch != '\n'|| ch != ' '){
acarter2 0:4a8b751dbe7c 659 input[index] = ch;
acarter2 0:4a8b751dbe7c 660 index++;
acarter2 0:4a8b751dbe7c 661 }
acarter2 0:4a8b751dbe7c 662
acarter2 0:4a8b751dbe7c 663 }while( ch != '\n' || ch != EOF);
acarter2 0:4a8b751dbe7c 664
acarter2 0:4a8b751dbe7c 665 if(index > 1){
acarter2 0:4a8b751dbe7c 666
acarter2 0:4a8b751dbe7c 667 //Thread stringMutipluation;
acarter2 0:4a8b751dbe7c 668
acarter2 0:4a8b751dbe7c 669 //stringMutipluation =7 new Thread(sortString);
acarter2 0:4a8b751dbe7c 670
acarter2 0:4a8b751dbe7c 671
acarter2 0:4a8b751dbe7c 672 }
acarter2 0:4a8b751dbe7c 673 }
acarter2 0:4a8b751dbe7c 674
acarter2 0:4a8b751dbe7c 675
acarter2 0:4a8b751dbe7c 676 // setting up gobal treads to be uses in the program
acarter2 0:4a8b751dbe7c 677 //Thread producter();
acarter2 0:4a8b751dbe7c 678 //Thread customer;
acarter2 0:4a8b751dbe7c 679 //Thread tempTread;
acarter2 0:4a8b751dbe7c 680 //Thread humTread;
acarter2 0:4a8b751dbe7c 681 //Thread pressTread(;
acarter2 0:4a8b751dbe7c 682 //Thread displayTread;
acarter2 0:4a8b751dbe7c 683 //Thread sampleTread;
acarter2 0:4a8b751dbe7c 684 Thread inputTread;
acarter2 0:4a8b751dbe7c 685 Thread deleteRecordTread(deleteRecord);
acarter2 0:4a8b751dbe7c 686 //Thread setDateTread;
acarter2 0:4a8b751dbe7c 687 //Thread setTimeTread;
acarter2 0:4a8b751dbe7c 688 //Thread dsiplaySelectedRecord;
acarter2 0:4a8b751dbe7c 689 //Thread updateTakeDisplay;
acarter2 0:4a8b751dbe7c 690 //Thread updateTreadTiming;
acarter2 0:4a8b751dbe7c 691 //Thread stringMutipluation;
acarter2 0:4a8b751dbe7c 692
acarter2 0:4a8b751dbe7c 693
acarter2 0:4a8b751dbe7c 694 PwmOut mypwm(PWM_OUT);
acarter2 0:4a8b751dbe7c 695
acarter2 0:4a8b751dbe7c 696 DigitalOut myled(LED1);
acarter2 0:4a8b751dbe7c 697
acarter2 0:4a8b751dbe7c 698 int main() {
acarter2 0:4a8b751dbe7c 699
acarter2 0:4a8b751dbe7c 700 //loop counter
acarter2 0:4a8b751dbe7c 701 int i;
acarter2 0:4a8b751dbe7c 702
acarter2 0:4a8b751dbe7c 703 int argc;
acarter2 0:4a8b751dbe7c 704
acarter2 0:4a8b751dbe7c 705 //verify correct number of arguments passed into buffer
acarter2 0:4a8b751dbe7c 706 if(argc != 4){
acarter2 0:4a8b751dbe7c 707 fprint(stderr, "USAGE:./main.out <INT> <INT> <INT>\n");
acarter2 0:4a8b751dbe7c 708 }
acarter2 0:4a8b751dbe7c 709
acarter2 0:4a8b751dbe7c 710 int mainSleepTime = atoi(argv[1]);//time in seconds for main to sleep
acarter2 0:4a8b751dbe7c 711 int numProd = atoi(argv[2]); //number of producer threads
acarter2 0:4a8b751dbe7c 712 int numCons = atoi(argv[3]); //number of consumer threads
acarter2 0:4a8b751dbe7c 713
acarter2 0:4a8b751dbe7c 714 //initialise buffer data
acarter2 0:4a8b751dbe7c 715 initialiseBufferData();
acarter2 0:4a8b751dbe7c 716
acarter2 0:4a8b751dbe7c 717 //create producer threads
acarter2 0:4a8b751dbe7c 718 for(i = 0; i < numProd; i++){
acarter2 0:4a8b751dbe7c 719 pthread_create(&tid, &attr, producer, NULL);
acarter2 0:4a8b751dbe7c 720
acarter2 0:4a8b751dbe7c 721 }
acarter2 0:4a8b751dbe7c 722
acarter2 0:4a8b751dbe7c 723 //create cinsumer threads
acarter2 0:4a8b751dbe7c 724 for(i = 0; i < numProd; i++){
acarter2 0:4a8b751dbe7c 725 pthread_create(&tid, &attr, consumer, NULL);
acarter2 0:4a8b751dbe7c 726 }
acarter2 0:4a8b751dbe7c 727
acarter2 0:4a8b751dbe7c 728 //sleep for specified amount of time in ms
acarter2 0:4a8b751dbe7c 729 sleep(mainSleepTime);
acarter2 0:4a8b751dbe7c 730
acarter2 0:4a8b751dbe7c 731 SampleRate sampleRate = SampleRate();
acarter2 0:4a8b751dbe7c 732 TakeSample takeSample = TakeSample();
acarter2 0:4a8b751dbe7c 733 SampleTemp sampleTemp = SampleTemp();
acarter2 0:4a8b751dbe7c 734 SampleHumitaty sampleHumitaty = SampleHumitaty();
acarter2 0:4a8b751dbe7c 735 SamplePressure samplePressure = SamplePressure();
acarter2 0:4a8b751dbe7c 736 SampleDisplay sampleDisplay = SampleDisplay();
acarter2 0:4a8b751dbe7c 737 BufferStartPointer bufferStartPointer = BufferStartPointer();
acarter2 0:4a8b751dbe7c 738 BufferEndPointer bufferEndPointer = BufferEndPointer();
acarter2 0:4a8b751dbe7c 739
acarter2 0:4a8b751dbe7c 740
acarter2 0:4a8b751dbe7c 741 while(1) {
acarter2 0:4a8b751dbe7c 742
acarter2 0:4a8b751dbe7c 743 readInput();
acarter2 0:4a8b751dbe7c 744
acarter2 0:4a8b751dbe7c 745
acarter2 0:4a8b751dbe7c 746 myled = !myled;
acarter2 0:4a8b751dbe7c 747 wait(1);
acarter2 0:4a8b751dbe7c 748 }
acarter2 0:4a8b751dbe7c 749 }
acarter2 0:4a8b751dbe7c 750