works pretty well... integration time actually works.. need to work on the analog read stuff.. need to also work on data compression.... need to also work on making a continuous read and data dump......should be possible since the threads don't conflict..

Dependencies:   mbed-rtos mbed

Revision:
0:e5d6563899d5
Child:
1:37f04be9c0fa
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Thu Oct 23 00:08:09 2014 +0000
@@ -0,0 +1,148 @@
+#include "mbed.h"
+#include "cmsis_os.h"
+
+//configure I/O
+InterruptIn masterClock_int(PB_14);
+InterruptIn shiftGate_int(PC_6);
+AnalogIn pixelIn(A0);
+DigitalOut led(LED1);
+DigitalOut illuminator(PA_8);
+DigitalOut blueLED(PB_5);
+DigitalOut redLED(PB_10);
+Serial raspi(USBTX, USBRX);
+
+//testPin indicators - for use with logic analyzer to determine timing states
+DigitalOut tp_signalElements(PC_3);
+DigitalOut tp_leadingWaste(PC_2);
+DigitalOut tp_trailingWaste(PH_1);
+DigitalOut tp_t_INT(PH_0);
+DigitalOut tp_dump(PC_15);
+
+//define pin configuration for CCD control signals
+#define     trigger                 PB_13
+#define     shiftGate               PB_8
+#define     icg                     PB_3
+#define     masterClock             PB_4
+
+//Set up control signals as a bus  (reversed)
+BusOut tcd1304dg_clocks(trigger, shiftGate, icg, masterClock);
+
+//define TCD1304AP/DG Characteristics
+#define     signalElements          3648
+#define     pixelTotal              3694
+#define     leadingDummyElements    16
+#define     leadShieldedElements    13
+#define     headerElements          3
+#define     trailingDummyElements   14
+#define     MV(x) ((0xFFF*x)/3300)
+                                                //                      MIST  --  masterClock, icg, shiftGate, tigger
+#define     transition_1            4           // beginning            0100
+#define     transition_2            12          // clock_1              1100
+#define     transition_3            4           // just before t2       0100
+#define     transition_4            8           // icg fall             1000
+#define     transition_5            2           // rise of sh for t3    0010  --  stretch here to increase integration time (must cycle masterClock)
+#define     transition_6            10          // t3 masterHigh        1010  --  stretch here to increase integration time (must cycle masterClock)
+#define     transition_7            2           // t3 masterLow         0010
+#define     transition_8            8           // t1 masterHigh        1000
+#define     transition_9            0           // t2 masterLow         0000
+#define     transition_10           12          // t4 masterHigh        1100
+#define     transition_11           4           // t4 masterLow         0100  --  repeat from here
+
+//define variables
+int pixelCount;
+int sensitivity                     = 1;
+double pixelData;
+float firmwareVersion               = 0.5;
+double pixelValue[signalElements] = { 0 };
+
+void delta_encode(char *buffer, int length){
+    char last = 0;
+    for (int i = 0; i < length; i++){
+        char current = buffer[i];
+        buffer[i] = buffer[i] - last;
+        last = current;
+    }
+}
+ 
+void delta_decode(char *buffer, int length){
+    char last = 0;
+    for (int i = 0; i < length; i++){
+        buffer[i] = buffer[i] + last;
+        last = buffer[i];
+    }
+}
+
+void printInfo(){
+    time_t seconds = time(NULL);
+    char buffer[32];
+    strftime(buffer, 32, "%I:%M %p\n", localtime(&seconds));
+    raspi.printf("meridianScientific\r\n");
+    raspi.printf("ramanPi - The DIY 3D Printable RaspberryPi Raman Spectrometer\r\n");
+    raspi.printf("Spectrometer imagingBoard                            %s\r\n", buffer);
+    raspi.printf("-------------------------------------------------------------\r\n");
+    raspi.printf("Firmware Version: %f\r\n",firmwareVersion);
+    raspi.printf("Current Sensitivity: %d\r\n\r\n\r\n", sensitivity);
+}
+
+void dataXfer_thread(void const *args){
+    while(1){
+        osSignalWait(0x1, osWaitForever);
+        redLED = 1;
+//    for (int pixelNumber=0; pixelNumber<signalElements; pixelNumber++) {
+//        raspi.printf("%i\t%4.12f\r\n", pixelNumber, 5 - ((pixelValue[pixelNumber - 1] * 5) / 4096.0));
+//        osDelay(100);
+//    }
+        printInfo();
+        osDelay(1000);
+        redLED = 0;
+    }
+}
+
+void imaging_thread(void const *args){
+    while(1){
+        osSignalWait(0x1, osWaitForever);
+        blueLED = !blueLED;
+        osDelay(30);
+    }
+}
+
+//define threads for imaging and data transfer
+osThreadDef(imaging_thread, osPriorityRealtime, DEFAULT_STACK_SIZE);
+osThreadDef(dataXfer_thread, osPriorityNormal, DEFAULT_STACK_SIZE);
+
+void init(){
+    tp_signalElements = 0;
+    tp_leadingWaste = 0;
+    tp_trailingWaste = 0;
+    tp_t_INT = 0;
+    tp_dump = 0;
+    illuminator = 0;
+    redLED = 0;
+    blueLED = 0;
+}    
+
+int main(){
+    set_time(1256729737); 
+    tcd1304dg_clocks = 0;
+    init();
+    raspi.baud(921600);
+    osThreadId img = osThreadCreate(osThread(imaging_thread), NULL);
+    osThreadId xfr = osThreadCreate(osThread(dataXfer_thread), NULL);
+
+    //command interpreter
+    while(true){
+        led =!led;
+        char c = raspi.getc();
+        switch (c) {
+            case 'r':
+                osSignalSet(img, 0x1);
+                break;
+            case 'i':
+                osSignalSet(xfr, 0x1);
+                break;
+            default:
+                break;
+        }
+        osDelay(10);
+    }
+}
\ No newline at end of file