test

Dependents:   controller_naive

Committer:
yxyang
Date:
Sat Feb 24 01:24:57 2018 +0000
Revision:
0:9c6145a1d114
avg intensity

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yxyang 0:9c6145a1d114 1 #include "TSL1401CL.h"
yxyang 0:9c6145a1d114 2
yxyang 0:9c6145a1d114 3 TSL1401CL::TSL1401CL(PinName pin_clk, PinName pin_si, PinName pin_adc) : clk(pin_clk), si(pin_si), adc(pin_adc), integration_time(0)
yxyang 0:9c6145a1d114 4 {
yxyang 0:9c6145a1d114 5 clk.write(0);
yxyang 0:9c6145a1d114 6 integration_timer.start();
yxyang 0:9c6145a1d114 7 }
yxyang 0:9c6145a1d114 8
yxyang 0:9c6145a1d114 9 bool TSL1401CL::integrationReady()
yxyang 0:9c6145a1d114 10 {
yxyang 0:9c6145a1d114 11 return static_cast<uint32_t>(integration_timer.read_us()) >= integration_time;
yxyang 0:9c6145a1d114 12 }
yxyang 0:9c6145a1d114 13
yxyang 0:9c6145a1d114 14 void TSL1401CL::read()
yxyang 0:9c6145a1d114 15 {
yxyang 0:9c6145a1d114 16 integration_timer.reset();
yxyang 0:9c6145a1d114 17 integration_timer.start();
yxyang 0:9c6145a1d114 18 clk.write(0);
yxyang 0:9c6145a1d114 19 si.write(1);
yxyang 0:9c6145a1d114 20 clk.write(1);
yxyang 0:9c6145a1d114 21 si.write(0);
yxyang 0:9c6145a1d114 22
yxyang 0:9c6145a1d114 23 for (uint8_t i = 0; i < TSL1401CL_PIXEL_COUNT; i++) {
yxyang 0:9c6145a1d114 24 clk.write(0);
yxyang 0:9c6145a1d114 25 data[i] = adc.read_u16();
yxyang 0:9c6145a1d114 26 clk.write(1);
yxyang 0:9c6145a1d114 27 }
yxyang 0:9c6145a1d114 28 clk.write(0);
yxyang 0:9c6145a1d114 29 }
yxyang 0:9c6145a1d114 30
yxyang 0:9c6145a1d114 31 void TSL1401CL::setIntegrationTime(uint32_t int_time_desired)
yxyang 0:9c6145a1d114 32 {
yxyang 0:9c6145a1d114 33 integration_time = int_time_desired;
yxyang 0:9c6145a1d114 34 }
yxyang 0:9c6145a1d114 35
yxyang 0:9c6145a1d114 36 int TSL1401CL::findLineEdge (uint16_t threshold, uint8_t precision, size_t crop_amount, bool invert)
yxyang 0:9c6145a1d114 37 {
yxyang 0:9c6145a1d114 38 if(precision == 0) precision = 1;
yxyang 0:9c6145a1d114 39
yxyang 0:9c6145a1d114 40 // Create an array with resolution determined by precision containing the change between points in data
yxyang 0:9c6145a1d114 41 uint16_t change_len = (TSL1401CL_PIXEL_COUNT - 2*crop_amount)/precision - 1;
yxyang 0:9c6145a1d114 42 int32_t change_in_data[change_len];
yxyang 0:9c6145a1d114 43 for(uint16_t i = crop_amount, j = 0; i < TSL1401CL_PIXEL_COUNT - crop_amount - precision; i += precision, j++) {
yxyang 0:9c6145a1d114 44 change_in_data[j] = (int)data[i+precision] - (int)data[i];
yxyang 0:9c6145a1d114 45 }
yxyang 0:9c6145a1d114 46
yxyang 0:9c6145a1d114 47 // Find the index of the maximum value in change_in_data
yxyang 0:9c6145a1d114 48 uint16_t maxchange = 0;
yxyang 0:9c6145a1d114 49 for(uint16_t i = 1; i < change_len; i++) {
yxyang 0:9c6145a1d114 50 if(invert) {
yxyang 0:9c6145a1d114 51 if(change_in_data[i] < change_in_data[maxchange]) maxchange = i;
yxyang 0:9c6145a1d114 52 } else {
yxyang 0:9c6145a1d114 53 if(change_in_data[i] > change_in_data[maxchange]) maxchange = i;
yxyang 0:9c6145a1d114 54 }
yxyang 0:9c6145a1d114 55 }
yxyang 0:9c6145a1d114 56
yxyang 0:9c6145a1d114 57 // If there isn't a sharp enough change returns -1
yxyang 0:9c6145a1d114 58 if((change_in_data[maxchange] >= threshold && !invert) || (change_in_data[maxchange]*-1 >= threshold && invert)) {
yxyang 0:9c6145a1d114 59 return maxchange*precision + crop_amount;
yxyang 0:9c6145a1d114 60 }
yxyang 0:9c6145a1d114 61 else return -1;
yxyang 0:9c6145a1d114 62 }
yxyang 0:9c6145a1d114 63
yxyang 0:9c6145a1d114 64 int TSL1401CL::findLineCenter (uint16_t threshold, uint8_t precision, size_t crop_amount)
yxyang 0:9c6145a1d114 65 {
yxyang 0:9c6145a1d114 66 if(precision == 0) precision = 1;
yxyang 0:9c6145a1d114 67
yxyang 0:9c6145a1d114 68 // Create an array with resolution determined by precision containing the change between points in data
yxyang 0:9c6145a1d114 69 uint16_t change_len = (TSL1401CL_PIXEL_COUNT - 2*crop_amount)/precision - 1;
yxyang 0:9c6145a1d114 70 int32_t change_in_data[change_len];
yxyang 0:9c6145a1d114 71 for(uint16_t i = crop_amount, j = 0; i < TSL1401CL_PIXEL_COUNT - crop_amount - precision; i += precision, j++) {
yxyang 0:9c6145a1d114 72 change_in_data[j] = (int)data[i+precision] - (int)data[i];
yxyang 0:9c6145a1d114 73 }
yxyang 0:9c6145a1d114 74
yxyang 0:9c6145a1d114 75 // Find the index of the maximum and minimum value in change_in_data
yxyang 0:9c6145a1d114 76 uint16_t maxchange = 0;
yxyang 0:9c6145a1d114 77 uint16_t minchange = 0;
yxyang 0:9c6145a1d114 78 for(uint16_t i = 1; i < change_len; i++) {
yxyang 0:9c6145a1d114 79 if(change_in_data[i] > change_in_data[maxchange]) maxchange = i;
yxyang 0:9c6145a1d114 80 if(change_in_data[i] < change_in_data[minchange]) minchange = i;
yxyang 0:9c6145a1d114 81 }
yxyang 0:9c6145a1d114 82
yxyang 0:9c6145a1d114 83 // Return the average of the max and min value
yxyang 0:9c6145a1d114 84 if(change_in_data[maxchange] >= threshold && change_in_data[minchange]*-1 >= threshold) {
yxyang 0:9c6145a1d114 85 return (precision*maxchange+precision*minchange)/2 + crop_amount;
yxyang 0:9c6145a1d114 86 }
yxyang 0:9c6145a1d114 87 return -1;
yxyang 0:9c6145a1d114 88 }
yxyang 0:9c6145a1d114 89
yxyang 0:9c6145a1d114 90 int TSL1401CL::findPixelIntensity() {
yxyang 0:9c6145a1d114 91 int ans = 0;
yxyang 0:9c6145a1d114 92 for (int i = 0; i < 128; i++) {
yxyang 0:9c6145a1d114 93 ans += data[i];
yxyang 0:9c6145a1d114 94 }
yxyang 0:9c6145a1d114 95 return ans / 128;
yxyang 0:9c6145a1d114 96 }
yxyang 0:9c6145a1d114 97
yxyang 0:9c6145a1d114 98 int TSL1401CL::findLineWidth (uint16_t threshold, uint8_t precision, size_t crop_amount)
yxyang 0:9c6145a1d114 99 {
yxyang 0:9c6145a1d114 100 if(precision == 0) precision = 1;
yxyang 0:9c6145a1d114 101
yxyang 0:9c6145a1d114 102 // Create an array with resolution determined by precision containing the change between points in data
yxyang 0:9c6145a1d114 103 uint16_t change_len = (TSL1401CL_PIXEL_COUNT - 2*crop_amount)/precision - 1;
yxyang 0:9c6145a1d114 104 int32_t change_in_data[change_len];
yxyang 0:9c6145a1d114 105 for(uint16_t i = crop_amount, j = 0; i < TSL1401CL_PIXEL_COUNT - crop_amount - precision; i += precision, j++) {
yxyang 0:9c6145a1d114 106 change_in_data[j] = (int)data[i+precision] - (int)data[i];
yxyang 0:9c6145a1d114 107 }
yxyang 0:9c6145a1d114 108
yxyang 0:9c6145a1d114 109 // Find the index of the maximum and minimum value in change_in_data
yxyang 0:9c6145a1d114 110 uint16_t maxchange = 0;
yxyang 0:9c6145a1d114 111 uint16_t minchange = 0;
yxyang 0:9c6145a1d114 112 for(uint16_t i = 1; i < change_len; i++) {
yxyang 0:9c6145a1d114 113 if(change_in_data[i] > change_in_data[maxchange]) maxchange = i;
yxyang 0:9c6145a1d114 114 if(change_in_data[i] < change_in_data[minchange]) minchange = i;
yxyang 0:9c6145a1d114 115 }
yxyang 0:9c6145a1d114 116
yxyang 0:9c6145a1d114 117 // Return the average of the max and min value
yxyang 0:9c6145a1d114 118 if(change_in_data[maxchange] >= threshold && change_in_data[minchange]*-1 >= threshold) {
yxyang 0:9c6145a1d114 119 if (maxchange > minchange) {
yxyang 0:9c6145a1d114 120 return (precision*maxchange-precision*minchange);
yxyang 0:9c6145a1d114 121 } else {
yxyang 0:9c6145a1d114 122 return (precision*minchange-precision*maxchange);
yxyang 0:9c6145a1d114 123 }
yxyang 0:9c6145a1d114 124 }
yxyang 0:9c6145a1d114 125 return -1;
yxyang 0:9c6145a1d114 126 }
yxyang 0:9c6145a1d114 127
yxyang 0:9c6145a1d114 128
yxyang 0:9c6145a1d114 129 uint32_t TSL1401CL::getData(uint8_t index)
yxyang 0:9c6145a1d114 130 {
yxyang 0:9c6145a1d114 131 return data[index];
yxyang 0:9c6145a1d114 132 }