for child
Fork of TRP105F_Spline by
TRP105F_Spline.cpp@0:e85788b14028, 2016-02-12 (annotated)
- Committer:
- aktk
- Date:
- Fri Feb 12 11:02:15 2016 +0000
- Revision:
- 0:e85788b14028
- Child:
- 1:2053662b1167
Distance data range : [0:1024] -> [0:256];
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
aktk | 0:e85788b14028 | 1 | #define DEBUG |
aktk | 0:e85788b14028 | 2 | #include "TRP105F_Spline.h" |
aktk | 0:e85788b14028 | 3 | |
aktk | 0:e85788b14028 | 4 | // To get voltage of TRP105F |
aktk | 0:e85788b14028 | 5 | AnalogIn g_Sensor_Voltage(p16); |
aktk | 0:e85788b14028 | 6 | // To get sample distance via seral com |
aktk | 0:e85788b14028 | 7 | Serial g_Serial_Signal(USBTX, USBRX); |
aktk | 0:e85788b14028 | 8 | |
aktk | 0:e85788b14028 | 9 | LocalFileSystem local("local"); // マウントポイントを定義(ディレクトリパスになる) |
aktk | 0:e85788b14028 | 10 | // for debug |
aktk | 0:e85788b14028 | 11 | #ifdef DEBUG |
aktk | 0:e85788b14028 | 12 | DigitalOut led1(LED1); |
aktk | 0:e85788b14028 | 13 | DigitalOut led2(LED2); |
aktk | 0:e85788b14028 | 14 | DigitalOut led3(LED3); |
aktk | 0:e85788b14028 | 15 | DigitalOut led4(LED4); |
aktk | 0:e85788b14028 | 16 | #endif |
aktk | 0:e85788b14028 | 17 | |
aktk | 0:e85788b14028 | 18 | TRP105FS::TRP105FS() |
aktk | 0:e85788b14028 | 19 | :_Data_Input_Type(SYSTEM) |
aktk | 0:e85788b14028 | 20 | { |
aktk | 0:e85788b14028 | 21 | _Sample_Num = 5; |
aktk | 0:e85788b14028 | 22 | _Sample_Set = (VDset *)malloc(_Sample_Num * sizeof(VDset)); |
aktk | 0:e85788b14028 | 23 | _u_spline = (double*)malloc(_Sample_Num * sizeof(double)); |
aktk | 0:e85788b14028 | 24 | |
aktk | 0:e85788b14028 | 25 | //calibrateSensor(); |
aktk | 0:e85788b14028 | 26 | } |
aktk | 0:e85788b14028 | 27 | |
aktk | 0:e85788b14028 | 28 | TRP105FS::TRP105FS( |
aktk | 0:e85788b14028 | 29 | unsigned int arg_num |
aktk | 0:e85788b14028 | 30 | ) |
aktk | 0:e85788b14028 | 31 | :_Data_Input_Type(SYSTEM) |
aktk | 0:e85788b14028 | 32 | { |
aktk | 0:e85788b14028 | 33 | if(arg_num > _ENUM) _Sample_Num = _ENUM; |
aktk | 0:e85788b14028 | 34 | else _Sample_Num = arg_num; |
aktk | 0:e85788b14028 | 35 | |
aktk | 0:e85788b14028 | 36 | _Sample_Set = (VDset *)malloc(_Sample_Num * sizeof(VDset)); |
aktk | 0:e85788b14028 | 37 | _u_spline = (double*)malloc(_Sample_Num * sizeof(double)); |
aktk | 0:e85788b14028 | 38 | |
aktk | 0:e85788b14028 | 39 | //calibrateSensor(); |
aktk | 0:e85788b14028 | 40 | } |
aktk | 0:e85788b14028 | 41 | |
aktk | 0:e85788b14028 | 42 | TRP105FS::TRP105FS( |
aktk | 0:e85788b14028 | 43 | unsigned int arg_num, |
aktk | 0:e85788b14028 | 44 | DataInType arg_dit |
aktk | 0:e85788b14028 | 45 | ) |
aktk | 0:e85788b14028 | 46 | :_Data_Input_Type(arg_dit) |
aktk | 0:e85788b14028 | 47 | { |
aktk | 0:e85788b14028 | 48 | if(arg_num > _ENUM) _Sample_Num = _ENUM; |
aktk | 0:e85788b14028 | 49 | else _Sample_Num = arg_num; |
aktk | 0:e85788b14028 | 50 | |
aktk | 0:e85788b14028 | 51 | _Sample_Set = (VDset *)malloc(_Sample_Num * sizeof(VDset)); |
aktk | 0:e85788b14028 | 52 | _u_spline = (double*)malloc(_Sample_Num * sizeof(double)); |
aktk | 0:e85788b14028 | 53 | |
aktk | 0:e85788b14028 | 54 | //calibrateSensor(); |
aktk | 0:e85788b14028 | 55 | } |
aktk | 0:e85788b14028 | 56 | |
aktk | 0:e85788b14028 | 57 | TRP105FS::~TRP105FS() |
aktk | 0:e85788b14028 | 58 | { |
aktk | 0:e85788b14028 | 59 | free(_Sample_Set); |
aktk | 0:e85788b14028 | 60 | free(_u_spline); |
aktk | 0:e85788b14028 | 61 | } |
aktk | 0:e85788b14028 | 62 | |
aktk | 0:e85788b14028 | 63 | unsigned short TRP105FS::getDistance() |
aktk | 0:e85788b14028 | 64 | { |
aktk | 0:e85788b14028 | 65 | int idx; |
aktk | 0:e85788b14028 | 66 | unsigned short pv = 0; |
aktk | 0:e85788b14028 | 67 | |
aktk | 0:e85788b14028 | 68 | //low pass filter |
aktk | 0:e85788b14028 | 69 | for(int i = 0; i < 10; i++) |
aktk | 0:e85788b14028 | 70 | pv += g_Sensor_Voltage.read_u16() / 10; |
aktk | 0:e85788b14028 | 71 | |
aktk | 0:e85788b14028 | 72 | idx = _getNearest(_LIDX, _RIDX, pv); |
aktk | 0:e85788b14028 | 73 | |
aktk | 0:e85788b14028 | 74 | if (idx != 0xFFFF) // unless occuring error |
aktk | 0:e85788b14028 | 75 | return _Set[idx].dst; |
aktk | 0:e85788b14028 | 76 | else |
aktk | 0:e85788b14028 | 77 | return 0xFFFF; |
aktk | 0:e85788b14028 | 78 | } |
aktk | 0:e85788b14028 | 79 | |
aktk | 0:e85788b14028 | 80 | /* |
aktk | 0:e85788b14028 | 81 | Function to find a set whose vol member is nearest a voltage from the sensor, recursively. |
aktk | 0:e85788b14028 | 82 | |
aktk | 0:e85788b14028 | 83 | SHORT LONG |
aktk | 0:e85788b14028 | 84 | +------------> HIGH[lidx , ... , cidx , threshold[cidx], cidx+1 , ... , ridx]LOW <-----------+ |
aktk | 0:e85788b14028 | 85 | |(if voltage form sensor < threshold[cidx]) ||| (if threshold[cidx] < voltage form sensor)| |
aktk | 0:e85788b14028 | 86 | | HIGH[lidx , ... , cidx]LOW ||| HIGH[cidx+1 , ... , ridx]LOW | |
aktk | 0:e85788b14028 | 87 | | | | | |
aktk | 0:e85788b14028 | 88 | +----------------+ +---------------+ |
aktk | 0:e85788b14028 | 89 | */ |
aktk | 0:e85788b14028 | 90 | int TRP105FS::_getNearest( |
aktk | 0:e85788b14028 | 91 | int arg_lidx, |
aktk | 0:e85788b14028 | 92 | int arg_ridx, |
aktk | 0:e85788b14028 | 93 | unsigned short arg_vol |
aktk | 0:e85788b14028 | 94 | ) |
aktk | 0:e85788b14028 | 95 | { |
aktk | 0:e85788b14028 | 96 | int cidx = (arg_lidx + arg_ridx) / 2; |
aktk | 0:e85788b14028 | 97 | |
aktk | 0:e85788b14028 | 98 | // When the number of element to compare is only one, return it as result. |
aktk | 0:e85788b14028 | 99 | if(arg_lidx == arg_ridx) |
aktk | 0:e85788b14028 | 100 | return cidx; |
aktk | 0:e85788b14028 | 101 | // If the voltage from the sensor is lower than the center threshold |
aktk | 0:e85788b14028 | 102 | // (_set[cidx] > _threshold[cidx] > _set[cidx+1]) |
aktk | 0:e85788b14028 | 103 | else if(arg_vol > _Threshold[cidx]) |
aktk | 0:e85788b14028 | 104 | return _getNearest(arg_lidx, cidx, arg_vol); |
aktk | 0:e85788b14028 | 105 | // If the voltage from the sensor is higher than the center threshold |
aktk | 0:e85788b14028 | 106 | else if(arg_vol < _Threshold[cidx]) |
aktk | 0:e85788b14028 | 107 | return _getNearest(cidx + 1, arg_ridx, arg_vol); |
aktk | 0:e85788b14028 | 108 | // If the voltage from the sensor eauals the center threshold |
aktk | 0:e85788b14028 | 109 | else //(arg_vol == _Treshold[cidx].vol) |
aktk | 0:e85788b14028 | 110 | return cidx; |
aktk | 0:e85788b14028 | 111 | } |
aktk | 0:e85788b14028 | 112 | |
aktk | 0:e85788b14028 | 113 | void TRP105FS::_sampleData() |
aktk | 0:e85788b14028 | 114 | { |
aktk | 0:e85788b14028 | 115 | int tmp; |
aktk | 0:e85788b14028 | 116 | char sig; |
aktk | 0:e85788b14028 | 117 | unsigned short tmp_vol; |
aktk | 0:e85788b14028 | 118 | VDset tmp_set[_ENUM]; // for bucket sort |
aktk | 0:e85788b14028 | 119 | |
aktk | 0:e85788b14028 | 120 | // Evry set, first get dst data via serai com, |
aktk | 0:e85788b14028 | 121 | // next, get vol data, |
aktk | 0:e85788b14028 | 122 | // and then do same for next index set. |
aktk | 0:e85788b14028 | 123 | for(int i = 0; i < _Sample_Num; i++) { |
aktk | 0:e85788b14028 | 124 | // |
aktk | 0:e85788b14028 | 125 | // Recieve a Distance datus and store it into member |
aktk | 0:e85788b14028 | 126 | // |
aktk | 0:e85788b14028 | 127 | if(_Data_Input_Type == KEYBORD) { |
aktk | 0:e85788b14028 | 128 | g_Serial_Signal.putc('>'); |
aktk | 0:e85788b14028 | 129 | _Sample_Set[i].dst = 0; |
aktk | 0:e85788b14028 | 130 | do { |
aktk | 0:e85788b14028 | 131 | sig = g_Serial_Signal.getc(); |
aktk | 0:e85788b14028 | 132 | if('0' <= sig && sig <= '9') { |
aktk | 0:e85788b14028 | 133 | _Sample_Set[i].dst = 10 * _Sample_Set[i].dst + sig - 48; |
aktk | 0:e85788b14028 | 134 | g_Serial_Signal.putc(char(sig)); |
aktk | 0:e85788b14028 | 135 | } else if(sig == 0x08) { |
aktk | 0:e85788b14028 | 136 | _Sample_Set[i].dst = 0; |
aktk | 0:e85788b14028 | 137 | g_Serial_Signal.printf("[canseled!]"); |
aktk | 0:e85788b14028 | 138 | g_Serial_Signal.putc('\n'); |
aktk | 0:e85788b14028 | 139 | g_Serial_Signal.putc('>'); |
aktk | 0:e85788b14028 | 140 | } |
aktk | 0:e85788b14028 | 141 | } while (!(sig == 0x0a || sig == 0x0d)); |
aktk | 0:e85788b14028 | 142 | g_Serial_Signal.putc('\n'); |
aktk | 0:e85788b14028 | 143 | } else { //_Data_Input_Type == SYSTEM |
aktk | 0:e85788b14028 | 144 | _Sample_Set[i].dst = g_Serial_Signal.getc(); |
aktk | 0:e85788b14028 | 145 | } |
aktk | 0:e85788b14028 | 146 | |
aktk | 0:e85788b14028 | 147 | // if input data is over the bound calibrate it below |
aktk | 0:e85788b14028 | 148 | if (_Sample_Set[i].dst < 0) |
aktk | 0:e85788b14028 | 149 | _Sample_Set[i].dst = 0; |
aktk | 0:e85788b14028 | 150 | else if (_ENUM < _Sample_Set[i].dst) |
aktk | 0:e85788b14028 | 151 | _Sample_Set[i].dst = _ENUM; |
aktk | 0:e85788b14028 | 152 | // |
aktk | 0:e85788b14028 | 153 | // Recieve a Voltage datus and store it into member |
aktk | 0:e85788b14028 | 154 | // |
aktk | 0:e85788b14028 | 155 | // LOW PASS FILTERED |
aktk | 0:e85788b14028 | 156 | // Get 10 data and store mean as a sample. |
aktk | 0:e85788b14028 | 157 | // After get one original sample, system waits for 0.1 sec, |
aktk | 0:e85788b14028 | 158 | // thus it takes 1 sec evry sampling. |
aktk | 0:e85788b14028 | 159 | _Sample_Set[i].vol = 0; |
aktk | 0:e85788b14028 | 160 | for(int j = 0; j < 10; j++) { |
aktk | 0:e85788b14028 | 161 | //unsigned short 's range [0 , 65535] |
aktk | 0:e85788b14028 | 162 | //the Number of significant figures of read voltage is 3 or 4. |
aktk | 0:e85788b14028 | 163 | tmp_vol = g_Sensor_Voltage.read_u16(); |
aktk | 0:e85788b14028 | 164 | #ifdef DEBUG |
aktk | 0:e85788b14028 | 165 | g_Serial_Signal.printf("%d,",tmp_vol); |
aktk | 0:e85788b14028 | 166 | #endif |
aktk | 0:e85788b14028 | 167 | _Sample_Set[i].vol += (tmp_vol / 10); |
aktk | 0:e85788b14028 | 168 | wait(0.1); |
aktk | 0:e85788b14028 | 169 | } |
aktk | 0:e85788b14028 | 170 | #ifdef DEBUG |
aktk | 0:e85788b14028 | 171 | g_Serial_Signal.printf("(%d)\n",_Sample_Set[i].vol); |
aktk | 0:e85788b14028 | 172 | #endif |
aktk | 0:e85788b14028 | 173 | } |
aktk | 0:e85788b14028 | 174 | // |
aktk | 0:e85788b14028 | 175 | // Sort set data array in distanceAscending order |
aktk | 0:e85788b14028 | 176 | // |
aktk | 0:e85788b14028 | 177 | // Bucket sort |
aktk | 0:e85788b14028 | 178 | for(int i = 0; i < _ENUM; i++) |
aktk | 0:e85788b14028 | 179 | tmp_set[i].dst = 0xaaaa; |
aktk | 0:e85788b14028 | 180 | tmp = 0; |
aktk | 0:e85788b14028 | 181 | for(int i = 0; i < _Sample_Num; i++) { |
aktk | 0:e85788b14028 | 182 | // use dst as index for dst range [2,20] |
aktk | 0:e85788b14028 | 183 | if (tmp_set[_Sample_Set[i].dst].dst == 0xaaaa) { |
aktk | 0:e85788b14028 | 184 | tmp_set[_Sample_Set[i].dst].dst = _Sample_Set[i].dst; |
aktk | 0:e85788b14028 | 185 | tmp_set[_Sample_Set[i].dst].vol = _Sample_Set[i].vol; |
aktk | 0:e85788b14028 | 186 | } else { // if a same dst has been input, calcurate mean. |
aktk | 0:e85788b14028 | 187 | tmp_set[_Sample_Set[i].dst].vol += _Sample_Set[i].vol; |
aktk | 0:e85788b14028 | 188 | tmp_set[_Sample_Set[i].dst].vol /= 2; |
aktk | 0:e85788b14028 | 189 | tmp++; |
aktk | 0:e85788b14028 | 190 | } |
aktk | 0:e85788b14028 | 191 | } |
aktk | 0:e85788b14028 | 192 | #ifdef DEBUG |
aktk | 0:e85788b14028 | 193 | g_Serial_Signal.printf("%d\n", _Sample_Num ); |
aktk | 0:e85788b14028 | 194 | #endif |
aktk | 0:e85788b14028 | 195 | // substruct tmp from number of sample. |
aktk | 0:e85788b14028 | 196 | _Sample_Num -= tmp; |
aktk | 0:e85788b14028 | 197 | |
aktk | 0:e85788b14028 | 198 | #ifdef DEBUG |
aktk | 0:e85788b14028 | 199 | g_Serial_Signal.printf("tmp: %d\n", tmp ); |
aktk | 0:e85788b14028 | 200 | #endif |
aktk | 0:e85788b14028 | 201 | // apply sort on _Sample_Set |
aktk | 0:e85788b14028 | 202 | tmp = 0; |
aktk | 0:e85788b14028 | 203 | for(int i = 0; i < _ENUM; i++) { |
aktk | 0:e85788b14028 | 204 | if(tmp_set[i].dst != 0xaaaa) { |
aktk | 0:e85788b14028 | 205 | _Sample_Set[i - tmp].dst = tmp_set[i].dst; |
aktk | 0:e85788b14028 | 206 | _Sample_Set[i - tmp].vol = tmp_set[i].vol; |
aktk | 0:e85788b14028 | 207 | } else // if no data, skip it |
aktk | 0:e85788b14028 | 208 | tmp++; |
aktk | 0:e85788b14028 | 209 | } |
aktk | 0:e85788b14028 | 210 | } |
aktk | 0:e85788b14028 | 211 | |
aktk | 0:e85788b14028 | 212 | // |
aktk | 0:e85788b14028 | 213 | // Function to define _u_spline, specific constants of spline. |
aktk | 0:e85788b14028 | 214 | // |
aktk | 0:e85788b14028 | 215 | void TRP105FS::_makeSpline() |
aktk | 0:e85788b14028 | 216 | { |
aktk | 0:e85788b14028 | 217 | // x: dst, distance |
aktk | 0:e85788b14028 | 218 | // y: vol, voltage |
aktk | 0:e85788b14028 | 219 | // |
aktk | 0:e85788b14028 | 220 | // N: max of index <=> (_Sample_Num - 1) |
aktk | 0:e85788b14028 | 221 | // |
aktk | 0:e85788b14028 | 222 | // _u_spline[i] === d^2/dx^2(Spline f)[i] |
aktk | 0:e85788b14028 | 223 | // i:[0,N] |
aktk | 0:e85788b14028 | 224 | // _u_spline[0] = _u_spline[N] = 0 |
aktk | 0:e85788b14028 | 225 | // |
aktk | 0:e85788b14028 | 226 | // h[i] = x[i+1] - x[i] |
aktk | 0:e85788b14028 | 227 | // i:[0,N-1]; num of elm: N<=>_Sample_Num - 1 |
aktk | 0:e85788b14028 | 228 | double *h = (double*)malloc((_Sample_Num - 1) * sizeof(double)); |
aktk | 0:e85788b14028 | 229 | //unsigned short *h __attribute__((at(0x20080000))); |
aktk | 0:e85788b14028 | 230 | //h = (unsigned short*)malloc((_Sample_Num - 1) * sizeof(unsigned short)); |
aktk | 0:e85788b14028 | 231 | // v[i] = 6*((y[i+2]-y[i+1])/h[i+1] + (y[i+1]-y[i])/h[i]) |
aktk | 0:e85788b14028 | 232 | // i:[0,N-2] |
aktk | 0:e85788b14028 | 233 | double *v = (double*)malloc((_Sample_Num - 2) * sizeof(double)); |
aktk | 0:e85788b14028 | 234 | //unsigned short *v __attribute__((at(0x20080100))); |
aktk | 0:e85788b14028 | 235 | //v = (unsigned short*)malloc((_Sample_Num - 2) * sizeof(unsigned short)); |
aktk | 0:e85788b14028 | 236 | // temporary array whose num of elm equals v array |
aktk | 0:e85788b14028 | 237 | double *w = (double*)malloc((_Sample_Num - 2) * sizeof(double)); |
aktk | 0:e85788b14028 | 238 | //unsigned short *w __attribute__((at(0x20080200))); |
aktk | 0:e85788b14028 | 239 | //w = (unsigned short*)malloc((_Sample_Num - 2) * sizeof(unsigned short)); |
aktk | 0:e85788b14028 | 240 | // |
aktk | 0:e85788b14028 | 241 | // [ 2(h[0]+h[1]) , h[1] , O ] [_u[1] ] [v[0] ] |
aktk | 0:e85788b14028 | 242 | // [ h[1] , 2(h[1]+h[2]) , h[2] ] [_u[2] ] [v[1] ] |
aktk | 0:e85788b14028 | 243 | // [ ... ] * [... ] = [... ] |
aktk | 0:e85788b14028 | 244 | // [ h[j] , 2(h[j]+h[j+1]) , h[j+1] ] [_u[j+1]] [v[j] ] |
aktk | 0:e85788b14028 | 245 | // [ ... ] [ ... ] [ ... ] |
aktk | 0:e85788b14028 | 246 | // [ h[N-3] , 2(h[N-3]+h[N-2]), h[N-2] ] [_u[j+1]] [v[j] ] |
aktk | 0:e85788b14028 | 247 | // [ O h[N-2] , 2(h[N-2]+h[N-1]) ] [_u[N-1]] [v[N-2]] |
aktk | 0:e85788b14028 | 248 | // |
aktk | 0:e85788b14028 | 249 | // For LU decomposition |
aktk | 0:e85788b14028 | 250 | double *Upper = (double*)malloc((_Sample_Num - 2) * sizeof(double)); |
aktk | 0:e85788b14028 | 251 | //unsigned short *Upper __attribute__((at(0x20080300))); |
aktk | 0:e85788b14028 | 252 | //Upper = (unsigned short*)malloc((_Sample_Num - 2) * sizeof(unsigned short)); |
aktk | 0:e85788b14028 | 253 | double *Lower = (double*)malloc((_Sample_Num - 2) * sizeof(double)); |
aktk | 0:e85788b14028 | 254 | //unsigned short *Lower __attribute__((at(0x20080400))); |
aktk | 0:e85788b14028 | 255 | //Lower = (unsigned short*)malloc((_Sample_Num - 2) * sizeof(unsigned short)); |
aktk | 0:e85788b14028 | 256 | #ifdef DEBUG |
aktk | 0:e85788b14028 | 257 | _printOutData(_Sample_Set, _Sample_Num, "\nSampleSet"); |
aktk | 0:e85788b14028 | 258 | #endif |
aktk | 0:e85788b14028 | 259 | for(int i = 0; i < _Sample_Num - 1; i++) |
aktk | 0:e85788b14028 | 260 | h[i] = (double)(_Sample_Set[i + 1].dst - _Sample_Set[i].dst); |
aktk | 0:e85788b14028 | 261 | //(unsigned short)(_Sample_Set[i + 1].dst - _Sample_Set[i].dst); |
aktk | 0:e85788b14028 | 262 | |
aktk | 0:e85788b14028 | 263 | for(int i = 0; i < _Sample_Num - 2; i++) |
aktk | 0:e85788b14028 | 264 | v[i] = 6 * ( |
aktk | 0:e85788b14028 | 265 | ((double)(_Sample_Set[i + 2].vol - _Sample_Set[i + 1].vol)) / h[i + 1] |
aktk | 0:e85788b14028 | 266 | //(unsigned short)(_Sample_Set[i + 2].vol - _Sample_Set[i + 1].vol) / h[i + 1] |
aktk | 0:e85788b14028 | 267 | - |
aktk | 0:e85788b14028 | 268 | ((double)(_Sample_Set[i + 1].vol - _Sample_Set[i].vol)) / h[i] |
aktk | 0:e85788b14028 | 269 | //(unsigned short)(_Sample_Set[i + 1].vol - _Sample_Set[i].vol) / h[i] |
aktk | 0:e85788b14028 | 270 | ); |
aktk | 0:e85788b14028 | 271 | |
aktk | 0:e85788b14028 | 272 | // |
aktk | 0:e85788b14028 | 273 | // LU decomposition |
aktk | 0:e85788b14028 | 274 | // |
aktk | 0:e85788b14028 | 275 | Upper[0] = 2 * (h[0] + h[1]); |
aktk | 0:e85788b14028 | 276 | Lower[0] = 0; |
aktk | 0:e85788b14028 | 277 | for (int i = 1; i < _Sample_Num - 2; i++) { |
aktk | 0:e85788b14028 | 278 | Lower[i] = h[i] / Upper[i - 1]; |
aktk | 0:e85788b14028 | 279 | Upper[i] = 2 * (h[i] + h[i + 1]) - Lower[i] * h[i]; |
aktk | 0:e85788b14028 | 280 | } |
aktk | 0:e85788b14028 | 281 | |
aktk | 0:e85788b14028 | 282 | |
aktk | 0:e85788b14028 | 283 | // |
aktk | 0:e85788b14028 | 284 | // forward substitution |
aktk | 0:e85788b14028 | 285 | // |
aktk | 0:e85788b14028 | 286 | w[0] = v[0]; |
aktk | 0:e85788b14028 | 287 | for (int i = 1; i < _Sample_Num - 2; i ++) { |
aktk | 0:e85788b14028 | 288 | w[i] = v[i] - Lower[i] * w[i-1]; |
aktk | 0:e85788b14028 | 289 | } |
aktk | 0:e85788b14028 | 290 | |
aktk | 0:e85788b14028 | 291 | |
aktk | 0:e85788b14028 | 292 | // |
aktk | 0:e85788b14028 | 293 | // backward substitution |
aktk | 0:e85788b14028 | 294 | // |
aktk | 0:e85788b14028 | 295 | _u_spline[_Sample_Num - 2] = w[_Sample_Num - 3] / Upper[_Sample_Num - 3]; |
aktk | 0:e85788b14028 | 296 | for(int i = _Sample_Num - 3; i > 0; i--) { |
aktk | 0:e85788b14028 | 297 | _u_spline[i] = (w[(i - 1)] - h[(i)] * _u_spline[(i) + 1]) / Upper[(i - 1)]; |
aktk | 0:e85788b14028 | 298 | } |
aktk | 0:e85788b14028 | 299 | |
aktk | 0:e85788b14028 | 300 | // _u_spline[i] === d^2/dx^2(Spline f)[i] |
aktk | 0:e85788b14028 | 301 | _u_spline[0] = _u_spline[_Sample_Num - 1] = 0.0; |
aktk | 0:e85788b14028 | 302 | |
aktk | 0:e85788b14028 | 303 | #ifdef DEBUG |
aktk | 0:e85788b14028 | 304 | _printOutData(h, _Sample_Num - 1, "h"); |
aktk | 0:e85788b14028 | 305 | _printOutData(v, _Sample_Num - 2, "v"); |
aktk | 0:e85788b14028 | 306 | _printOutData(w, _Sample_Num - 2, "w"); |
aktk | 0:e85788b14028 | 307 | _printOutData(Upper, _Sample_Num - 2, "Upper"); |
aktk | 0:e85788b14028 | 308 | _printOutData(Lower, _Sample_Num - 2, "Lower"); |
aktk | 0:e85788b14028 | 309 | _printOutData(_u_spline, _Sample_Num, "u"); |
aktk | 0:e85788b14028 | 310 | #endif |
aktk | 0:e85788b14028 | 311 | free(h); |
aktk | 0:e85788b14028 | 312 | free(v); |
aktk | 0:e85788b14028 | 313 | free(w); |
aktk | 0:e85788b14028 | 314 | free(Upper); |
aktk | 0:e85788b14028 | 315 | free(Lower); |
aktk | 0:e85788b14028 | 316 | } |
aktk | 0:e85788b14028 | 317 | // |
aktk | 0:e85788b14028 | 318 | // Function to return Voltage for distance. |
aktk | 0:e85788b14028 | 319 | // |
aktk | 0:e85788b14028 | 320 | unsigned short TRP105FS:: _getSplineYof( |
aktk | 0:e85788b14028 | 321 | double arg_x // the argument is supposed as distance [mm] |
aktk | 0:e85788b14028 | 322 | ) |
aktk | 0:e85788b14028 | 323 | { |
aktk | 0:e85788b14028 | 324 | double y; // voltage calculated by spline polynomial |
aktk | 0:e85788b14028 | 325 | double a,b,c,d; // which is specific constant of spline, and can be expressed with _u. |
aktk | 0:e85788b14028 | 326 | int itv = 0; // interval(section) of interpolation |
aktk | 0:e85788b14028 | 327 | // the number of interval is less 1 than the number of sample sets, |
aktk | 0:e85788b14028 | 328 | // which means the max number of interval is _Sample_num - 2. |
aktk | 0:e85788b14028 | 329 | if((double)(_Sample_Set[0].dst) <= arg_x) { |
aktk | 0:e85788b14028 | 330 | while (!((double)(_Sample_Set[itv].dst) <= arg_x && arg_x < (double)(_Sample_Set[itv + 1].dst))) { |
aktk | 0:e85788b14028 | 331 | itv++; |
aktk | 0:e85788b14028 | 332 | if(itv > _Sample_Num - 2) { |
aktk | 0:e85788b14028 | 333 | itv = _Sample_Num - 2; |
aktk | 0:e85788b14028 | 334 | break; |
aktk | 0:e85788b14028 | 335 | } |
aktk | 0:e85788b14028 | 336 | } |
aktk | 0:e85788b14028 | 337 | } |
aktk | 0:e85788b14028 | 338 | a = (double)(_u_spline[itv + 1] - _u_spline[itv]) / 6.0 / (double)(_Sample_Set[itv + 1].dst - _Sample_Set[itv].dst); |
aktk | 0:e85788b14028 | 339 | b = (double)(_u_spline[itv]) / 2.0; |
aktk | 0:e85788b14028 | 340 | c = (double)(_Sample_Set[itv + 1].vol - _Sample_Set[itv].vol) / (double)(_Sample_Set[itv + 1].dst - _Sample_Set[itv].dst) |
aktk | 0:e85788b14028 | 341 | - |
aktk | 0:e85788b14028 | 342 | (double)(_Sample_Set[itv + 1].dst - _Sample_Set[itv].dst) * (double)(_u_spline[itv + 1] + 2.0 * _u_spline[itv]) / 6.0; |
aktk | 0:e85788b14028 | 343 | d = (double)(_Sample_Set[itv].vol); |
aktk | 0:e85788b14028 | 344 | // cubic spline expression |
aktk | 0:e85788b14028 | 345 | y = a * (arg_x - (double)(_Sample_Set[itv].dst)) * (arg_x - (double)(_Sample_Set[itv].dst)) * (arg_x - (double)(_Sample_Set[itv].dst)) |
aktk | 0:e85788b14028 | 346 | + |
aktk | 0:e85788b14028 | 347 | b * (arg_x - (double)(_Sample_Set[itv].dst)) * (arg_x - (double)(_Sample_Set[itv].dst)) |
aktk | 0:e85788b14028 | 348 | + |
aktk | 0:e85788b14028 | 349 | c * (arg_x - (double)(_Sample_Set[itv].dst)) |
aktk | 0:e85788b14028 | 350 | + |
aktk | 0:e85788b14028 | 351 | d; |
aktk | 0:e85788b14028 | 352 | |
aktk | 0:e85788b14028 | 353 | #ifdef DEBUG2 |
aktk | 0:e85788b14028 | 354 | g_Serial_Signal.printf("%f(interval: %d)", arg_x, itv); |
aktk | 0:e85788b14028 | 355 | g_Serial_Signal.printf("a:%f, b:%f, c:%f, d:%f, ", a,b,c,d); |
aktk | 0:e85788b14028 | 356 | g_Serial_Signal.printf("(y:%f -> %d)\n", y, (unsigned short)y); |
aktk | 0:e85788b14028 | 357 | #endif |
aktk | 0:e85788b14028 | 358 | |
aktk | 0:e85788b14028 | 359 | return ((unsigned short)(int)y); |
aktk | 0:e85788b14028 | 360 | } |
aktk | 0:e85788b14028 | 361 | |
aktk | 0:e85788b14028 | 362 | void TRP105FS::calibrateSensor() |
aktk | 0:e85788b14028 | 363 | { |
aktk | 0:e85788b14028 | 364 | _sampleData(); |
aktk | 0:e85788b14028 | 365 | _makeSpline(); |
aktk | 0:e85788b14028 | 366 | |
aktk | 0:e85788b14028 | 367 | for(int i = 0; i < _ENUM; i++) { |
aktk | 0:e85788b14028 | 368 | _Set[i].dst = i; |
aktk | 0:e85788b14028 | 369 | _Set[i].vol = _getSplineYof((double)(_Set[i].dst)); |
aktk | 0:e85788b14028 | 370 | _Threshold[i] = _getSplineYof((double)(_Set[i].dst) + 0.5); |
aktk | 0:e85788b14028 | 371 | #ifdef DEBUG2 |
aktk | 0:e85788b14028 | 372 | g_Serial_Signal.printf("(get...threashold:%d)\n", _Threshold[i]); |
aktk | 0:e85788b14028 | 373 | #endif |
aktk | 0:e85788b14028 | 374 | } |
aktk | 0:e85788b14028 | 375 | } |
aktk | 0:e85788b14028 | 376 | |
aktk | 0:e85788b14028 | 377 | void TRP105FS::saveSetting() |
aktk | 0:e85788b14028 | 378 | { |
aktk | 0:e85788b14028 | 379 | FILE *fp; |
aktk | 0:e85788b14028 | 380 | |
aktk | 0:e85788b14028 | 381 | fp = fopen("/local/savedata.log", "wb"); |
aktk | 0:e85788b14028 | 382 | |
aktk | 0:e85788b14028 | 383 | for(int i = 0; i < _ENUM; i++) { |
aktk | 0:e85788b14028 | 384 | fwrite(&_Set[i].dst, sizeof(unsigned short), 1, fp); |
aktk | 0:e85788b14028 | 385 | fputc(0x2c, fp); |
aktk | 0:e85788b14028 | 386 | fwrite(&_Set[i].vol, sizeof(unsigned short), 1, fp); |
aktk | 0:e85788b14028 | 387 | fputc(0x2c, fp); |
aktk | 0:e85788b14028 | 388 | fwrite(&_Threshold[i], sizeof(unsigned short), 1, fp); |
aktk | 0:e85788b14028 | 389 | fputc(0x3b, fp); |
aktk | 0:e85788b14028 | 390 | } |
aktk | 0:e85788b14028 | 391 | fwrite(&_Sample_Num, sizeof(int), 1, fp); |
aktk | 0:e85788b14028 | 392 | fputc(0x3b, fp); |
aktk | 0:e85788b14028 | 393 | for(int i = 0; i < _Sample_Num; i++) { |
aktk | 0:e85788b14028 | 394 | fwrite(&_Sample_Set[i].dst, sizeof(unsigned short), 1, fp); |
aktk | 0:e85788b14028 | 395 | fputc(0x2c, fp); |
aktk | 0:e85788b14028 | 396 | fwrite(&_Sample_Set[i].vol, sizeof(unsigned short), 1, fp); |
aktk | 0:e85788b14028 | 397 | fputc(0x3b, fp); |
aktk | 0:e85788b14028 | 398 | } |
aktk | 0:e85788b14028 | 399 | fclose(fp); |
aktk | 0:e85788b14028 | 400 | |
aktk | 0:e85788b14028 | 401 | } |
aktk | 0:e85788b14028 | 402 | |
aktk | 0:e85788b14028 | 403 | void TRP105FS::printThresholds() |
aktk | 0:e85788b14028 | 404 | { |
aktk | 0:e85788b14028 | 405 | for(int i = 0; i < _ENUM; i++) |
aktk | 0:e85788b14028 | 406 | g_Serial_Signal.printf("Threshold[%d]%d\n",i,_Threshold[i]); |
aktk | 0:e85788b14028 | 407 | } |
aktk | 0:e85788b14028 | 408 | void TRP105FS::loadSetting() |
aktk | 0:e85788b14028 | 409 | { |
aktk | 0:e85788b14028 | 410 | FILE *fp; |
aktk | 0:e85788b14028 | 411 | char tmp; |
aktk | 0:e85788b14028 | 412 | |
aktk | 0:e85788b14028 | 413 | //sprintf(filepath, "/local/%s", filename); |
aktk | 0:e85788b14028 | 414 | //fp = fopen(filepath, "rb"); |
aktk | 0:e85788b14028 | 415 | fp = fopen("/local/savedata.log", "rb"); |
aktk | 0:e85788b14028 | 416 | for(int i = 0; i < _ENUM; i++) { |
aktk | 0:e85788b14028 | 417 | |
aktk | 0:e85788b14028 | 418 | fread(&_Set[i].dst, sizeof(unsigned short), 1, fp); |
aktk | 0:e85788b14028 | 419 | fread(&tmp, sizeof(char), 1, fp); |
aktk | 0:e85788b14028 | 420 | #ifdef DEBUG2 |
aktk | 0:e85788b14028 | 421 | g_Serial_Signal.printf("%d%c", _Set[i].dst, tmp); |
aktk | 0:e85788b14028 | 422 | #endif |
aktk | 0:e85788b14028 | 423 | |
aktk | 0:e85788b14028 | 424 | fread(&_Set[i].vol, sizeof(unsigned short), 1, fp); |
aktk | 0:e85788b14028 | 425 | fread(&tmp, sizeof(char), 1, fp); |
aktk | 0:e85788b14028 | 426 | #ifdef DEBUG2 |
aktk | 0:e85788b14028 | 427 | g_Serial_Signal.printf("%d%c", _Set[i].vol, tmp); |
aktk | 0:e85788b14028 | 428 | #endif |
aktk | 0:e85788b14028 | 429 | |
aktk | 0:e85788b14028 | 430 | fread(&_Threshold[i], sizeof(unsigned short), 1, fp); |
aktk | 0:e85788b14028 | 431 | fread(&tmp, sizeof(char), 1, fp); |
aktk | 0:e85788b14028 | 432 | #ifdef DEBUG2 |
aktk | 0:e85788b14028 | 433 | g_Serial_Signal.printf("%d%c\n",_Threshold[i], tmp); |
aktk | 0:e85788b14028 | 434 | #endif |
aktk | 0:e85788b14028 | 435 | } |
aktk | 0:e85788b14028 | 436 | |
aktk | 0:e85788b14028 | 437 | fread(&_Sample_Num, sizeof(unsigned short), 1, fp); |
aktk | 0:e85788b14028 | 438 | fread(&tmp, sizeof(char), 1, fp); |
aktk | 0:e85788b14028 | 439 | |
aktk | 0:e85788b14028 | 440 | for(int i = 0; i < _Sample_Num; i++) { |
aktk | 0:e85788b14028 | 441 | fread(&_Sample_Set[i].dst, sizeof(unsigned short), 1, fp); |
aktk | 0:e85788b14028 | 442 | fread(&tmp, sizeof(char),1,fp); |
aktk | 0:e85788b14028 | 443 | fread(&_Sample_Set[i].vol, sizeof(unsigned short), 1, fp); |
aktk | 0:e85788b14028 | 444 | fread(&tmp, sizeof(char),1,fp); |
aktk | 0:e85788b14028 | 445 | } |
aktk | 0:e85788b14028 | 446 | fclose(fp); |
aktk | 0:e85788b14028 | 447 | } |
aktk | 0:e85788b14028 | 448 | |
aktk | 0:e85788b14028 | 449 | |
aktk | 0:e85788b14028 | 450 | void TRP105FS::saveSetting( |
aktk | 0:e85788b14028 | 451 | const char *filename |
aktk | 0:e85788b14028 | 452 | ) |
aktk | 0:e85788b14028 | 453 | { |
aktk | 0:e85788b14028 | 454 | FILE *fp; |
aktk | 0:e85788b14028 | 455 | char *filepath; |
aktk | 0:e85788b14028 | 456 | int fnnum = 0; |
aktk | 0:e85788b14028 | 457 | |
aktk | 0:e85788b14028 | 458 | while (filename[fnnum] != 0) fnnum++; |
aktk | 0:e85788b14028 | 459 | filepath = (char *)malloc((fnnum + 8) * sizeof(char)); // "/local/" are 7 char and \0 is 1 char. |
aktk | 0:e85788b14028 | 460 | |
aktk | 0:e85788b14028 | 461 | sprintf(filepath, "/local/%s", filename); |
aktk | 0:e85788b14028 | 462 | fp = fopen(filepath, "wb"); |
aktk | 0:e85788b14028 | 463 | |
aktk | 0:e85788b14028 | 464 | for(int i = 0; i < _ENUM; i++) { |
aktk | 0:e85788b14028 | 465 | fwrite(&_Set[i].dst, sizeof(unsigned short), 1, fp); |
aktk | 0:e85788b14028 | 466 | fputc(0x2c, fp); |
aktk | 0:e85788b14028 | 467 | fwrite(&_Set[i].vol, sizeof(unsigned short), 1, fp); |
aktk | 0:e85788b14028 | 468 | fputc(0x2c, fp); |
aktk | 0:e85788b14028 | 469 | fwrite(&_Threshold[i], sizeof(unsigned short), 1, fp); |
aktk | 0:e85788b14028 | 470 | fputc(0x3b, fp); |
aktk | 0:e85788b14028 | 471 | } |
aktk | 0:e85788b14028 | 472 | fwrite(&_Sample_Num, sizeof(int), 1, fp); |
aktk | 0:e85788b14028 | 473 | fputc(0x3b, fp); |
aktk | 0:e85788b14028 | 474 | for(int i = 0; i < _Sample_Num; i++) { |
aktk | 0:e85788b14028 | 475 | fwrite(&_Sample_Set[i].dst, sizeof(unsigned short), 1, fp); |
aktk | 0:e85788b14028 | 476 | fputc(0x2c, fp); |
aktk | 0:e85788b14028 | 477 | fwrite(&_Sample_Set[i].vol, sizeof(unsigned short), 1, fp); |
aktk | 0:e85788b14028 | 478 | fputc(0x3b, fp); |
aktk | 0:e85788b14028 | 479 | } |
aktk | 0:e85788b14028 | 480 | fclose(fp); |
aktk | 0:e85788b14028 | 481 | free(filepath); |
aktk | 0:e85788b14028 | 482 | } |
aktk | 0:e85788b14028 | 483 | |
aktk | 0:e85788b14028 | 484 | void TRP105FS::loadSetting( |
aktk | 0:e85788b14028 | 485 | const char *filename |
aktk | 0:e85788b14028 | 486 | ) |
aktk | 0:e85788b14028 | 487 | { |
aktk | 0:e85788b14028 | 488 | FILE *fp; |
aktk | 0:e85788b14028 | 489 | char *filepath; |
aktk | 0:e85788b14028 | 490 | char tmp; |
aktk | 0:e85788b14028 | 491 | int fnnum = 0; |
aktk | 0:e85788b14028 | 492 | |
aktk | 0:e85788b14028 | 493 | while (filename[fnnum] != 0) fnnum++; |
aktk | 0:e85788b14028 | 494 | filepath = (char *)malloc((fnnum + 8) * sizeof(char)); // "/local/" are 7 char and \0 is 1 char. |
aktk | 0:e85788b14028 | 495 | |
aktk | 0:e85788b14028 | 496 | sprintf(filepath, "/local/%s", filename); |
aktk | 0:e85788b14028 | 497 | fp = fopen(filepath, "rb"); |
aktk | 0:e85788b14028 | 498 | for(int i = 0; i < _ENUM; i++) { |
aktk | 0:e85788b14028 | 499 | |
aktk | 0:e85788b14028 | 500 | fread(&_Set[i].dst, sizeof(unsigned short), 1, fp); |
aktk | 0:e85788b14028 | 501 | fread(&tmp, sizeof(char), 1, fp); |
aktk | 0:e85788b14028 | 502 | #ifdef DEBUG3 |
aktk | 0:e85788b14028 | 503 | g_Serial_Signal.printf("%d%c", _Set[i].dst, tmp); |
aktk | 0:e85788b14028 | 504 | #endif |
aktk | 0:e85788b14028 | 505 | |
aktk | 0:e85788b14028 | 506 | fread(&_Set[i].vol, sizeof(unsigned short), 1, fp); |
aktk | 0:e85788b14028 | 507 | fread(&tmp, sizeof(char), 1, fp); |
aktk | 0:e85788b14028 | 508 | #ifdef DEBUG3 |
aktk | 0:e85788b14028 | 509 | g_Serial_Signal.printf("%d%c", _Set[i].vol, tmp); |
aktk | 0:e85788b14028 | 510 | #endif |
aktk | 0:e85788b14028 | 511 | |
aktk | 0:e85788b14028 | 512 | fread(&_Threshold[i], sizeof(unsigned short), 1, fp); |
aktk | 0:e85788b14028 | 513 | fread(&tmp, sizeof(char), 1, fp); |
aktk | 0:e85788b14028 | 514 | #ifdef DEBUG3 |
aktk | 0:e85788b14028 | 515 | g_Serial_Signal.printf("%d%c\n",_Threshold[i], tmp); |
aktk | 0:e85788b14028 | 516 | #endif |
aktk | 0:e85788b14028 | 517 | } |
aktk | 0:e85788b14028 | 518 | |
aktk | 0:e85788b14028 | 519 | fread(&_Sample_Num, sizeof(unsigned short), 1, fp); |
aktk | 0:e85788b14028 | 520 | fread(&tmp, sizeof(char), 1, fp); |
aktk | 0:e85788b14028 | 521 | #ifdef DEBUG3 |
aktk | 0:e85788b14028 | 522 | g_Serial_Signal.printf("%d%c\n",_Sample_Num, tmp); |
aktk | 0:e85788b14028 | 523 | #endif |
aktk | 0:e85788b14028 | 524 | |
aktk | 0:e85788b14028 | 525 | for(int i = 0; i < _Sample_Num; i++) { |
aktk | 0:e85788b14028 | 526 | fread(&_Sample_Set[i].dst, sizeof(unsigned short), 1, fp); |
aktk | 0:e85788b14028 | 527 | fread(&tmp, sizeof(char),1,fp); |
aktk | 0:e85788b14028 | 528 | #ifdef DEBUG3 |
aktk | 0:e85788b14028 | 529 | g_Serial_Signal.printf("%d%c", _Sample_Set[i].dst, tmp); |
aktk | 0:e85788b14028 | 530 | #endif |
aktk | 0:e85788b14028 | 531 | |
aktk | 0:e85788b14028 | 532 | fread(&_Sample_Set[i].vol, sizeof(unsigned short), 1, fp); |
aktk | 0:e85788b14028 | 533 | fread(&tmp, sizeof(char),1,fp); |
aktk | 0:e85788b14028 | 534 | #ifdef DEBUG3 |
aktk | 0:e85788b14028 | 535 | g_Serial_Signal.printf("%d%c", _Sample_Set[i].vol, tmp); |
aktk | 0:e85788b14028 | 536 | #endif |
aktk | 0:e85788b14028 | 537 | } |
aktk | 0:e85788b14028 | 538 | fclose(fp); |
aktk | 0:e85788b14028 | 539 | free(filepath); |
aktk | 0:e85788b14028 | 540 | } |
aktk | 0:e85788b14028 | 541 | |
aktk | 0:e85788b14028 | 542 | void TRP105FS::printOutData() |
aktk | 0:e85788b14028 | 543 | { |
aktk | 0:e85788b14028 | 544 | FILE *fp; |
aktk | 0:e85788b14028 | 545 | |
aktk | 0:e85788b14028 | 546 | fp = fopen("/local/log.txt", "w"); // open file in writing mode |
aktk | 0:e85788b14028 | 547 | fprintf(fp, "dst, vol,(threshold)\n"); |
aktk | 0:e85788b14028 | 548 | for(int i = 0; i < _ENUM; i++) { |
aktk | 0:e85788b14028 | 549 | fprintf(fp, "%d,%d,(%d)\n", _Set[i].dst, _Set[i].vol, _Threshold[i]); |
aktk | 0:e85788b14028 | 550 | } |
aktk | 0:e85788b14028 | 551 | fprintf(fp, "\nSample:dst, vol\n"); |
aktk | 0:e85788b14028 | 552 | for(int i = 0; i < _Sample_Num; i++) { |
aktk | 0:e85788b14028 | 553 | fprintf(fp, "%d,%d\n", _Sample_Set[i].dst, _Sample_Set[i].vol); |
aktk | 0:e85788b14028 | 554 | } |
aktk | 0:e85788b14028 | 555 | fclose(fp); |
aktk | 0:e85788b14028 | 556 | |
aktk | 0:e85788b14028 | 557 | } |
aktk | 0:e85788b14028 | 558 | void TRP105FS::_printOutData(unsigned short *arg, int num, char* name) |
aktk | 0:e85788b14028 | 559 | { |
aktk | 0:e85788b14028 | 560 | FILE *fp; |
aktk | 0:e85788b14028 | 561 | fp = fopen("/local/varlog.txt", "a"); // open file in add mode |
aktk | 0:e85788b14028 | 562 | fprintf(fp, "%10s\n", name); |
aktk | 0:e85788b14028 | 563 | for(int i = 0; i < num; i++) { |
aktk | 0:e85788b14028 | 564 | fprintf(fp, "%d, ", arg[i]); |
aktk | 0:e85788b14028 | 565 | } |
aktk | 0:e85788b14028 | 566 | fprintf(fp, "\n"); |
aktk | 0:e85788b14028 | 567 | fclose(fp); |
aktk | 0:e85788b14028 | 568 | } |
aktk | 0:e85788b14028 | 569 | void TRP105FS::_printOutData(double *arg, int num, char* name) |
aktk | 0:e85788b14028 | 570 | { |
aktk | 0:e85788b14028 | 571 | FILE *fp; |
aktk | 0:e85788b14028 | 572 | |
aktk | 0:e85788b14028 | 573 | fp = fopen("/local/varlog.txt", "a"); // open file in add mode |
aktk | 0:e85788b14028 | 574 | fprintf(fp, "%10s\n", name); |
aktk | 0:e85788b14028 | 575 | for(int i = 0; i < num; i++) { |
aktk | 0:e85788b14028 | 576 | fprintf(fp, "%.2f, ", arg[i]); |
aktk | 0:e85788b14028 | 577 | } |
aktk | 0:e85788b14028 | 578 | fprintf(fp, "\n"); |
aktk | 0:e85788b14028 | 579 | fclose(fp); |
aktk | 0:e85788b14028 | 580 | } |
aktk | 0:e85788b14028 | 581 | void TRP105FS::_printOutData(VDset *arg, int num, char* name) |
aktk | 0:e85788b14028 | 582 | { |
aktk | 0:e85788b14028 | 583 | FILE *fp; |
aktk | 0:e85788b14028 | 584 | |
aktk | 0:e85788b14028 | 585 | fp = fopen("/local/varlog.txt", "a"); // open file in add mode |
aktk | 0:e85788b14028 | 586 | fprintf(fp, "%10s\n", name); |
aktk | 0:e85788b14028 | 587 | for(int i = 0; i < num; i++) { |
aktk | 0:e85788b14028 | 588 | fprintf(fp, "%d, ", arg[i].vol); |
aktk | 0:e85788b14028 | 589 | } |
aktk | 0:e85788b14028 | 590 | fprintf(fp, "\n"); |
aktk | 0:e85788b14028 | 591 | fclose(fp); |
aktk | 0:e85788b14028 | 592 | } |