Colour sensors calibrated

Dependencies:   mbed-rtos mbed Servo QEI

Fork of ICRSEurobot13 by Thomas Branch

Files at this revision

API Documentation at this revision

Comitter:
twighk
Date:
Fri Apr 05 21:49:23 2013 +0000
Parent:
11:bbddc908c78c
Child:
14:c638d4b9ee94
Commit message:
Printing Thread prints stuff

Changed in this revision

Processes/Printing/Printing.cpp Show annotated file Show diff for this revision Revisions of this file
Processes/Printing/Printing.h 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
mbed-rtos.lib Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Processes/Printing/Printing.cpp	Fri Apr 05 21:49:23 2013 +0000
@@ -0,0 +1,85 @@
+#include "Printing.h"
+#ifdef PRINTINGOFF
+void printingThread(void const*){Thread::wait(osWaitForever);}
+bool registerID(char, size_t){return true;}
+bool unregisterID(char) {return true;}
+bool updateval(char, float*, size_t){return true;}
+bool updateval(char id, float value){return true;}
+#else
+#include <iostream>
+using namespace std;
+
+size_t idlist[NUMIDS]; // Stores length of buffer 0 => unassigned
+float* buffarr[NUMIDS];
+volatile unsigned int newdataflags;
+
+bool registerID(char id, size_t length) {   
+    if (id < NUMIDS && !idlist[id]) {//check if the id is already taken
+        idlist[id] = length;
+        buffarr[id] = new float[length];
+        return true;
+    } else
+        return false;
+}
+bool unregisterID(char id) {
+    if (id < NUMIDS) {
+        idlist[id] = 0;
+        if (buffarr[id])
+            delete buffarr[id];
+        return true;
+    } else
+        return false;
+}
+
+bool updateval(char id, float* buffer, size_t length) {
+    //check if the id is registered, and has buffer of correct length
+    if (id < NUMIDS && idlist[id] == length && buffarr[id] && !(newdataflags & (1<<id))) {
+        for (size_t i = 0; i < length; i++)
+            buffarr[id][i] = buffer[i];
+        newdataflags |= (1<<id);
+        return true;
+    } else
+        return false;
+}
+
+bool updateval(char id, float value){
+    //check if the id is registered, and the old value has been written
+    if (id < NUMIDS && idlist[id] == 1 && buffarr[id] && !(newdataflags & (1<<id))) {
+        buffarr[id][0] = value;
+        newdataflags |= (1<<id);
+        return true;
+    } else
+        return false;
+}
+
+void printingThread(void const*){
+    newdataflags = 0;
+    for (int i = 0; i < NUMIDS; i++) {
+        idlist[i] = 0;
+        buffarr[i] = 0;
+    }
+
+
+    Thread::wait(3500);
+    while(true){   
+        // Send number of packets
+        char numtosend = 0;
+        for (unsigned int v = newdataflags; v; numtosend++){v &= v - 1;}        
+        cout.put(numtosend);
+
+        // Send packets
+        for (char id = 0; id < NUMIDS; id++) {
+            if (newdataflags & (1<<id)) {
+                cout.put(id);
+                cout.write((char*)buffarr[id], idlist[id] * sizeof(float));
+                newdataflags &= ~(1<<id);
+            }
+        }
+        cout << endl;
+        Thread::wait(200);
+    }
+}
+#endif
+
+
+ 
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Processes/Printing/Printing.h	Fri Apr 05 21:49:23 2013 +0000
@@ -0,0 +1,16 @@
+
+// Eurobot13 Printing.h
+
+#include "mbed.h"
+#include "rtos.h"
+
+const size_t NUMIDS = sizeof(unsigned int)*8;
+
+//Function to start in Thread
+void printingThread(void const*); //
+
+//Functions to use 
+bool registerID(char id, size_t length);
+bool unregisterID(char id);
+bool updateval(char id, float* buffer, size_t length);
+bool updateval(char id, float value);
--- a/main.cpp	Fri Apr 05 17:47:06 2013 +0000
+++ b/main.cpp	Fri Apr 05 21:49:23 2013 +0000
@@ -37,6 +37,7 @@
 
 */
 #include "mbed.h"
+#include "rtos.h"
 Serial pc(USBTX, USBRX);
 
 const PinName P_SERVO_LOWER_ARM = p5;
@@ -65,6 +66,7 @@
 #include "Sensors/Encoders/Encoder.h"
 #include "Sensors/Colour/Colour.h"
 #include "Sensors/CakeSensor/CakeSensor.h"
+#include "Processes/Printing/Printing.h"
 
 
 
@@ -80,6 +82,8 @@
 void ledphototransistortest();
 void colourtest();
 void cakesensortest();
+void printingtestthread(void const*);
+void printingtestthread2(void const*);
 
 int main() {
     
@@ -95,9 +99,43 @@
     //motortestline();
     //ledtest();
     //phototransistortest();
-    ledphototransistortest();
+    //ledphototransistortest();
     //colourtest(); // Red SnR too low
-    cakesensortest();
+    //cakesensortest();
+    DigitalOut l1(LED1);
+    Thread p(printingThread,        NULL,   osPriorityNormal,   2048);
+    l1=1;
+    Thread a(printingtestthread,    NULL,   osPriorityNormal,   1024);
+    Thread b(printingtestthread2,   NULL,   osPriorityNormal,   1024);
+    Thread::wait(osWaitForever);
+}
+
+#include <cstdlib>
+using namespace std;
+
+void printingtestthread(void const*){
+    const char ID = 1;
+    float buffer[3] = {ID};
+    registerID(ID,sizeof(buffer)/sizeof(buffer[0]));
+    while (true){
+        for(size_t i = 1; i != sizeof(buffer)/sizeof(buffer[0]); ++i){
+            buffer[i] =ID ;
+        }
+        updateval(ID, buffer, sizeof(buffer)/sizeof(buffer[0]));
+        Thread::wait(200);
+    }
+}
+void printingtestthread2(void const*){
+    const char ID = 2;
+    float buffer[5] = {ID};
+    registerID(ID,sizeof(buffer)/sizeof(buffer[0]));
+    while (true){
+        for(size_t i = 1; i != sizeof(buffer)/sizeof(buffer[0]); ++i){
+            buffer[i] = ID;
+        }
+        updateval(ID, buffer, sizeof(buffer)/sizeof(buffer[0]));
+        Thread::wait(500);
+    }
 }
 
 void cakesensortest(){
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed-rtos.lib	Fri Apr 05 21:49:23 2013 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed-rtos/#53e6cccd8782