for child

Fork of TRP105F_Spline by Akifumi Takahashi

Committer:
tanaken0605
Date:
Tue Oct 24 00:44:39 2017 +0000
Revision:
27:1f38ee841153
Parent:
23:772a9736ee59
?????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
aktk 0:e85788b14028 1 #include "TRP105F_Spline.h"
aktk 0:e85788b14028 2
aktk 11:d60fb729eacf 3 //
aktk 11:d60fb729eacf 4 // For Platform Variation
aktk 11:d60fb729eacf 5 //
aktk 11:d60fb729eacf 6 #if defined(TARGET_LPC1114)
aktk 11:d60fb729eacf 7 const PinName DEFALT_AI_PIN = dp4;
aktk 11:d60fb729eacf 8 #elif defined (TARGET_LPC1768)
aktk 11:d60fb729eacf 9 const PinName DEFALT_AI_PIN = p16;
aktk 11:d60fb729eacf 10 LocalFileSystem local("local"); // define Mount Point(which becomes Direcory Path)
aktk 11:d60fb729eacf 11 // To get sample distance via seral com
aktk 11:d60fb729eacf 12 Serial g_Serial_Signal(USBTX, USBRX);
aktk 3:b56e933bebc2 13 // To get ytage of TRP105F
aktk 9:ec1ee4a6b6a4 14 //AnalogIn* g_Sensor_Voltage;
aktk 11:d60fb729eacf 15 #endif
aktk 11:d60fb729eacf 16
aktk 11:d60fb729eacf 17
aktk 0:e85788b14028 18
aktk 11:d60fb729eacf 19 //
aktk 11:d60fb729eacf 20 // For debug
aktk 11:d60fb729eacf 21 //
aktk 11:d60fb729eacf 22 //#define DEBUG
aktk 11:d60fb729eacf 23 //#define DEBUG2
aktk 14:a99bf22b919d 24 //#define DEBUG3
aktk 0:e85788b14028 25 #ifdef DEBUG
aktk 0:e85788b14028 26 DigitalOut led1(LED1);
aktk 0:e85788b14028 27 DigitalOut led2(LED2);
aktk 0:e85788b14028 28 DigitalOut led3(LED3);
aktk 0:e85788b14028 29 DigitalOut led4(LED4);
aktk 0:e85788b14028 30 #endif
aktk 0:e85788b14028 31
aktk 3:b56e933bebc2 32 // Constructor
aktk 0:e85788b14028 33 TRP105FS::TRP105FS()
aktk 3:b56e933bebc2 34 :_useType(AsMODULE)
aktk 9:ec1ee4a6b6a4 35 ,_ai(AnalogIn(DEFALT_AI_PIN))
aktk 0:e85788b14028 36 {
aktk 20:0453919a76b2 37 _snum = 0;
aktk 0:e85788b14028 38 _Sample_Num = 5;
aktk 0:e85788b14028 39 _Sample_Set = (VDset *)malloc(_Sample_Num * sizeof(VDset));
aktk 0:e85788b14028 40 _u_spline = (double*)malloc(_Sample_Num * sizeof(double));
aktk 4:701f958d137a 41
aktk 4:701f958d137a 42 for(int i = 0; i < _Sample_Num; i++) {
aktk 4:701f958d137a 43 _Sample_Set[i].x = _Sample_Set[i].y = 0;
aktk 4:701f958d137a 44 _u_spline[i] = 0.0;
aktk 4:701f958d137a 45 }
aktk 0:e85788b14028 46 }
aktk 0:e85788b14028 47
aktk 0:e85788b14028 48 TRP105FS::TRP105FS(
aktk 18:b046bba4ffa7 49 unsigned short arg_num
aktk 0:e85788b14028 50 )
aktk 3:b56e933bebc2 51 :_useType(AsMODULE)
aktk 9:ec1ee4a6b6a4 52 ,_ai(AnalogIn(DEFALT_AI_PIN))
aktk 3:b56e933bebc2 53 {
aktk 20:0453919a76b2 54 _snum = 0;
aktk 3:b56e933bebc2 55 if(arg_num > _ENUM) _Sample_Num = _ENUM;
aktk 3:b56e933bebc2 56 else _Sample_Num = arg_num;
aktk 3:b56e933bebc2 57
aktk 3:b56e933bebc2 58 _Sample_Set = (VDset *)malloc(_Sample_Num * sizeof(VDset));
aktk 3:b56e933bebc2 59 _u_spline = (double*)malloc(_Sample_Num * sizeof(double));
aktk 4:701f958d137a 60
aktk 4:701f958d137a 61 for(int i = 0; i < _Sample_Num; i++) {
aktk 4:701f958d137a 62 _Sample_Set[i].x = _Sample_Set[i].y = 0;
aktk 4:701f958d137a 63 _u_spline[i] = 0.0;
aktk 4:701f958d137a 64 }
aktk 3:b56e933bebc2 65 }
aktk 3:b56e933bebc2 66
aktk 3:b56e933bebc2 67 TRP105FS::TRP105FS(
aktk 18:b046bba4ffa7 68 unsigned short arg_num,
aktk 3:b56e933bebc2 69 UseType arg_type
aktk 3:b56e933bebc2 70 )
aktk 3:b56e933bebc2 71 :_useType(arg_type)
aktk 9:ec1ee4a6b6a4 72 ,_ai(AnalogIn(DEFALT_AI_PIN))
aktk 0:e85788b14028 73 {
aktk 20:0453919a76b2 74 _snum = 0;
aktk 0:e85788b14028 75 if(arg_num > _ENUM) _Sample_Num = _ENUM;
aktk 0:e85788b14028 76 else _Sample_Num = arg_num;
aktk 0:e85788b14028 77
aktk 0:e85788b14028 78 _Sample_Set = (VDset *)malloc(_Sample_Num * sizeof(VDset));
aktk 0:e85788b14028 79 _u_spline = (double*)malloc(_Sample_Num * sizeof(double));
aktk 4:701f958d137a 80
aktk 4:701f958d137a 81 for(int i = 0; i < _Sample_Num; i++) {
aktk 4:701f958d137a 82 _Sample_Set[i].x = _Sample_Set[i].y = 0;
aktk 4:701f958d137a 83 _u_spline[i] = 0.0;
aktk 4:701f958d137a 84 }
aktk 0:e85788b14028 85 }
aktk 0:e85788b14028 86
aktk 0:e85788b14028 87 TRP105FS::TRP105FS(
aktk 18:b046bba4ffa7 88 unsigned short arg_num,
aktk 10:b50e4bb40571 89 PinName pin
aktk 10:b50e4bb40571 90 )
aktk 18:b046bba4ffa7 91 :_useType(AsMODULE)
aktk 21:cd20537290f9 92 ,_ai(AnalogIn(pin))
aktk 10:b50e4bb40571 93
aktk 10:b50e4bb40571 94 {
aktk 20:0453919a76b2 95 _snum = 0;
aktk 10:b50e4bb40571 96 if(arg_num > _ENUM) _Sample_Num = _ENUM;
aktk 10:b50e4bb40571 97 else _Sample_Num = arg_num;
aktk 10:b50e4bb40571 98
aktk 10:b50e4bb40571 99 _Sample_Set = (VDset *)malloc(_Sample_Num * sizeof(VDset));
aktk 10:b50e4bb40571 100 _u_spline = (double*)malloc(_Sample_Num * sizeof(double));
aktk 10:b50e4bb40571 101
aktk 10:b50e4bb40571 102 for(int i = 0; i < _Sample_Num; i++) {
aktk 10:b50e4bb40571 103 _Sample_Set[i].x = _Sample_Set[i].y = 0;
aktk 10:b50e4bb40571 104 _u_spline[i] = 0.0;
aktk 10:b50e4bb40571 105 }
aktk 10:b50e4bb40571 106 }
aktk 10:b50e4bb40571 107
aktk 10:b50e4bb40571 108 TRP105FS::TRP105FS(
aktk 18:b046bba4ffa7 109 unsigned short arg_num,
aktk 3:b56e933bebc2 110 UseType arg_type,
aktk 3:b56e933bebc2 111 PinName pin
aktk 0:e85788b14028 112 )
aktk 3:b56e933bebc2 113 :_useType(arg_type)
aktk 9:ec1ee4a6b6a4 114 ,_ai(AnalogIn(pin))
aktk 0:e85788b14028 115 {
aktk 20:0453919a76b2 116 _snum = 0;
aktk 0:e85788b14028 117 if(arg_num > _ENUM) _Sample_Num = _ENUM;
aktk 0:e85788b14028 118 else _Sample_Num = arg_num;
aktk 0:e85788b14028 119
aktk 0:e85788b14028 120 _Sample_Set = (VDset *)malloc(_Sample_Num * sizeof(VDset));
aktk 0:e85788b14028 121 _u_spline = (double*)malloc(_Sample_Num * sizeof(double));
aktk 4:701f958d137a 122
aktk 4:701f958d137a 123 for(int i = 0; i < _Sample_Num; i++) {
aktk 4:701f958d137a 124 _Sample_Set[i].x = _Sample_Set[i].y = 0;
aktk 4:701f958d137a 125 _u_spline[i] = 0.0;
aktk 4:701f958d137a 126 }
aktk 0:e85788b14028 127 }
aktk 0:e85788b14028 128
aktk 3:b56e933bebc2 129 // Destructor
aktk 0:e85788b14028 130 TRP105FS::~TRP105FS()
aktk 0:e85788b14028 131 {
aktk 0:e85788b14028 132 free(_Sample_Set);
aktk 0:e85788b14028 133 free(_u_spline);
aktk 9:ec1ee4a6b6a4 134 //delete g_Sensor_Voltage;
aktk 0:e85788b14028 135 }
aktk 0:e85788b14028 136
aktk 15:1d643b831a03 137 unsigned short TRP105FS::getSampleNum()
aktk 15:1d643b831a03 138 {
aktk 15:1d643b831a03 139 return _Sample_Num;
aktk 15:1d643b831a03 140 }
aktk 3:b56e933bebc2 141
tanaken0605 23:772a9736ee59 142 /*
tanaken0605 23:772a9736ee59 143 unsigned short getVoltage() // get voltage
tanaken0605 23:772a9736ee59 144 {
tanaken0605 23:772a9736ee59 145 return(AnalogIn(pin).read_u16());
tanaken0605 23:772a9736ee59 146 }
tanaken0605 23:772a9736ee59 147 */
tanaken0605 23:772a9736ee59 148
aktk 3:b56e933bebc2 149 unsigned short TRP105FS::getX(unsigned short arg_y)
aktk 0:e85788b14028 150 {
aktk 0:e85788b14028 151 int idx;
aktk 0:e85788b14028 152 unsigned short pv = 0;
aktk 0:e85788b14028 153
aktk 3:b56e933bebc2 154 pv = arg_y;
aktk 0:e85788b14028 155
aktk 0:e85788b14028 156 idx = _getNearest(_LIDX, _RIDX, pv);
aktk 0:e85788b14028 157
aktk 0:e85788b14028 158 if (idx != 0xFFFF) // unless occuring error
aktk 3:b56e933bebc2 159 return _Set[idx].x;
aktk 0:e85788b14028 160 else
aktk 0:e85788b14028 161 return 0xFFFF;
aktk 0:e85788b14028 162 }
aktk 0:e85788b14028 163
aktk 0:e85788b14028 164 /*
aktk 3:b56e933bebc2 165 Function to find a set whose y member is nearest a ytage from the sensor, recursively.
aktk 0:e85788b14028 166
aktk 0:e85788b14028 167 SHORT LONG
aktk 0:e85788b14028 168 +------------> HIGH[lidx , ... , cidx , threshold[cidx], cidx+1 , ... , ridx]LOW <-----------+
aktk 3:b56e933bebc2 169 |(if ytage form sensor < threshold[cidx]) ||| (if threshold[cidx] < ytage form sensor)|
aktk 0:e85788b14028 170 | HIGH[lidx , ... , cidx]LOW ||| HIGH[cidx+1 , ... , ridx]LOW |
aktk 0:e85788b14028 171 | | | |
aktk 0:e85788b14028 172 +----------------+ +---------------+
aktk 0:e85788b14028 173 */
aktk 0:e85788b14028 174 int TRP105FS::_getNearest(
aktk 0:e85788b14028 175 int arg_lidx,
aktk 0:e85788b14028 176 int arg_ridx,
aktk 3:b56e933bebc2 177 unsigned short arg_y
aktk 0:e85788b14028 178 )
aktk 0:e85788b14028 179 {
aktk 0:e85788b14028 180 int cidx = (arg_lidx + arg_ridx) / 2;
aktk 0:e85788b14028 181
aktk 0:e85788b14028 182 // When the number of element to compare is only one, return it as result.
aktk 0:e85788b14028 183 if(arg_lidx == arg_ridx)
aktk 0:e85788b14028 184 return cidx;
aktk 3:b56e933bebc2 185 // If the ytage from the sensor is lower than the center threshold
aktk 0:e85788b14028 186 // (_set[cidx] > _threshold[cidx] > _set[cidx+1])
aktk 3:b56e933bebc2 187 else if(arg_y > _Threshold[cidx])
aktk 3:b56e933bebc2 188 return _getNearest(arg_lidx, cidx, arg_y);
aktk 3:b56e933bebc2 189 // If the ytage from the sensor is higher than the center threshold
aktk 3:b56e933bebc2 190 else if(arg_y < _Threshold[cidx])
aktk 3:b56e933bebc2 191 return _getNearest(cidx + 1, arg_ridx, arg_y);
aktk 3:b56e933bebc2 192 // If the ytage from the sensor eauals the center threshold
aktk 3:b56e933bebc2 193 else //(arg_y == _Treshold[cidx].y)
aktk 0:e85788b14028 194 return cidx;
aktk 0:e85788b14028 195 }
aktk 0:e85788b14028 196
aktk 4:701f958d137a 197 void TRP105FS::setSample(unsigned short arg_x, unsigned short arg_y)
aktk 4:701f958d137a 198 {
aktk 4:701f958d137a 199 _setSample(arg_x, arg_y);
aktk 3:b56e933bebc2 200 }
aktk 3:b56e933bebc2 201
aktk 3:b56e933bebc2 202 void TRP105FS::_setSample(unsigned short arg_x, unsigned short arg_y)
aktk 3:b56e933bebc2 203 {
aktk 3:b56e933bebc2 204 unsigned int num;
aktk 3:b56e933bebc2 205 int tmp;
aktk 3:b56e933bebc2 206 VDset tmp_set[_ENUM]; // for bucket sort
aktk 3:b56e933bebc2 207
aktk 4:701f958d137a 208 // Increment it if this function called.
aktk 20:0453919a76b2 209 _snum++;
aktk 4:701f958d137a 210 #ifdef DEBUG
aktk 20:0453919a76b2 211 g_Serial_Signal.printf("_snum : %d\n", _snum);
aktk 4:701f958d137a 212 g_Serial_Signal.printf("(%d,%d)\n",arg_x, arg_y);
aktk 4:701f958d137a 213 #endif
aktk 3:b56e933bebc2 214
aktk 3:b56e933bebc2 215 // fit to smaller
aktk 20:0453919a76b2 216 if (_snum < _Sample_Num) {
aktk 20:0453919a76b2 217 num = _snum;
aktk 3:b56e933bebc2 218 } else {
aktk 20:0453919a76b2 219 // To reclloc memories if _snum is bigger than _Sample_Num.
aktk 20:0453919a76b2 220 // When realloc is failed, _snum is back to porevius.
aktk 20:0453919a76b2 221 VDset* tmp_Set = (VDset *)realloc(_Sample_Set, _snum * sizeof(VDset));
aktk 20:0453919a76b2 222 double* tmp__u_ = (double*)realloc(_u_spline, _snum * sizeof(double));
aktk 20:0453919a76b2 223 if (tmp_Set != NULL && tmp__u_ != NULL) {
aktk 3:b56e933bebc2 224 _Sample_Set = tmp_Set;
aktk 3:b56e933bebc2 225 _u_spline = tmp__u_;
aktk 20:0453919a76b2 226 num = _Sample_Num = _snum;
aktk 3:b56e933bebc2 227 } else {
aktk 20:0453919a76b2 228 _snum--;
aktk 20:0453919a76b2 229 num = _snum = _Sample_Num ;
aktk 4:701f958d137a 230 #ifdef DEBUG
aktk 20:0453919a76b2 231 g_Serial_Signal.printf("failed to realloc\n", _snum);
aktk 4:701f958d137a 232 #endif
aktk 3:b56e933bebc2 233 }
aktk 3:b56e933bebc2 234 }
aktk 3:b56e933bebc2 235
aktk 3:b56e933bebc2 236 _Sample_Set[num - 1].x = arg_x;
aktk 3:b56e933bebc2 237 _Sample_Set[num - 1].y = arg_y;
aktk 4:701f958d137a 238 if((unsigned short)_RIDX < _Sample_Set[num - 1].x)
aktk 4:701f958d137a 239 _Sample_Set[num - 1].x = (unsigned short)_RIDX;
aktk 3:b56e933bebc2 240
aktk 3:b56e933bebc2 241 //
aktk 3:b56e933bebc2 242 // Sort set data array in distanceAscending order
aktk 3:b56e933bebc2 243 //
aktk 3:b56e933bebc2 244 // Bucket sort
aktk 3:b56e933bebc2 245 for(int i = 0; i < _ENUM; i++)
aktk 3:b56e933bebc2 246 tmp_set[i].x = 0xaaaa;
aktk 3:b56e933bebc2 247 tmp = 0;
aktk 4:701f958d137a 248 for(int i = 0; i < num; i++) {
aktk 3:b56e933bebc2 249 // use x as index for x range [_LIDX,_RIDX]
aktk 3:b56e933bebc2 250 if (tmp_set[_Sample_Set[i].x].x == 0xaaaa) {
aktk 3:b56e933bebc2 251 tmp_set[_Sample_Set[i].x].x = _Sample_Set[i].x;
aktk 3:b56e933bebc2 252 tmp_set[_Sample_Set[i].x].y = _Sample_Set[i].y;
aktk 3:b56e933bebc2 253 } else { // if a same x has been input, calcurate mean.
aktk 3:b56e933bebc2 254 tmp_set[_Sample_Set[i].x].y += _Sample_Set[i].y;
aktk 3:b56e933bebc2 255 tmp_set[_Sample_Set[i].x].y /= 2;
aktk 3:b56e933bebc2 256 tmp++;
aktk 3:b56e933bebc2 257 }
aktk 3:b56e933bebc2 258 }
aktk 3:b56e933bebc2 259 #ifdef DEBUG
aktk 3:b56e933bebc2 260 g_Serial_Signal.printf(" _Sample_num: %d\n", _Sample_Num );
aktk 3:b56e933bebc2 261 g_Serial_Signal.printf("-) tmp: %d\n", tmp );
aktk 3:b56e933bebc2 262 #endif
aktk 3:b56e933bebc2 263 // substruct tmp from number of sample.
aktk 3:b56e933bebc2 264 _Sample_Num -= tmp;
aktk 20:0453919a76b2 265 _snum -= tmp;
aktk 3:b56e933bebc2 266 #ifdef DEBUG
aktk 3:b56e933bebc2 267 g_Serial_Signal.printf("-----------------\n");
aktk 3:b56e933bebc2 268 g_Serial_Signal.printf(" _Sample_num: %d\n", _Sample_Num );
aktk 3:b56e933bebc2 269 #endif
aktk 3:b56e933bebc2 270 // apply sort on _Sample_Set
aktk 3:b56e933bebc2 271 tmp = 0;
aktk 3:b56e933bebc2 272 for(int i = 0; i < _ENUM; i++) {
aktk 3:b56e933bebc2 273 if(tmp_set[i].x != 0xaaaa) {
aktk 3:b56e933bebc2 274 _Sample_Set[i - tmp].x = tmp_set[i].x;
aktk 3:b56e933bebc2 275 _Sample_Set[i - tmp].y = tmp_set[i].y;
aktk 3:b56e933bebc2 276 } else // if no data, skip it
aktk 3:b56e933bebc2 277 tmp++;
aktk 3:b56e933bebc2 278 }
aktk 3:b56e933bebc2 279 }
aktk 11:d60fb729eacf 280
aktk 11:d60fb729eacf 281
aktk 11:d60fb729eacf 282 #ifdef TARGET_LPC1768
aktk 0:e85788b14028 283 void TRP105FS::_sampleData()
aktk 0:e85788b14028 284 {
aktk 0:e85788b14028 285 int tmp;
aktk 0:e85788b14028 286 char sig;
aktk 3:b56e933bebc2 287 unsigned short tmp_y;
aktk 0:e85788b14028 288 VDset tmp_set[_ENUM]; // for bucket sort
aktk 0:e85788b14028 289
aktk 3:b56e933bebc2 290 // For evry set,
aktk 3:b56e933bebc2 291 // 1, get x data via serai com,
aktk 3:b56e933bebc2 292 // 2, get y data,
aktk 0:e85788b14028 293 // and then do same for next index set.
aktk 0:e85788b14028 294 for(int i = 0; i < _Sample_Num; i++) {
aktk 0:e85788b14028 295 //
aktk 0:e85788b14028 296 // Recieve a Distance datus and store it into member
aktk 0:e85788b14028 297 //
aktk 3:b56e933bebc2 298 if(_useType == AsDEBUG) {
aktk 0:e85788b14028 299 g_Serial_Signal.putc('>');
aktk 3:b56e933bebc2 300 _Sample_Set[i].x = 0;
aktk 0:e85788b14028 301 do {
aktk 0:e85788b14028 302 sig = g_Serial_Signal.getc();
aktk 0:e85788b14028 303 if('0' <= sig && sig <= '9') {
aktk 3:b56e933bebc2 304 _Sample_Set[i].x = 10 * _Sample_Set[i].x + sig - 48;
aktk 0:e85788b14028 305 g_Serial_Signal.putc(char(sig));
aktk 0:e85788b14028 306 } else if(sig == 0x08) {
aktk 3:b56e933bebc2 307 _Sample_Set[i].x = 0;
aktk 0:e85788b14028 308 g_Serial_Signal.printf("[canseled!]");
aktk 0:e85788b14028 309 g_Serial_Signal.putc('\n');
aktk 0:e85788b14028 310 g_Serial_Signal.putc('>');
aktk 0:e85788b14028 311 }
aktk 0:e85788b14028 312 } while (!(sig == 0x0a || sig == 0x0d));
aktk 0:e85788b14028 313 g_Serial_Signal.putc('\n');
aktk 4:701f958d137a 314 } else {
aktk 3:b56e933bebc2 315 _Sample_Set[i].x = g_Serial_Signal.getc();
aktk 0:e85788b14028 316 }
aktk 0:e85788b14028 317
aktk 0:e85788b14028 318 // if input data is over the bound calibrate it below
aktk 3:b56e933bebc2 319 if (_Sample_Set[i].x < (unsigned short)_LIDX)
aktk 3:b56e933bebc2 320 _Sample_Set[i].x = (unsigned short)_LIDX;
aktk 3:b56e933bebc2 321 else if ((unsigned short)_RIDX < _Sample_Set[i].x)
aktk 3:b56e933bebc2 322 _Sample_Set[i].x = (unsigned short)_RIDX;
aktk 0:e85788b14028 323 //
aktk 0:e85788b14028 324 // Recieve a Voltage datus and store it into member
aktk 0:e85788b14028 325 //
aktk 0:e85788b14028 326 // LOW PASS FILTERED
aktk 0:e85788b14028 327 // Get 10 data and store mean as a sample.
aktk 0:e85788b14028 328 // After get one original sample, system waits for 0.1 sec,
aktk 0:e85788b14028 329 // thus it takes 1 sec evry sampling.
aktk 3:b56e933bebc2 330 _Sample_Set[i].y = 0;
aktk 0:e85788b14028 331 for(int j = 0; j < 10; j++) {
aktk 0:e85788b14028 332 //unsigned short 's range [0 , 65535]
aktk 3:b56e933bebc2 333 //the Number of significant figures of read ytage is 3 or 4.
aktk 9:ec1ee4a6b6a4 334 tmp_y = _ai.read_u16();
aktk 3:b56e933bebc2 335
aktk 0:e85788b14028 336 #ifdef DEBUG
aktk 3:b56e933bebc2 337 g_Serial_Signal.printf("%d,",tmp_y);
aktk 0:e85788b14028 338 #endif
aktk 3:b56e933bebc2 339 _Sample_Set[i].y += (tmp_y / 10);
aktk 0:e85788b14028 340 wait(0.1);
aktk 0:e85788b14028 341 }
aktk 0:e85788b14028 342 #ifdef DEBUG
aktk 3:b56e933bebc2 343 g_Serial_Signal.printf("(%d)\n",_Sample_Set[i].y);
aktk 0:e85788b14028 344 #endif
aktk 0:e85788b14028 345 }
aktk 0:e85788b14028 346 //
aktk 0:e85788b14028 347 // Sort set data array in distanceAscending order
aktk 0:e85788b14028 348 //
aktk 0:e85788b14028 349 // Bucket sort
aktk 0:e85788b14028 350 for(int i = 0; i < _ENUM; i++)
aktk 3:b56e933bebc2 351 tmp_set[i].x = 0xaaaa;
aktk 0:e85788b14028 352 tmp = 0;
aktk 0:e85788b14028 353 for(int i = 0; i < _Sample_Num; i++) {
aktk 3:b56e933bebc2 354 // use x as index for x range [LIDX,RIDX]
aktk 3:b56e933bebc2 355 if (tmp_set[_Sample_Set[i].x].x == 0xaaaa) {
aktk 3:b56e933bebc2 356 tmp_set[_Sample_Set[i].x].x = _Sample_Set[i].x;
aktk 3:b56e933bebc2 357 tmp_set[_Sample_Set[i].x].y = _Sample_Set[i].y;
aktk 3:b56e933bebc2 358 } else { // if a same x has been input, calcurate mean.
aktk 3:b56e933bebc2 359 tmp_set[_Sample_Set[i].x].y += _Sample_Set[i].y;
aktk 3:b56e933bebc2 360 tmp_set[_Sample_Set[i].x].y /= 2;
aktk 0:e85788b14028 361 tmp++;
aktk 0:e85788b14028 362 }
aktk 0:e85788b14028 363 }
aktk 0:e85788b14028 364 #ifdef DEBUG
aktk 0:e85788b14028 365 g_Serial_Signal.printf("%d\n", _Sample_Num );
aktk 0:e85788b14028 366 #endif
aktk 0:e85788b14028 367 // substruct tmp from number of sample.
aktk 0:e85788b14028 368 _Sample_Num -= tmp;
aktk 0:e85788b14028 369
aktk 0:e85788b14028 370 #ifdef DEBUG
aktk 0:e85788b14028 371 g_Serial_Signal.printf("tmp: %d\n", tmp );
aktk 0:e85788b14028 372 #endif
aktk 0:e85788b14028 373 // apply sort on _Sample_Set
aktk 0:e85788b14028 374 tmp = 0;
aktk 0:e85788b14028 375 for(int i = 0; i < _ENUM; i++) {
aktk 3:b56e933bebc2 376 if(tmp_set[i].x != 0xaaaa) {
aktk 3:b56e933bebc2 377 _Sample_Set[i - tmp].x = tmp_set[i].x;
aktk 3:b56e933bebc2 378 _Sample_Set[i - tmp].y = tmp_set[i].y;
aktk 0:e85788b14028 379 } else // if no data, skip it
aktk 0:e85788b14028 380 tmp++;
aktk 0:e85788b14028 381 }
aktk 0:e85788b14028 382 }
aktk 11:d60fb729eacf 383 #endif
aktk 0:e85788b14028 384
aktk 0:e85788b14028 385 //
aktk 0:e85788b14028 386 // Function to define _u_spline, specific constants of spline.
aktk 0:e85788b14028 387 //
aktk 0:e85788b14028 388 void TRP105FS::_makeSpline()
aktk 0:e85788b14028 389 {
aktk 3:b56e933bebc2 390 // x: x, distance
aktk 3:b56e933bebc2 391 // y: y, ytage
aktk 0:e85788b14028 392 //
aktk 0:e85788b14028 393 // N: max of index <=> (_Sample_Num - 1)
aktk 0:e85788b14028 394 //
aktk 0:e85788b14028 395 // _u_spline[i] === d^2/dx^2(Spline f)[i]
aktk 0:e85788b14028 396 // i:[0,N]
aktk 0:e85788b14028 397 // _u_spline[0] = _u_spline[N] = 0
aktk 0:e85788b14028 398 //
aktk 0:e85788b14028 399 // h[i] = x[i+1] - x[i]
aktk 0:e85788b14028 400 // i:[0,N-1]; num of elm: N<=>_Sample_Num - 1
aktk 0:e85788b14028 401 double *h = (double*)malloc((_Sample_Num - 1) * sizeof(double));
aktk 0:e85788b14028 402 //unsigned short *h __attribute__((at(0x20080000)));
aktk 0:e85788b14028 403 //h = (unsigned short*)malloc((_Sample_Num - 1) * sizeof(unsigned short));
aktk 0:e85788b14028 404 // v[i] = 6*((y[i+2]-y[i+1])/h[i+1] + (y[i+1]-y[i])/h[i])
aktk 0:e85788b14028 405 // i:[0,N-2]
aktk 0:e85788b14028 406 double *v = (double*)malloc((_Sample_Num - 2) * sizeof(double));
aktk 0:e85788b14028 407 //unsigned short *v __attribute__((at(0x20080100)));
aktk 0:e85788b14028 408 //v = (unsigned short*)malloc((_Sample_Num - 2) * sizeof(unsigned short));
aktk 0:e85788b14028 409 // temporary array whose num of elm equals v array
aktk 0:e85788b14028 410 double *w = (double*)malloc((_Sample_Num - 2) * sizeof(double));
aktk 0:e85788b14028 411 //unsigned short *w __attribute__((at(0x20080200)));
aktk 0:e85788b14028 412 //w = (unsigned short*)malloc((_Sample_Num - 2) * sizeof(unsigned short));
aktk 0:e85788b14028 413 //
aktk 0:e85788b14028 414 // [ 2(h[0]+h[1]) , h[1] , O ] [_u[1] ] [v[0] ]
aktk 0:e85788b14028 415 // [ h[1] , 2(h[1]+h[2]) , h[2] ] [_u[2] ] [v[1] ]
aktk 0:e85788b14028 416 // [ ... ] * [... ] = [... ]
aktk 0:e85788b14028 417 // [ h[j] , 2(h[j]+h[j+1]) , h[j+1] ] [_u[j+1]] [v[j] ]
aktk 0:e85788b14028 418 // [ ... ] [ ... ] [ ... ]
aktk 0:e85788b14028 419 // [ h[N-3] , 2(h[N-3]+h[N-2]), h[N-2] ] [_u[j+1]] [v[j] ]
aktk 0:e85788b14028 420 // [ O h[N-2] , 2(h[N-2]+h[N-1]) ] [_u[N-1]] [v[N-2]]
aktk 0:e85788b14028 421 //
aktk 0:e85788b14028 422 // For LU decomposition
aktk 0:e85788b14028 423 double *Upper = (double*)malloc((_Sample_Num - 2) * sizeof(double));
aktk 0:e85788b14028 424 //unsigned short *Upper __attribute__((at(0x20080300)));
aktk 0:e85788b14028 425 //Upper = (unsigned short*)malloc((_Sample_Num - 2) * sizeof(unsigned short));
aktk 0:e85788b14028 426 double *Lower = (double*)malloc((_Sample_Num - 2) * sizeof(double));
aktk 0:e85788b14028 427 //unsigned short *Lower __attribute__((at(0x20080400)));
aktk 0:e85788b14028 428 //Lower = (unsigned short*)malloc((_Sample_Num - 2) * sizeof(unsigned short));
aktk 0:e85788b14028 429 #ifdef DEBUG
aktk 0:e85788b14028 430 _printOutData(_Sample_Set, _Sample_Num, "\nSampleSet");
aktk 0:e85788b14028 431 #endif
aktk 0:e85788b14028 432 for(int i = 0; i < _Sample_Num - 1; i++)
aktk 3:b56e933bebc2 433 h[i] = (double)(_Sample_Set[i + 1].x - _Sample_Set[i].x);
aktk 3:b56e933bebc2 434 //(unsigned short)(_Sample_Set[i + 1].x - _Sample_Set[i].x);
aktk 0:e85788b14028 435
aktk 0:e85788b14028 436 for(int i = 0; i < _Sample_Num - 2; i++)
aktk 0:e85788b14028 437 v[i] = 6 * (
aktk 3:b56e933bebc2 438 ((double)(_Sample_Set[i + 2].y - _Sample_Set[i + 1].y)) / h[i + 1]
aktk 3:b56e933bebc2 439 //(unsigned short)(_Sample_Set[i + 2].y - _Sample_Set[i + 1].y) / h[i + 1]
aktk 0:e85788b14028 440 -
aktk 3:b56e933bebc2 441 ((double)(_Sample_Set[i + 1].y - _Sample_Set[i].y)) / h[i]
aktk 3:b56e933bebc2 442 //(unsigned short)(_Sample_Set[i + 1].y - _Sample_Set[i].y) / h[i]
aktk 0:e85788b14028 443 );
aktk 0:e85788b14028 444
aktk 0:e85788b14028 445 //
aktk 0:e85788b14028 446 // LU decomposition
aktk 0:e85788b14028 447 //
aktk 0:e85788b14028 448 Upper[0] = 2 * (h[0] + h[1]);
aktk 0:e85788b14028 449 Lower[0] = 0;
aktk 0:e85788b14028 450 for (int i = 1; i < _Sample_Num - 2; i++) {
aktk 0:e85788b14028 451 Lower[i] = h[i] / Upper[i - 1];
aktk 0:e85788b14028 452 Upper[i] = 2 * (h[i] + h[i + 1]) - Lower[i] * h[i];
aktk 0:e85788b14028 453 }
aktk 0:e85788b14028 454
aktk 0:e85788b14028 455
aktk 0:e85788b14028 456 //
aktk 0:e85788b14028 457 // forward substitution
aktk 0:e85788b14028 458 //
aktk 0:e85788b14028 459 w[0] = v[0];
aktk 0:e85788b14028 460 for (int i = 1; i < _Sample_Num - 2; i ++) {
aktk 0:e85788b14028 461 w[i] = v[i] - Lower[i] * w[i-1];
aktk 0:e85788b14028 462 }
aktk 0:e85788b14028 463
aktk 0:e85788b14028 464
aktk 0:e85788b14028 465 //
aktk 0:e85788b14028 466 // backward substitution
aktk 0:e85788b14028 467 //
aktk 0:e85788b14028 468 _u_spline[_Sample_Num - 2] = w[_Sample_Num - 3] / Upper[_Sample_Num - 3];
aktk 0:e85788b14028 469 for(int i = _Sample_Num - 3; i > 0; i--) {
aktk 0:e85788b14028 470 _u_spline[i] = (w[(i - 1)] - h[(i)] * _u_spline[(i) + 1]) / Upper[(i - 1)];
aktk 0:e85788b14028 471 }
aktk 0:e85788b14028 472
aktk 0:e85788b14028 473 // _u_spline[i] === d^2/dx^2(Spline f)[i]
aktk 0:e85788b14028 474 _u_spline[0] = _u_spline[_Sample_Num - 1] = 0.0;
aktk 0:e85788b14028 475
aktk 0:e85788b14028 476 #ifdef DEBUG
aktk 0:e85788b14028 477 _printOutData(h, _Sample_Num - 1, "h");
aktk 0:e85788b14028 478 _printOutData(v, _Sample_Num - 2, "v");
aktk 0:e85788b14028 479 _printOutData(w, _Sample_Num - 2, "w");
aktk 0:e85788b14028 480 _printOutData(Upper, _Sample_Num - 2, "Upper");
aktk 0:e85788b14028 481 _printOutData(Lower, _Sample_Num - 2, "Lower");
aktk 0:e85788b14028 482 _printOutData(_u_spline, _Sample_Num, "u");
aktk 0:e85788b14028 483 #endif
aktk 0:e85788b14028 484 free(h);
aktk 0:e85788b14028 485 free(v);
aktk 0:e85788b14028 486 free(w);
aktk 0:e85788b14028 487 free(Upper);
aktk 0:e85788b14028 488 free(Lower);
aktk 0:e85788b14028 489 }
aktk 0:e85788b14028 490 //
aktk 0:e85788b14028 491 // Function to return Voltage for distance.
aktk 0:e85788b14028 492 //
aktk 0:e85788b14028 493 unsigned short TRP105FS:: _getSplineYof(
aktk 0:e85788b14028 494 double arg_x // the argument is supposed as distance [mm]
aktk 0:e85788b14028 495 )
aktk 0:e85788b14028 496 {
aktk 3:b56e933bebc2 497 double y; // ytage calculated by spline polynomial
aktk 0:e85788b14028 498 double a,b,c,d; // which is specific constant of spline, and can be expressed with _u.
aktk 0:e85788b14028 499 int itv = 0; // interval(section) of interpolation
aktk 0:e85788b14028 500 // the number of interval is less 1 than the number of sample sets,
aktk 0:e85788b14028 501 // which means the max number of interval is _Sample_num - 2.
aktk 3:b56e933bebc2 502 if((double)(_Sample_Set[0].x) <= arg_x) {
aktk 3:b56e933bebc2 503 while (!((double)(_Sample_Set[itv].x) <= arg_x && arg_x < (double)(_Sample_Set[itv + 1].x))) {
aktk 0:e85788b14028 504 itv++;
aktk 0:e85788b14028 505 if(itv > _Sample_Num - 2) {
aktk 0:e85788b14028 506 itv = _Sample_Num - 2;
aktk 0:e85788b14028 507 break;
aktk 0:e85788b14028 508 }
aktk 0:e85788b14028 509 }
aktk 0:e85788b14028 510 }
aktk 3:b56e933bebc2 511 a = (double)(_u_spline[itv + 1] - _u_spline[itv]) / 6.0 / (double)(_Sample_Set[itv + 1].x - _Sample_Set[itv].x);
aktk 0:e85788b14028 512 b = (double)(_u_spline[itv]) / 2.0;
aktk 3:b56e933bebc2 513 c = (double)(_Sample_Set[itv + 1].y - _Sample_Set[itv].y) / (double)(_Sample_Set[itv + 1].x - _Sample_Set[itv].x)
aktk 0:e85788b14028 514 -
aktk 3:b56e933bebc2 515 (double)(_Sample_Set[itv + 1].x - _Sample_Set[itv].x) * (double)(_u_spline[itv + 1] + 2.0 * _u_spline[itv]) / 6.0;
aktk 3:b56e933bebc2 516 d = (double)(_Sample_Set[itv].y);
aktk 0:e85788b14028 517 // cubic spline expression
aktk 3:b56e933bebc2 518 y = a * (arg_x - (double)(_Sample_Set[itv].x)) * (arg_x - (double)(_Sample_Set[itv].x)) * (arg_x - (double)(_Sample_Set[itv].x))
aktk 0:e85788b14028 519 +
aktk 3:b56e933bebc2 520 b * (arg_x - (double)(_Sample_Set[itv].x)) * (arg_x - (double)(_Sample_Set[itv].x))
aktk 0:e85788b14028 521 +
aktk 3:b56e933bebc2 522 c * (arg_x - (double)(_Sample_Set[itv].x))
aktk 0:e85788b14028 523 +
aktk 0:e85788b14028 524 d;
aktk 0:e85788b14028 525
aktk 0:e85788b14028 526 #ifdef DEBUG2
aktk 0:e85788b14028 527 g_Serial_Signal.printf("%f(interval: %d)", arg_x, itv);
aktk 0:e85788b14028 528 g_Serial_Signal.printf("a:%f, b:%f, c:%f, d:%f, ", a,b,c,d);
aktk 0:e85788b14028 529 g_Serial_Signal.printf("(y:%f -> %d)\n", y, (unsigned short)y);
aktk 0:e85788b14028 530 #endif
aktk 0:e85788b14028 531
aktk 0:e85788b14028 532 return ((unsigned short)(int)y);
aktk 0:e85788b14028 533 }
aktk 0:e85788b14028 534
aktk 11:d60fb729eacf 535 #if defined(HAS_COM_TO_CONSOLE)
aktk 0:e85788b14028 536 void TRP105FS::calibrateSensor()
aktk 0:e85788b14028 537 {
aktk 0:e85788b14028 538 _sampleData();
aktk 0:e85788b14028 539 _makeSpline();
aktk 0:e85788b14028 540
aktk 0:e85788b14028 541 for(int i = 0; i < _ENUM; i++) {
aktk 3:b56e933bebc2 542 _Set[i].x = i;
aktk 4:701f958d137a 543 _Set[i].y = _getSplineYof((double)(_Set[i].x));
aktk 4:701f958d137a 544 _Threshold[i] = _getSplineYof((double)(_Set[i].x) + 0.5);
aktk 3:b56e933bebc2 545 #ifdef DEBUG2
aktk 3:b56e933bebc2 546 g_Serial_Signal.printf("(get...threashold:%d)\n", _Threshold[i]);
aktk 3:b56e933bebc2 547 #endif
aktk 3:b56e933bebc2 548 }
aktk 3:b56e933bebc2 549 }
aktk 11:d60fb729eacf 550 #endif
aktk 3:b56e933bebc2 551
aktk 3:b56e933bebc2 552 void TRP105FS::calibrate()
aktk 3:b56e933bebc2 553 {
aktk 4:701f958d137a 554 #ifdef DEBUG2
aktk 4:701f958d137a 555 g_Serial_Signal.printf("Sample Data Set\n");
aktk 4:701f958d137a 556 for(int i = 0; i < _Sample_Num; i++)
aktk 4:701f958d137a 557 g_Serial_Signal.printf("(%d,%d)\n", _Sample_Set[i].x, _Sample_Set[i].y);
aktk 4:701f958d137a 558 #endif
aktk 4:701f958d137a 559
aktk 3:b56e933bebc2 560 _makeSpline();
aktk 3:b56e933bebc2 561
aktk 3:b56e933bebc2 562 for(int i = 0; i < _ENUM; i++) {
aktk 3:b56e933bebc2 563 _Set[i].x = i;
aktk 4:701f958d137a 564 _Set[i].y = _getSplineYof((double)(_Set[i].x));
aktk 4:701f958d137a 565 _Threshold[i] = _getSplineYof((double)(_Set[i].x) + 0.5);
aktk 4:701f958d137a 566
aktk 0:e85788b14028 567 #ifdef DEBUG2
aktk 0:e85788b14028 568 g_Serial_Signal.printf("(get...threashold:%d)\n", _Threshold[i]);
aktk 0:e85788b14028 569 #endif
aktk 0:e85788b14028 570 }
aktk 0:e85788b14028 571 }
aktk 0:e85788b14028 572
aktk 0:e85788b14028 573
aktk 14:a99bf22b919d 574 #ifdef HAS_COM_TO_CONSOLE
aktk 0:e85788b14028 575 void TRP105FS::printThresholds()
aktk 0:e85788b14028 576 {
aktk 0:e85788b14028 577 for(int i = 0; i < _ENUM; i++)
aktk 0:e85788b14028 578 g_Serial_Signal.printf("Threshold[%d]%d\n",i,_Threshold[i]);
aktk 0:e85788b14028 579 }
aktk 11:d60fb729eacf 580 #endif
aktk 11:d60fb729eacf 581
aktk 14:a99bf22b919d 582
aktk 14:a99bf22b919d 583 #ifdef HAS_LOCAL_FILE_SYSTEM
aktk 14:a99bf22b919d 584 void TRP105FS::printOutData(
aktk 14:a99bf22b919d 585 const char *filename)
aktk 14:a99bf22b919d 586 {
aktk 14:a99bf22b919d 587 FILE *fp;
aktk 14:a99bf22b919d 588 char *filepath;
aktk 14:a99bf22b919d 589 int fnnum = 0;
aktk 14:a99bf22b919d 590
aktk 14:a99bf22b919d 591 while (filename[fnnum] != 0) fnnum++;
aktk 14:a99bf22b919d 592 filepath = (char *)malloc((fnnum + 8) * sizeof(char)); // "/local/" are 7 char and \0 is 1 char.
aktk 14:a99bf22b919d 593 sprintf(filepath, "/local/%s", filename);
aktk 14:a99bf22b919d 594 fp = fopen(filepath, "w");
aktk 14:a99bf22b919d 595 //fp = fopen("/local/log.txt", "w"); // open file in writing mode
aktk 14:a99bf22b919d 596
aktk 14:a99bf22b919d 597 fprintf(fp, "x, y,(threshold)\n");
aktk 14:a99bf22b919d 598 for(int i = 0; i < _ENUM; i++) {
aktk 14:a99bf22b919d 599 fprintf(fp, "%d,%d,(%d)\n", _Set[i].x, _Set[i].y, _Threshold[i]);
aktk 14:a99bf22b919d 600 }
aktk 14:a99bf22b919d 601 fprintf(fp, "\nSample:x, y\n");
aktk 14:a99bf22b919d 602 for(int i = 0; i < _Sample_Num; i++) {
aktk 14:a99bf22b919d 603 fprintf(fp, "%d,%d\n", _Sample_Set[i].x, _Sample_Set[i].y);
aktk 14:a99bf22b919d 604 }
aktk 14:a99bf22b919d 605
aktk 14:a99bf22b919d 606 free(filepath);
aktk 14:a99bf22b919d 607 fclose(fp);
aktk 14:a99bf22b919d 608
aktk 14:a99bf22b919d 609 }
aktk 14:a99bf22b919d 610
aktk 16:c2b0f3ca63dd 611 void TRP105FS::saveSetting()
aktk 16:c2b0f3ca63dd 612 {
aktk 16:c2b0f3ca63dd 613 FILE *fp;
aktk 16:c2b0f3ca63dd 614
aktk 16:c2b0f3ca63dd 615 fp = fopen("/local/savedata.log", "wb");
aktk 16:c2b0f3ca63dd 616
aktk 16:c2b0f3ca63dd 617 for(int i = 0; i < _ENUM; i++) {
aktk 16:c2b0f3ca63dd 618 fwrite(&_Set[i].x, sizeof(unsigned short), 1, fp);
aktk 16:c2b0f3ca63dd 619 fputc(0x2c, fp);
aktk 16:c2b0f3ca63dd 620 fwrite(&_Set[i].y, sizeof(unsigned short), 1, fp);
aktk 16:c2b0f3ca63dd 621 fputc(0x2c, fp);
aktk 16:c2b0f3ca63dd 622 fwrite(&_Threshold[i], sizeof(unsigned short), 1, fp);
aktk 16:c2b0f3ca63dd 623 fputc(0x3b, fp);
aktk 16:c2b0f3ca63dd 624 }
aktk 16:c2b0f3ca63dd 625 fwrite(&_Sample_Num, sizeof(unsigned short), 1, fp);
aktk 16:c2b0f3ca63dd 626 fputc(0x3b, fp);
aktk 16:c2b0f3ca63dd 627 for(int i = 0; i < _Sample_Num; i++) {
aktk 16:c2b0f3ca63dd 628 fwrite(&_Sample_Set[i].x, sizeof(unsigned short), 1, fp);
aktk 16:c2b0f3ca63dd 629 fputc(0x2c, fp);
aktk 16:c2b0f3ca63dd 630 fwrite(&_Sample_Set[i].y, sizeof(unsigned short), 1, fp);
aktk 16:c2b0f3ca63dd 631 fputc(0x3b, fp);
aktk 16:c2b0f3ca63dd 632 }
aktk 16:c2b0f3ca63dd 633 fclose(fp);
aktk 16:c2b0f3ca63dd 634
aktk 16:c2b0f3ca63dd 635 }
aktk 16:c2b0f3ca63dd 636
aktk 0:e85788b14028 637 void TRP105FS::loadSetting()
aktk 0:e85788b14028 638 {
aktk 0:e85788b14028 639 FILE *fp;
aktk 0:e85788b14028 640 char tmp;
aktk 0:e85788b14028 641
aktk 0:e85788b14028 642 //sprintf(filepath, "/local/%s", filename);
aktk 0:e85788b14028 643 //fp = fopen(filepath, "rb");
aktk 0:e85788b14028 644 fp = fopen("/local/savedata.log", "rb");
aktk 0:e85788b14028 645 for(int i = 0; i < _ENUM; i++) {
aktk 0:e85788b14028 646
aktk 3:b56e933bebc2 647 fread(&_Set[i].x, sizeof(unsigned short), 1, fp);
aktk 0:e85788b14028 648 fread(&tmp, sizeof(char), 1, fp);
aktk 0:e85788b14028 649 #ifdef DEBUG2
aktk 3:b56e933bebc2 650 g_Serial_Signal.printf("%d%c", _Set[i].x, tmp);
aktk 0:e85788b14028 651 #endif
aktk 0:e85788b14028 652
aktk 3:b56e933bebc2 653 fread(&_Set[i].y, sizeof(unsigned short), 1, fp);
aktk 0:e85788b14028 654 fread(&tmp, sizeof(char), 1, fp);
aktk 0:e85788b14028 655 #ifdef DEBUG2
aktk 3:b56e933bebc2 656 g_Serial_Signal.printf("%d%c", _Set[i].y, tmp);
aktk 0:e85788b14028 657 #endif
aktk 0:e85788b14028 658
aktk 0:e85788b14028 659 fread(&_Threshold[i], sizeof(unsigned short), 1, fp);
aktk 0:e85788b14028 660 fread(&tmp, sizeof(char), 1, fp);
aktk 0:e85788b14028 661 #ifdef DEBUG2
aktk 0:e85788b14028 662 g_Serial_Signal.printf("%d%c\n",_Threshold[i], tmp);
aktk 0:e85788b14028 663 #endif
aktk 0:e85788b14028 664 }
aktk 0:e85788b14028 665
aktk 0:e85788b14028 666 fread(&_Sample_Num, sizeof(unsigned short), 1, fp);
aktk 0:e85788b14028 667 fread(&tmp, sizeof(char), 1, fp);
aktk 0:e85788b14028 668
aktk 0:e85788b14028 669 for(int i = 0; i < _Sample_Num; i++) {
aktk 3:b56e933bebc2 670 fread(&_Sample_Set[i].x, sizeof(unsigned short), 1, fp);
aktk 0:e85788b14028 671 fread(&tmp, sizeof(char),1,fp);
aktk 3:b56e933bebc2 672 fread(&_Sample_Set[i].y, sizeof(unsigned short), 1, fp);
aktk 0:e85788b14028 673 fread(&tmp, sizeof(char),1,fp);
aktk 0:e85788b14028 674 }
aktk 0:e85788b14028 675 fclose(fp);
aktk 0:e85788b14028 676 }
aktk 0:e85788b14028 677
aktk 0:e85788b14028 678
aktk 0:e85788b14028 679 void TRP105FS::saveSetting(
aktk 0:e85788b14028 680 const char *filename
aktk 0:e85788b14028 681 )
aktk 0:e85788b14028 682 {
aktk 0:e85788b14028 683 FILE *fp;
aktk 0:e85788b14028 684 char *filepath;
aktk 0:e85788b14028 685 int fnnum = 0;
aktk 0:e85788b14028 686
aktk 0:e85788b14028 687 while (filename[fnnum] != 0) fnnum++;
aktk 0:e85788b14028 688 filepath = (char *)malloc((fnnum + 8) * sizeof(char)); // "/local/" are 7 char and \0 is 1 char.
aktk 0:e85788b14028 689
aktk 0:e85788b14028 690 sprintf(filepath, "/local/%s", filename);
aktk 0:e85788b14028 691 fp = fopen(filepath, "wb");
aktk 0:e85788b14028 692
aktk 0:e85788b14028 693 for(int i = 0; i < _ENUM; i++) {
aktk 3:b56e933bebc2 694 fwrite(&_Set[i].x, sizeof(unsigned short), 1, fp);
aktk 0:e85788b14028 695 fputc(0x2c, fp);
aktk 3:b56e933bebc2 696 fwrite(&_Set[i].y, sizeof(unsigned short), 1, fp);
aktk 0:e85788b14028 697 fputc(0x2c, fp);
aktk 0:e85788b14028 698 fwrite(&_Threshold[i], sizeof(unsigned short), 1, fp);
aktk 0:e85788b14028 699 fputc(0x3b, fp);
aktk 0:e85788b14028 700 }
aktk 13:16fc61b41eff 701 fwrite(&_Sample_Num, sizeof(unsigned short), 1, fp);
aktk 0:e85788b14028 702 fputc(0x3b, fp);
aktk 0:e85788b14028 703 for(int i = 0; i < _Sample_Num; i++) {
aktk 3:b56e933bebc2 704 fwrite(&_Sample_Set[i].x, sizeof(unsigned short), 1, fp);
aktk 0:e85788b14028 705 fputc(0x2c, fp);
aktk 3:b56e933bebc2 706 fwrite(&_Sample_Set[i].y, sizeof(unsigned short), 1, fp);
aktk 0:e85788b14028 707 fputc(0x3b, fp);
aktk 0:e85788b14028 708 }
aktk 0:e85788b14028 709 fclose(fp);
aktk 0:e85788b14028 710 free(filepath);
aktk 0:e85788b14028 711 }
aktk 0:e85788b14028 712
aktk 0:e85788b14028 713 void TRP105FS::loadSetting(
aktk 0:e85788b14028 714 const char *filename
aktk 0:e85788b14028 715 )
aktk 0:e85788b14028 716 {
aktk 0:e85788b14028 717 FILE *fp;
aktk 0:e85788b14028 718 char *filepath;
aktk 0:e85788b14028 719 char tmp;
aktk 0:e85788b14028 720 int fnnum = 0;
aktk 0:e85788b14028 721
aktk 0:e85788b14028 722 while (filename[fnnum] != 0) fnnum++;
aktk 0:e85788b14028 723 filepath = (char *)malloc((fnnum + 8) * sizeof(char)); // "/local/" are 7 char and \0 is 1 char.
aktk 0:e85788b14028 724
aktk 0:e85788b14028 725 sprintf(filepath, "/local/%s", filename);
aktk 0:e85788b14028 726 fp = fopen(filepath, "rb");
aktk 10:b50e4bb40571 727
aktk 0:e85788b14028 728 for(int i = 0; i < _ENUM; i++) {
aktk 0:e85788b14028 729
aktk 3:b56e933bebc2 730 fread(&_Set[i].x, sizeof(unsigned short), 1, fp);
aktk 0:e85788b14028 731 fread(&tmp, sizeof(char), 1, fp);
aktk 0:e85788b14028 732 #ifdef DEBUG3
aktk 3:b56e933bebc2 733 g_Serial_Signal.printf("%d%c", _Set[i].x, tmp);
aktk 0:e85788b14028 734 #endif
aktk 0:e85788b14028 735
aktk 3:b56e933bebc2 736 fread(&_Set[i].y, sizeof(unsigned short), 1, fp);
aktk 0:e85788b14028 737 fread(&tmp, sizeof(char), 1, fp);
aktk 0:e85788b14028 738 #ifdef DEBUG3
aktk 3:b56e933bebc2 739 g_Serial_Signal.printf("%d%c", _Set[i].y, tmp);
aktk 0:e85788b14028 740 #endif
aktk 0:e85788b14028 741
aktk 0:e85788b14028 742 fread(&_Threshold[i], sizeof(unsigned short), 1, fp);
aktk 0:e85788b14028 743 fread(&tmp, sizeof(char), 1, fp);
aktk 0:e85788b14028 744 #ifdef DEBUG3
aktk 0:e85788b14028 745 g_Serial_Signal.printf("%d%c\n",_Threshold[i], tmp);
aktk 0:e85788b14028 746 #endif
aktk 0:e85788b14028 747 }
aktk 0:e85788b14028 748
aktk 0:e85788b14028 749 fread(&_Sample_Num, sizeof(unsigned short), 1, fp);
aktk 0:e85788b14028 750 fread(&tmp, sizeof(char), 1, fp);
aktk 0:e85788b14028 751 #ifdef DEBUG3
aktk 0:e85788b14028 752 g_Serial_Signal.printf("%d%c\n",_Sample_Num, tmp);
aktk 0:e85788b14028 753 #endif
aktk 0:e85788b14028 754
aktk 0:e85788b14028 755 for(int i = 0; i < _Sample_Num; i++) {
aktk 3:b56e933bebc2 756 fread(&_Sample_Set[i].x, sizeof(unsigned short), 1, fp);
aktk 0:e85788b14028 757 fread(&tmp, sizeof(char),1,fp);
aktk 0:e85788b14028 758 #ifdef DEBUG3
aktk 3:b56e933bebc2 759 g_Serial_Signal.printf("%d%c", _Sample_Set[i].x, tmp);
aktk 0:e85788b14028 760 #endif
aktk 0:e85788b14028 761
aktk 3:b56e933bebc2 762 fread(&_Sample_Set[i].y, sizeof(unsigned short), 1, fp);
aktk 0:e85788b14028 763 fread(&tmp, sizeof(char),1,fp);
aktk 0:e85788b14028 764 #ifdef DEBUG3
aktk 3:b56e933bebc2 765 g_Serial_Signal.printf("%d%c", _Sample_Set[i].y, tmp);
aktk 0:e85788b14028 766 #endif
aktk 0:e85788b14028 767 }
aktk 0:e85788b14028 768 fclose(fp);
aktk 0:e85788b14028 769 free(filepath);
aktk 0:e85788b14028 770 }
aktk 14:a99bf22b919d 771 #endif// HAS_LOCAL_FILE_SYSTEM
aktk 14:a99bf22b919d 772
aktk 14:a99bf22b919d 773
aktk 14:a99bf22b919d 774 void TRP105FS::saveSetting_intoSerial(
aktk 14:a99bf22b919d 775 Serial* com
aktk 14:a99bf22b919d 776 )
aktk 14:a99bf22b919d 777 {
aktk 14:a99bf22b919d 778 char buffer[3];
aktk 14:a99bf22b919d 779
aktk 14:a99bf22b919d 780 for(int i = 0; i < _ENUM; i++) {
aktk 14:a99bf22b919d 781 //_Set.X
aktk 14:a99bf22b919d 782 buffer[0] = 0xFF & (_Set[i].x >> 8);
aktk 14:a99bf22b919d 783 buffer[1] = 0xFF & (_Set[i].x);
aktk 14:a99bf22b919d 784 buffer[2] = 0x2c;
aktk 14:a99bf22b919d 785 for(int j = 0; j < 3; j++) com->putc(buffer[j]);
aktk 14:a99bf22b919d 786 while(1) {
aktk 14:a99bf22b919d 787 if(com->getc() == 0x06) break; //wait ACK
aktk 14:a99bf22b919d 788 }
aktk 14:a99bf22b919d 789
aktk 14:a99bf22b919d 790 //Set Y
aktk 14:a99bf22b919d 791 buffer[0] = 0xFF & (_Set[i].y >> 8);
aktk 14:a99bf22b919d 792 buffer[1] = 0xFF & (_Set[i].y);
aktk 14:a99bf22b919d 793 buffer[2] = 0x2c;
aktk 14:a99bf22b919d 794 for(int j = 0; j < 3; j++) com->putc(buffer[j]);
aktk 14:a99bf22b919d 795 while(1) {
aktk 14:a99bf22b919d 796 if(com->getc() == 0x06) break; //wait ACK
aktk 14:a99bf22b919d 797 }
aktk 14:a99bf22b919d 798
aktk 14:a99bf22b919d 799 //Threshold
aktk 14:a99bf22b919d 800 buffer[0] = 0xFF & (_Threshold[i] >> 8);
aktk 14:a99bf22b919d 801 buffer[1] = 0xFF & (_Threshold[i]);
aktk 14:a99bf22b919d 802 buffer[2] = 0x3b;
aktk 14:a99bf22b919d 803 for(int j = 0; j < 3; j++) com->putc(buffer[j]);
aktk 14:a99bf22b919d 804 while(1) {
aktk 14:a99bf22b919d 805 if(com->getc() == 0x06) break; //wait ACK
aktk 14:a99bf22b919d 806 }
aktk 14:a99bf22b919d 807 }
tanaken0605 23:772a9736ee59 808
aktk 14:a99bf22b919d 809 //Sample Num
aktk 14:a99bf22b919d 810 buffer[0] = 0xFF & (_Sample_Num >> 8);
aktk 14:a99bf22b919d 811 buffer[1] = 0xFF & (_Sample_Num);
aktk 14:a99bf22b919d 812 buffer[2] = 0x3b;
aktk 14:a99bf22b919d 813 for(int j = 0; j < 3; j++) com->putc(buffer[j]);
aktk 14:a99bf22b919d 814 while(1) {
aktk 14:a99bf22b919d 815 if(com->getc() == 0x06) break; //wait ACK
aktk 14:a99bf22b919d 816 }
aktk 14:a99bf22b919d 817
aktk 14:a99bf22b919d 818 for(int i = 0; i < _Sample_Num; i++) {
aktk 14:a99bf22b919d 819 //Sample Set X
aktk 14:a99bf22b919d 820 buffer[0] = 0xFF & (_Sample_Set[i].x >> 8);
aktk 14:a99bf22b919d 821 buffer[1] = 0xFF & (_Sample_Set[i].x);
aktk 14:a99bf22b919d 822 buffer[2] = 0x2c;
aktk 14:a99bf22b919d 823 for(int j = 0; j < 3; j++) com->putc(buffer[j]);
aktk 14:a99bf22b919d 824 while(1) {
aktk 14:a99bf22b919d 825 if(com->getc() == 0x06) break; //wait ACK
aktk 14:a99bf22b919d 826 }
tanaken0605 23:772a9736ee59 827
aktk 14:a99bf22b919d 828 //Sample Set Y
aktk 14:a99bf22b919d 829 buffer[0] = 0xFF & (_Sample_Set[i].x >> 8);
aktk 14:a99bf22b919d 830 buffer[1] = 0xFF & (_Sample_Set[i].x);
aktk 14:a99bf22b919d 831 buffer[2] = 0x2c;
aktk 14:a99bf22b919d 832 for(int j = 0; j < 3; j++) com->putc(buffer[j]);
aktk 14:a99bf22b919d 833 while(1) {
aktk 14:a99bf22b919d 834 if(com->getc() == 0x06) break; //wait ACK
aktk 14:a99bf22b919d 835 }
aktk 14:a99bf22b919d 836 }
aktk 14:a99bf22b919d 837 com->putc(0x04); //send End of Transmission
aktk 14:a99bf22b919d 838 }
aktk 0:e85788b14028 839
aktk 12:db5110d9d494 840 void TRP105FS::loadSetting_fromSerial(
aktk 12:db5110d9d494 841 Serial* com
aktk 12:db5110d9d494 842 )
aktk 12:db5110d9d494 843 {
aktk 12:db5110d9d494 844 char buffer[3];
aktk 12:db5110d9d494 845
aktk 14:a99bf22b919d 846
aktk 12:db5110d9d494 847 for(int i = 0; i < _ENUM; i++) {
aktk 14:a99bf22b919d 848 //_Set.X
aktk 12:db5110d9d494 849 for(int j = 0; j < 3; j++) {
aktk 12:db5110d9d494 850 buffer[j] = com->getc();
aktk 12:db5110d9d494 851 }
aktk 13:16fc61b41eff 852 com->putc(0x06); //return ACK
aktk 13:16fc61b41eff 853 _Set[i].x = static_cast<unsigned short>(0xFFFF & (buffer[1] << 8 | buffer[0]));
aktk 12:db5110d9d494 854
aktk 14:a99bf22b919d 855 //_Set/Y
aktk 12:db5110d9d494 856 for(int j = 0; j < 3; j++) {
aktk 13:16fc61b41eff 857 buffer[j] = com->getc();
aktk 13:16fc61b41eff 858 }
aktk 13:16fc61b41eff 859 com->putc(0x06); //return ACK
aktk 13:16fc61b41eff 860 _Set[i].y = static_cast<unsigned short>(0xFFFF & (buffer[1] << 8 | buffer[0]));
aktk 13:16fc61b41eff 861
aktk 14:a99bf22b919d 862 //_Threshold
aktk 13:16fc61b41eff 863 for(int j = 0; j < 3; j++) {
aktk 12:db5110d9d494 864 buffer[j] = com->getc();
aktk 12:db5110d9d494 865 }
aktk 13:16fc61b41eff 866 com->putc(0x06); //return ACK
aktk 13:16fc61b41eff 867 _Threshold[i] = static_cast<unsigned short>(0xFFFF & (buffer[1] << 8 | buffer[0]));
aktk 12:db5110d9d494 868 }
aktk 12:db5110d9d494 869
aktk 14:a99bf22b919d 870 //_Sample_Num
aktk 12:db5110d9d494 871 for(int j = 0; j < 3; j++) {
aktk 12:db5110d9d494 872 buffer[j] = com->getc();
aktk 12:db5110d9d494 873 }
aktk 13:16fc61b41eff 874 com->putc(0x06); //return ACK
aktk 13:16fc61b41eff 875 _Sample_Num = static_cast<unsigned short>(0xFFFF & (buffer[1] << 8 | buffer[0]));
aktk 12:db5110d9d494 876
aktk 12:db5110d9d494 877 for(int i = 0; i < _Sample_Num; i++) {
aktk 13:16fc61b41eff 878 //Sample Set X
aktk 12:db5110d9d494 879 for(int j = 0; j < 3; j++) {
aktk 12:db5110d9d494 880 buffer[j] = com->getc();
aktk 12:db5110d9d494 881 }
aktk 13:16fc61b41eff 882 com->putc(0x06); //return ACK
aktk 13:16fc61b41eff 883 _Sample_Set[i].x= static_cast<unsigned short>(0xFFFF & (buffer[1] << 8 | buffer[0]));
aktk 13:16fc61b41eff 884
aktk 13:16fc61b41eff 885 //Sample Set Y
aktk 12:db5110d9d494 886 for(int j = 0; j < 3; j++) {
aktk 12:db5110d9d494 887 buffer[j] = com->getc();
aktk 12:db5110d9d494 888 }
aktk 13:16fc61b41eff 889 if(i != _Sample_Num - 1)
aktk 13:16fc61b41eff 890 com->putc(0x06); //return ACK
aktk 13:16fc61b41eff 891 else
aktk 13:16fc61b41eff 892 com->putc(0x04); //return EOT
aktk 13:16fc61b41eff 893 _Sample_Set[i].y= static_cast<unsigned short>(0xFFFF & (buffer[1] << 8 | buffer[0]));
aktk 12:db5110d9d494 894 }
aktk 12:db5110d9d494 895 }
aktk 12:db5110d9d494 896
aktk 4:701f958d137a 897
aktk 14:a99bf22b919d 898 #ifdef HAS_LOCAL_FILE_SYSTEM
aktk 0:e85788b14028 899 void TRP105FS::_printOutData(unsigned short *arg, int num, char* name)
aktk 0:e85788b14028 900 {
aktk 0:e85788b14028 901 FILE *fp;
aktk 0:e85788b14028 902 fp = fopen("/local/varlog.txt", "a"); // open file in add mode
aktk 0:e85788b14028 903 fprintf(fp, "%10s\n", name);
aktk 0:e85788b14028 904 for(int i = 0; i < num; i++) {
aktk 0:e85788b14028 905 fprintf(fp, "%d, ", arg[i]);
aktk 0:e85788b14028 906 }
aktk 0:e85788b14028 907 fprintf(fp, "\n");
aktk 0:e85788b14028 908 fclose(fp);
aktk 0:e85788b14028 909 }
aktk 0:e85788b14028 910 void TRP105FS::_printOutData(double *arg, int num, char* name)
aktk 0:e85788b14028 911 {
aktk 0:e85788b14028 912 FILE *fp;
aktk 0:e85788b14028 913
aktk 0:e85788b14028 914 fp = fopen("/local/varlog.txt", "a"); // open file in add mode
aktk 0:e85788b14028 915 fprintf(fp, "%10s\n", name);
aktk 0:e85788b14028 916 for(int i = 0; i < num; i++) {
aktk 0:e85788b14028 917 fprintf(fp, "%.2f, ", arg[i]);
aktk 0:e85788b14028 918 }
aktk 0:e85788b14028 919 fprintf(fp, "\n");
aktk 0:e85788b14028 920 fclose(fp);
aktk 0:e85788b14028 921 }
aktk 0:e85788b14028 922 void TRP105FS::_printOutData(VDset *arg, int num, char* name)
aktk 0:e85788b14028 923 {
aktk 0:e85788b14028 924 FILE *fp;
aktk 0:e85788b14028 925
aktk 0:e85788b14028 926 fp = fopen("/local/varlog.txt", "a"); // open file in add mode
aktk 0:e85788b14028 927 fprintf(fp, "%10s\n", name);
aktk 0:e85788b14028 928 for(int i = 0; i < num; i++) {
aktk 3:b56e933bebc2 929 fprintf(fp, "%d, ", arg[i].y);
aktk 0:e85788b14028 930 }
aktk 0:e85788b14028 931 fprintf(fp, "\n");
aktk 0:e85788b14028 932 fclose(fp);
aktk 14:a99bf22b919d 933 }
aktk 14:a99bf22b919d 934 #endif// HAS_LOCAL_FILE_SYSTEM