Revision:
0:4e108bee7994
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TSL1401CL.cpp	Tue May 30 06:54:21 2017 +0000
@@ -0,0 +1,93 @@
+#include "TSL1401CL.h"
+
+TSL1401CL::TSL1401CL(PinName pin_clk, PinName pin_si, PinName pin_adc) : clk(pin_clk), si(pin_si), adc(pin_adc), integration_time(0)
+{
+    clk.write(0);
+    integration_timer.start();
+}
+
+bool TSL1401CL::integrationReady()
+{
+    return static_cast<uint32_t>(integration_timer.read_us()) >= integration_time;
+}
+
+void TSL1401CL::read()
+{
+    integration_timer.reset();
+    integration_timer.start();
+    clk.write(0);
+    si.write(1);
+    clk.write(1);
+    si.write(0);
+
+    for (uint8_t i = 0; i < TSL1401CL_PIXEL_COUNT; i++) {
+        clk.write(0);
+        data[i] = adc.read_u16();
+        clk.write(1);
+    }
+    clk.write(0);
+}
+
+void TSL1401CL::setIntegrationTime(uint32_t int_time_desired)
+{
+    integration_time = int_time_desired;
+}
+
+int TSL1401CL::findLineEdge (uint16_t threshold, uint8_t precision, size_t crop_amount, bool invert)
+{
+    if(precision == 0) precision = 1;
+
+    // Create an array with resolution determined by precision containing the change between points in data
+    uint16_t change_len = (TSL1401CL_PIXEL_COUNT - 2*crop_amount)/precision - 1;
+    int32_t change_in_data[change_len];
+    for(uint16_t i = crop_amount, j = 0; i < TSL1401CL_PIXEL_COUNT - crop_amount - precision; i += precision, j++) {
+        change_in_data[j] = (int)data[i+precision] - (int)data[i];
+    }
+
+    // Find the index of the maximum value in change_in_data
+    uint16_t maxchange = 0;
+    for(uint16_t i = 1; i < change_len; i++) {
+        if(invert) {
+            if(change_in_data[i] < change_in_data[maxchange]) maxchange = i;
+        } else {
+            if(change_in_data[i] > change_in_data[maxchange]) maxchange = i;
+        }
+    }
+
+    // If there isn't a sharp enough change returns -1
+    if((change_in_data[maxchange] >= threshold && !invert) || (change_in_data[maxchange]*-1 >= threshold && invert)) {
+        return maxchange*precision + crop_amount;
+    }
+    else return -1;
+}
+
+int TSL1401CL::findLineCenter (uint16_t threshold, uint8_t precision, size_t crop_amount)
+{
+    if(precision == 0) precision = 1;
+
+    // Create an array with resolution determined by precision containing the change between points in data
+    uint16_t change_len = (TSL1401CL_PIXEL_COUNT - 2*crop_amount)/precision - 1;
+    int32_t change_in_data[change_len];
+    for(uint16_t i = crop_amount, j = 0; i < TSL1401CL_PIXEL_COUNT - crop_amount - precision; i += precision, j++) {
+        change_in_data[j] = (int)data[i+precision] - (int)data[i];
+    }
+
+    // Find the index of the maximum and minimum value in change_in_data
+    uint16_t maxchange = 0;
+    uint16_t minchange = 0;
+    for(uint16_t i = 1; i < change_len; i++) {
+        if(change_in_data[i] > change_in_data[maxchange]) maxchange = i;
+        if(change_in_data[i] < change_in_data[minchange]) minchange = i;
+    }
+
+    // Return the average of the max and min value
+    if(change_in_data[maxchange] >= threshold && change_in_data[minchange]*-1 >= threshold) {
+        return (precision*maxchange+precision*minchange)/2 + crop_amount;
+    }
+    return -1;
+}
+
+uint32_t TSL1401CL::getData(uint8_t index)
+{
+    return data[index];
+}
\ No newline at end of file