nothing to say

Dependencies:   mbed

Committer:
withboobs
Date:
Wed Feb 21 18:13:45 2018 +0000
Revision:
0:ca29dd5bc1d8
nothing to say

Who changed what in which revision?

UserRevisionLine numberNew contents of line
withboobs 0:ca29dd5bc1d8 1 #include "mbed.h"
withboobs 0:ca29dd5bc1d8 2 #include "heimann32x32.h"
withboobs 0:ca29dd5bc1d8 3
withboobs 0:ca29dd5bc1d8 4 #include "heimann32x32_table.cpp"
withboobs 0:ca29dd5bc1d8 5
withboobs 0:ca29dd5bc1d8 6 HTPA32x32::HTPA32x32(I2C * _i2c, I2C * _i2ce, uint8_t addr1, uint8_t addr2)
withboobs 0:ca29dd5bc1d8 7 {
withboobs 0:ca29dd5bc1d8 8 i2c = _i2c;
withboobs 0:ca29dd5bc1d8 9 // i2c->frequency(400000);
withboobs 0:ca29dd5bc1d8 10 i2c->frequency(1000000);
withboobs 0:ca29dd5bc1d8 11
withboobs 0:ca29dd5bc1d8 12 i2ce = _i2ce;
withboobs 0:ca29dd5bc1d8 13 i2ce->frequency(400000);
withboobs 0:ca29dd5bc1d8 14
withboobs 0:ca29dd5bc1d8 15 i2c_addr_htpa = addr1;
withboobs 0:ca29dd5bc1d8 16 i2c_addr_eeprom = addr2;
withboobs 0:ca29dd5bc1d8 17
withboobs 0:ca29dd5bc1d8 18 proc = HTPA_PROC_ELOFFS | HTPA_PROC_THOFFS | HTPA_PROC_CONVERT;
withboobs 0:ca29dd5bc1d8 19 available = 0;
withboobs 0:ca29dd5bc1d8 20 }
withboobs 0:ca29dd5bc1d8 21
withboobs 0:ca29dd5bc1d8 22 uint8_t
withboobs 0:ca29dd5bc1d8 23 HTPA32x32::ADC( void )
withboobs 0:ca29dd5bc1d8 24 {
withboobs 0:ca29dd5bc1d8 25 return mbit;
withboobs 0:ca29dd5bc1d8 26 }
withboobs 0:ca29dd5bc1d8 27
withboobs 0:ca29dd5bc1d8 28 uint8_t
withboobs 0:ca29dd5bc1d8 29 HTPA32x32::ADC( uint8_t m )
withboobs 0:ca29dd5bc1d8 30 {
withboobs 0:ca29dd5bc1d8 31 char data_write[2];
withboobs 0:ca29dd5bc1d8 32 data_write[0] = HTP_TRIM1_ADC;
withboobs 0:ca29dd5bc1d8 33
withboobs 0:ca29dd5bc1d8 34 if (m < 4)
withboobs 0:ca29dd5bc1d8 35 m = 4;
withboobs 0:ca29dd5bc1d8 36 if (m > 12)
withboobs 0:ca29dd5bc1d8 37 m = 12;
withboobs 0:ca29dd5bc1d8 38 mbit = m;
withboobs 0:ca29dd5bc1d8 39
withboobs 0:ca29dd5bc1d8 40 data_write[1] = m & TRIM1_ADC_MASK;
withboobs 0:ca29dd5bc1d8 41
withboobs 0:ca29dd5bc1d8 42 i2c->write((int) i2c_addr_htpa, data_write, 2, 1);
withboobs 0:ca29dd5bc1d8 43
withboobs 0:ca29dd5bc1d8 44 return mbit;
withboobs 0:ca29dd5bc1d8 45 }
withboobs 0:ca29dd5bc1d8 46
withboobs 0:ca29dd5bc1d8 47 uint8_t HTPA32x32::BIAS ( void )
withboobs 0:ca29dd5bc1d8 48 {
withboobs 0:ca29dd5bc1d8 49 return bias;
withboobs 0:ca29dd5bc1d8 50 }
withboobs 0:ca29dd5bc1d8 51
withboobs 0:ca29dd5bc1d8 52 uint8_t HTPA32x32::BIAS ( uint8_t m )
withboobs 0:ca29dd5bc1d8 53 {
withboobs 0:ca29dd5bc1d8 54 char data_write[2];
withboobs 0:ca29dd5bc1d8 55
withboobs 0:ca29dd5bc1d8 56 data_write[0] = HTP_TRIM2_BIAS1;
withboobs 0:ca29dd5bc1d8 57 if (m > 31)
withboobs 0:ca29dd5bc1d8 58 m = 31;
withboobs 0:ca29dd5bc1d8 59 bias = m;
withboobs 0:ca29dd5bc1d8 60 data_write[1] = m & TRIM_BIAS_MASK;
withboobs 0:ca29dd5bc1d8 61 i2c->write(i2c_addr_htpa, data_write, 2, 1);
withboobs 0:ca29dd5bc1d8 62
withboobs 0:ca29dd5bc1d8 63 data_write[0] = HTP_TRIM3_BIAS2;
withboobs 0:ca29dd5bc1d8 64 i2c->write(i2c_addr_htpa, data_write, 2, 1);
withboobs 0:ca29dd5bc1d8 65 return bias;
withboobs 0:ca29dd5bc1d8 66 }
withboobs 0:ca29dd5bc1d8 67
withboobs 0:ca29dd5bc1d8 68 uint8_t HTPA32x32::CLOCK( void )
withboobs 0:ca29dd5bc1d8 69 {
withboobs 0:ca29dd5bc1d8 70 return clk;
withboobs 0:ca29dd5bc1d8 71 }
withboobs 0:ca29dd5bc1d8 72
withboobs 0:ca29dd5bc1d8 73 uint8_t HTPA32x32::CLOCK( uint8_t m )
withboobs 0:ca29dd5bc1d8 74 {
withboobs 0:ca29dd5bc1d8 75 char data_write[2];
withboobs 0:ca29dd5bc1d8 76 data_write[0] = HTP_TRIM4_FREQ;
withboobs 0:ca29dd5bc1d8 77 if (m > 63)
withboobs 0:ca29dd5bc1d8 78 m = 63;
withboobs 0:ca29dd5bc1d8 79 clk = m;
withboobs 0:ca29dd5bc1d8 80
withboobs 0:ca29dd5bc1d8 81 data_write[1] = m & TRIM_FREQ_MASK;
withboobs 0:ca29dd5bc1d8 82 i2c->write(i2c_addr_htpa, data_write, 2, 1);
withboobs 0:ca29dd5bc1d8 83
withboobs 0:ca29dd5bc1d8 84 return clk;
withboobs 0:ca29dd5bc1d8 85 }
withboobs 0:ca29dd5bc1d8 86
withboobs 0:ca29dd5bc1d8 87 uint8_t HTPA32x32::PU( void )
withboobs 0:ca29dd5bc1d8 88 {
withboobs 0:ca29dd5bc1d8 89 return (pu>>4);
withboobs 0:ca29dd5bc1d8 90 }
withboobs 0:ca29dd5bc1d8 91
withboobs 0:ca29dd5bc1d8 92 uint8_t HTPA32x32::PU( uint8_t m )
withboobs 0:ca29dd5bc1d8 93 {
withboobs 0:ca29dd5bc1d8 94 char data_write[2];
withboobs 0:ca29dd5bc1d8 95 data_write[0] = HTP_TRIM7_PU;
withboobs 0:ca29dd5bc1d8 96 if (m == 1 || m ==2 || m==4 || m==8)
withboobs 0:ca29dd5bc1d8 97 {
withboobs 0:ca29dd5bc1d8 98 pu = m<<4 | m;
withboobs 0:ca29dd5bc1d8 99 data_write[1] = pu;
withboobs 0:ca29dd5bc1d8 100 i2c->write(i2c_addr_htpa, data_write, 2, 1);
withboobs 0:ca29dd5bc1d8 101 }
withboobs 0:ca29dd5bc1d8 102
withboobs 0:ca29dd5bc1d8 103 return pu;
withboobs 0:ca29dd5bc1d8 104 }
withboobs 0:ca29dd5bc1d8 105
withboobs 0:ca29dd5bc1d8 106 uint8_t HTPA32x32::BPA ( void )
withboobs 0:ca29dd5bc1d8 107 {
withboobs 0:ca29dd5bc1d8 108 return bpa;
withboobs 0:ca29dd5bc1d8 109 }
withboobs 0:ca29dd5bc1d8 110
withboobs 0:ca29dd5bc1d8 111 uint8_t HTPA32x32::BPA ( uint8_t m )
withboobs 0:ca29dd5bc1d8 112 {
withboobs 0:ca29dd5bc1d8 113 char data_write[2];
withboobs 0:ca29dd5bc1d8 114 data_write[0] = HTP_TRIM5_BPA1;
withboobs 0:ca29dd5bc1d8 115
withboobs 0:ca29dd5bc1d8 116 if (m > 31)
withboobs 0:ca29dd5bc1d8 117 m = 31;
withboobs 0:ca29dd5bc1d8 118 bpa = m & TRIM_BPA_MASK;
withboobs 0:ca29dd5bc1d8 119 data_write[1] = bpa;
withboobs 0:ca29dd5bc1d8 120 i2c->write(i2c_addr_htpa, data_write, 2, 1);
withboobs 0:ca29dd5bc1d8 121
withboobs 0:ca29dd5bc1d8 122 data_write[0] = HTP_TRIM6_BPA2;
withboobs 0:ca29dd5bc1d8 123 i2c->write(i2c_addr_htpa, data_write, 2, 1);
withboobs 0:ca29dd5bc1d8 124
withboobs 0:ca29dd5bc1d8 125 return bpa;
withboobs 0:ca29dd5bc1d8 126 }
withboobs 0:ca29dd5bc1d8 127
withboobs 0:ca29dd5bc1d8 128 void HTPA32x32::read_eeprom(uint8_t HiReg, uint8_t LoReg, char *data_ptr, int DCnt)
withboobs 0:ca29dd5bc1d8 129 {
withboobs 0:ca29dd5bc1d8 130 char data_write[2];
withboobs 0:ca29dd5bc1d8 131 data_write[0] = HiReg;
withboobs 0:ca29dd5bc1d8 132 data_write[1] = LoReg;
withboobs 0:ca29dd5bc1d8 133 i2ce->write((int) i2c_addr_eeprom, data_write,2,1);
withboobs 0:ca29dd5bc1d8 134
withboobs 0:ca29dd5bc1d8 135 while (DCnt)
withboobs 0:ca29dd5bc1d8 136 {
withboobs 0:ca29dd5bc1d8 137 if (DCnt > 32)
withboobs 0:ca29dd5bc1d8 138 {
withboobs 0:ca29dd5bc1d8 139 i2ce->read ((int) i2c_addr_eeprom, data_ptr, 32, 0);
withboobs 0:ca29dd5bc1d8 140 DCnt -= 32;
withboobs 0:ca29dd5bc1d8 141 data_ptr += 32;
withboobs 0:ca29dd5bc1d8 142 }
withboobs 0:ca29dd5bc1d8 143 else
withboobs 0:ca29dd5bc1d8 144 {
withboobs 0:ca29dd5bc1d8 145 i2ce->read ((int) i2c_addr_eeprom, data_ptr, DCnt, 0);
withboobs 0:ca29dd5bc1d8 146 DCnt=0;
withboobs 0:ca29dd5bc1d8 147 }
withboobs 0:ca29dd5bc1d8 148 }
withboobs 0:ca29dd5bc1d8 149 }
withboobs 0:ca29dd5bc1d8 150
withboobs 0:ca29dd5bc1d8 151 void HTPA32x32::download_PIJ( void )
withboobs 0:ca29dd5bc1d8 152 {
withboobs 0:ca29dd5bc1d8 153 int8_t i,j;
withboobs 0:ca29dd5bc1d8 154 uint16_t * dummyPix = (uint16_t *) PixC;
withboobs 0:ca29dd5bc1d8 155 float rcp_eps, a, b;
withboobs 0:ca29dd5bc1d8 156
withboobs 0:ca29dd5bc1d8 157 read_eeprom(HTP_EEPROM_PIX_HI, HTP_EEPROM_PIX_LO, (char *) dummyPix, 2048);
withboobs 0:ca29dd5bc1d8 158 read_eeprom(HTP_EEPROM_THGRAD_HI, HTP_EEPROM_THGRAD_LO, (char *) ThGrad, 2048);
withboobs 0:ca29dd5bc1d8 159 read_eeprom(HTP_EEPROM_THOFFS_HI, HTP_EEPROM_THOFFS_LO, (char *) ThOffs, 2048);
withboobs 0:ca29dd5bc1d8 160
withboobs 0:ca29dd5bc1d8 161 rcp_eps = 100.0 / epsilon;
withboobs 0:ca29dd5bc1d8 162 a = (PixCmax - PixCmin) / (float) 65535.0 * rcp_eps;
withboobs 0:ca29dd5bc1d8 163 b = rcp_eps * PixCmin;
withboobs 0:ca29dd5bc1d8 164
withboobs 0:ca29dd5bc1d8 165 /* top */
withboobs 0:ca29dd5bc1d8 166 for (i=31; i>=0; i--)
withboobs 0:ca29dd5bc1d8 167 {
withboobs 0:ca29dd5bc1d8 168 for (j=31; j>=0; j--)
withboobs 0:ca29dd5bc1d8 169 {
withboobs 0:ca29dd5bc1d8 170 PixC[i*32 + j] = (float) dummyPix[i*32 + j];
withboobs 0:ca29dd5bc1d8 171 PixC[i*32 + j] = a * PixC[i*32 + j] + b;
withboobs 0:ca29dd5bc1d8 172 PixC[i*32 + j] = 1e8/PixC[i*32 + j];
withboobs 0:ca29dd5bc1d8 173 }
withboobs 0:ca29dd5bc1d8 174 }
withboobs 0:ca29dd5bc1d8 175
withboobs 0:ca29dd5bc1d8 176 return;
withboobs 0:ca29dd5bc1d8 177 }
withboobs 0:ca29dd5bc1d8 178
withboobs 0:ca29dd5bc1d8 179 void HTPA32x32::init( void )
withboobs 0:ca29dd5bc1d8 180 {
withboobs 0:ca29dd5bc1d8 181 uint8_t raw[5] = {0};
withboobs 0:ca29dd5bc1d8 182 read_eeprom(HTP_EEPROM_CALIB_HI, HTP_EEPROM_CALIB_LO, (char *) raw, 5);
withboobs 0:ca29dd5bc1d8 183 mbit = raw[0];
withboobs 0:ca29dd5bc1d8 184 bias = raw[1];
withboobs 0:ca29dd5bc1d8 185 clk = raw[2];
withboobs 0:ca29dd5bc1d8 186 bpa = raw[3];
withboobs 0:ca29dd5bc1d8 187 pu = raw[4];
withboobs 0:ca29dd5bc1d8 188
withboobs 0:ca29dd5bc1d8 189 read_eeprom(HTP_EEPROM_PTAT_HI, HTP_EEPROM_PTAT_GRAD_LO, (char *) &PTATgrad, 4);
withboobs 0:ca29dd5bc1d8 190 read_eeprom(HTP_EEPROM_PTAT_HI, HTP_EEPROM_PTAT_OFFS_LO, (char *) &PTAToffs, 4);
withboobs 0:ca29dd5bc1d8 191 read_eeprom(HTP_EEPROM_PIXC_HI, HTP_EEPROM_PIXCMIN_LO, (char *) &PixCmin, 4);
withboobs 0:ca29dd5bc1d8 192 read_eeprom(HTP_EEPROM_PIXC_HI, HTP_EEPROM_PIXCMAX_LO, (char *) &PixCmax, 4);
withboobs 0:ca29dd5bc1d8 193 read_eeprom(HTP_EEPROM_TN_EPS_HI, HTP_EEPROM_TN_LO, (char *) raw, 2);
withboobs 0:ca29dd5bc1d8 194 tn=raw[0];
withboobs 0:ca29dd5bc1d8 195 epsilon=raw[1];
withboobs 0:ca29dd5bc1d8 196 read_eeprom(HTP_EEPROM_GRADSCALE_HI, HTP_EEPROM_GRADSCALE_LO, (char *) &gradScale, 1);
withboobs 0:ca29dd5bc1d8 197
withboobs 0:ca29dd5bc1d8 198 download_PIJ();
withboobs 0:ca29dd5bc1d8 199
withboobs 0:ca29dd5bc1d8 200 Ta_dK = Ta_dK_prev = Ta_dK_prev_prev = 0;
withboobs 0:ca29dd5bc1d8 201 return;
withboobs 0:ca29dd5bc1d8 202 }
withboobs 0:ca29dd5bc1d8 203
withboobs 0:ca29dd5bc1d8 204 uint8_t HTPA32x32::end ( )
withboobs 0:ca29dd5bc1d8 205 {
withboobs 0:ca29dd5bc1d8 206 uint8_t rval = HTP_STATUS;
withboobs 0:ca29dd5bc1d8 207 i2c->write(i2c_addr_htpa, (char *) &rval, 1, 1);
withboobs 0:ca29dd5bc1d8 208 i2c->read (i2c_addr_htpa, (char *) &rval, 1, 0);
withboobs 0:ca29dd5bc1d8 209 rval &= STATUS_EOC;
withboobs 0:ca29dd5bc1d8 210 return rval;
withboobs 0:ca29dd5bc1d8 211 }
withboobs 0:ca29dd5bc1d8 212
withboobs 0:ca29dd5bc1d8 213 void HTPA32x32::start()
withboobs 0:ca29dd5bc1d8 214 {
withboobs 0:ca29dd5bc1d8 215 char data_write[2] = { HTP_CONFIG, CONFIG_WAKEUP | CONFIG_START };
withboobs 0:ca29dd5bc1d8 216 b = 0;
withboobs 0:ca29dd5bc1d8 217 i2c->write(i2c_addr_htpa, data_write, 2, 1);
withboobs 0:ca29dd5bc1d8 218 return;
withboobs 0:ca29dd5bc1d8 219 }
withboobs 0:ca29dd5bc1d8 220
withboobs 0:ca29dd5bc1d8 221 void HTPA32x32::readb()
withboobs 0:ca29dd5bc1d8 222 {
withboobs 0:ca29dd5bc1d8 223 uint8_t
withboobs 0:ca29dd5bc1d8 224 i, j, data_write[2], data_buffer[258];
withboobs 0:ca29dd5bc1d8 225
withboobs 0:ca29dd5bc1d8 226 if (!b)
withboobs 0:ca29dd5bc1d8 227 {
withboobs 0:ca29dd5bc1d8 228 Ta_dK_prev_prev = Ta_dK_prev;
withboobs 0:ca29dd5bc1d8 229 Ta_dK_prev = Ta_dK;
withboobs 0:ca29dd5bc1d8 230 Ta_dK = PTAToffs;
withboobs 0:ca29dd5bc1d8 231 available = 0;
withboobs 0:ca29dd5bc1d8 232 }
withboobs 0:ca29dd5bc1d8 233
withboobs 0:ca29dd5bc1d8 234 /**
withboobs 0:ca29dd5bc1d8 235 * download top
withboobs 0:ca29dd5bc1d8 236 */
withboobs 0:ca29dd5bc1d8 237 data_write[0] = HTP_DATA1;
withboobs 0:ca29dd5bc1d8 238 i2c->write(i2c_addr_htpa, (char *) data_write, 1, 1);
withboobs 0:ca29dd5bc1d8 239 i2c->read (i2c_addr_htpa, (char *) data_buffer, 258, 0);
withboobs 0:ca29dd5bc1d8 240
withboobs 0:ca29dd5bc1d8 241 if (b < 4)
withboobs 0:ca29dd5bc1d8 242 {
withboobs 0:ca29dd5bc1d8 243 // process
withboobs 0:ca29dd5bc1d8 244 Ta_dK += ( (data_buffer[0]<<5) + (data_buffer[1]>>3) ) * PTATgrad;
withboobs 0:ca29dd5bc1d8 245 for(i=0; i<4; i++)
withboobs 0:ca29dd5bc1d8 246 {
withboobs 0:ca29dd5bc1d8 247 for (j=0; j<32; j++)
withboobs 0:ca29dd5bc1d8 248 {
withboobs 0:ca29dd5bc1d8 249 // endianess flip-flopping
withboobs 0:ca29dd5bc1d8 250 uint8_t * d = (uint8_t *) &Data[i * 32 + j + b*128];
withboobs 0:ca29dd5bc1d8 251 d[0] = data_buffer[64*i + 2*j + 3]; // LO
withboobs 0:ca29dd5bc1d8 252 d[1] = data_buffer[64*i + 2*j + 2]; // HI
withboobs 0:ca29dd5bc1d8 253 }
withboobs 0:ca29dd5bc1d8 254 }
withboobs 0:ca29dd5bc1d8 255 }
withboobs 0:ca29dd5bc1d8 256 else
withboobs 0:ca29dd5bc1d8 257 {
withboobs 0:ca29dd5bc1d8 258 /* electrical offsets */
withboobs 0:ca29dd5bc1d8 259 for(i=0; i<4; i++)
withboobs 0:ca29dd5bc1d8 260 {
withboobs 0:ca29dd5bc1d8 261 for (j=0; j<32; j++)
withboobs 0:ca29dd5bc1d8 262 {
withboobs 0:ca29dd5bc1d8 263 // endianess flip-flopping
withboobs 0:ca29dd5bc1d8 264 uint8_t * d = (uint8_t *) &ElOffs[i * 32 + j ];
withboobs 0:ca29dd5bc1d8 265 d[0] = data_buffer[64*i + 2*j + 3]; // LO
withboobs 0:ca29dd5bc1d8 266 d[1] = data_buffer[64*i + 2*j + 2]; // HI
withboobs 0:ca29dd5bc1d8 267 }
withboobs 0:ca29dd5bc1d8 268 }
withboobs 0:ca29dd5bc1d8 269 }
withboobs 0:ca29dd5bc1d8 270
withboobs 0:ca29dd5bc1d8 271 /**
withboobs 0:ca29dd5bc1d8 272 * download bottom
withboobs 0:ca29dd5bc1d8 273 */
withboobs 0:ca29dd5bc1d8 274 data_write[0] = HTP_DATA2;
withboobs 0:ca29dd5bc1d8 275 i2c->write(i2c_addr_htpa, (char *) data_write, 1, 1);
withboobs 0:ca29dd5bc1d8 276 i2c->read (i2c_addr_htpa, (char *) data_buffer, 258, 0);
withboobs 0:ca29dd5bc1d8 277 if (b<4)
withboobs 0:ca29dd5bc1d8 278 {
withboobs 0:ca29dd5bc1d8 279 // process temperatures
withboobs 0:ca29dd5bc1d8 280 Ta_dK += ( (data_buffer[0]<<5) + (data_buffer[1]>>3) ) * PTATgrad;
withboobs 0:ca29dd5bc1d8 281 for(i=0; i<4; i++)
withboobs 0:ca29dd5bc1d8 282 {
withboobs 0:ca29dd5bc1d8 283 for (j=0; j<32; j++)
withboobs 0:ca29dd5bc1d8 284 {
withboobs 0:ca29dd5bc1d8 285 // endianess flip-flopping
withboobs 0:ca29dd5bc1d8 286 uint8_t * d = (uint8_t *) &Data[(3-i) * 32 + j + (7-b)*128];
withboobs 0:ca29dd5bc1d8 287 d[0] = data_buffer[64*i + 2*j + 3]; // LO
withboobs 0:ca29dd5bc1d8 288 d[1] = data_buffer[64*i + 2*j + 2]; // HI
withboobs 0:ca29dd5bc1d8 289 }
withboobs 0:ca29dd5bc1d8 290 }
withboobs 0:ca29dd5bc1d8 291 }
withboobs 0:ca29dd5bc1d8 292 else
withboobs 0:ca29dd5bc1d8 293 {
withboobs 0:ca29dd5bc1d8 294 /* electrical offsets */
withboobs 0:ca29dd5bc1d8 295 for(i=0; i<4; i++)
withboobs 0:ca29dd5bc1d8 296 {
withboobs 0:ca29dd5bc1d8 297 for (j=0; j<32; j++)
withboobs 0:ca29dd5bc1d8 298 {
withboobs 0:ca29dd5bc1d8 299 // endianess flip-flopping
withboobs 0:ca29dd5bc1d8 300 uint8_t * d = (uint8_t *) &ElOffs[(3-i) * 32 + j + 128];
withboobs 0:ca29dd5bc1d8 301 d[0] = data_buffer[64*i + 2*j + 3]; // LO
withboobs 0:ca29dd5bc1d8 302 d[1] = data_buffer[64*i + 2*j + 2]; // HI
withboobs 0:ca29dd5bc1d8 303 }
withboobs 0:ca29dd5bc1d8 304 }
withboobs 0:ca29dd5bc1d8 305 }
withboobs 0:ca29dd5bc1d8 306
withboobs 0:ca29dd5bc1d8 307 // initiate conversion for next call to readb:
withboobs 0:ca29dd5bc1d8 308 data_write[0] = HTP_CONFIG;
withboobs 0:ca29dd5bc1d8 309 data_write[1] = CONFIG_WAKEUP | CONFIG_START;
withboobs 0:ca29dd5bc1d8 310 if (proc & HTPA_PROC_ELOFFS)
withboobs 0:ca29dd5bc1d8 311 b = (b+1) % 5;
withboobs 0:ca29dd5bc1d8 312 else
withboobs 0:ca29dd5bc1d8 313 b = (b+1) % 4;
withboobs 0:ca29dd5bc1d8 314
withboobs 0:ca29dd5bc1d8 315 if (b<4)
withboobs 0:ca29dd5bc1d8 316 {
withboobs 0:ca29dd5bc1d8 317 data_write[1] |= ((b & 0x03)<<4);
withboobs 0:ca29dd5bc1d8 318 }
withboobs 0:ca29dd5bc1d8 319 else
withboobs 0:ca29dd5bc1d8 320 {
withboobs 0:ca29dd5bc1d8 321 data_write[1] |= CONFIG_BLIND;
withboobs 0:ca29dd5bc1d8 322 }
withboobs 0:ca29dd5bc1d8 323 i2c->write(i2c_addr_htpa, (char *) data_write, 2, 1);
withboobs 0:ca29dd5bc1d8 324
withboobs 0:ca29dd5bc1d8 325 if (!b)
withboobs 0:ca29dd5bc1d8 326 available = 1;
withboobs 0:ca29dd5bc1d8 327 }
withboobs 0:ca29dd5bc1d8 328
withboobs 0:ca29dd5bc1d8 329
withboobs 0:ca29dd5bc1d8 330 /**
withboobs 0:ca29dd5bc1d8 331 * prepare interpolation table based on Ta_dK
withboobs 0:ca29dd5bc1d8 332 * calculate table every time Ta_dK changes
withboobs 0:ca29dd5bc1d8 333 */
withboobs 0:ca29dd5bc1d8 334 void HTPA32x32::find_temptable_from_ta ( void )
withboobs 0:ca29dd5bc1d8 335 {
withboobs 0:ca29dd5bc1d8 336 uint16_t j, i, i_star;
withboobs 0:ca29dd5bc1d8 337
withboobs 0:ca29dd5bc1d8 338 if (Ta_dK <= XTATemps[0])
withboobs 0:ca29dd5bc1d8 339 {
withboobs 0:ca29dd5bc1d8 340 for (j=0;j<NROFADELEMENTS;j++)
withboobs 0:ca29dd5bc1d8 341 {
withboobs 0:ca29dd5bc1d8 342 TempTable_TA[j] = TempTable[j][0];
withboobs 0:ca29dd5bc1d8 343 }
withboobs 0:ca29dd5bc1d8 344 }
withboobs 0:ca29dd5bc1d8 345 else if (Ta_dK >= XTATemps[NROFTAELEMENTS-1])
withboobs 0:ca29dd5bc1d8 346 {
withboobs 0:ca29dd5bc1d8 347 for (j=0;j<NROFADELEMENTS;j++)
withboobs 0:ca29dd5bc1d8 348 {
withboobs 0:ca29dd5bc1d8 349 TempTable_TA[j] = TempTable[j][NROFTAELEMENTS-1];
withboobs 0:ca29dd5bc1d8 350 }
withboobs 0:ca29dd5bc1d8 351 }
withboobs 0:ca29dd5bc1d8 352 else
withboobs 0:ca29dd5bc1d8 353 {
withboobs 0:ca29dd5bc1d8 354 /* construct interpolant for Ta_dK for all V_j */
withboobs 0:ca29dd5bc1d8 355 for (i=1;i<(NROFTAELEMENTS-1);i++)
withboobs 0:ca29dd5bc1d8 356 {
withboobs 0:ca29dd5bc1d8 357 if (XTATemps[i] == Ta_dK)
withboobs 0:ca29dd5bc1d8 358 {
withboobs 0:ca29dd5bc1d8 359 i_star = i;
withboobs 0:ca29dd5bc1d8 360 break;
withboobs 0:ca29dd5bc1d8 361 }
withboobs 0:ca29dd5bc1d8 362 if (XTATemps[i+1] == Ta_dK)
withboobs 0:ca29dd5bc1d8 363 {
withboobs 0:ca29dd5bc1d8 364 i++;
withboobs 0:ca29dd5bc1d8 365 i_star = i;
withboobs 0:ca29dd5bc1d8 366 break;
withboobs 0:ca29dd5bc1d8 367 }
withboobs 0:ca29dd5bc1d8 368 if ( (XTATemps[i] < Ta_dK) && (Ta_dK < XTATemps[i+1]) )
withboobs 0:ca29dd5bc1d8 369 {
withboobs 0:ca29dd5bc1d8 370 i_star = i+1;
withboobs 0:ca29dd5bc1d8 371 break;
withboobs 0:ca29dd5bc1d8 372 }
withboobs 0:ca29dd5bc1d8 373 }
withboobs 0:ca29dd5bc1d8 374
withboobs 0:ca29dd5bc1d8 375 if (i == i_star)
withboobs 0:ca29dd5bc1d8 376 {
withboobs 0:ca29dd5bc1d8 377 for (j=0;j<NROFADELEMENTS;j++)
withboobs 0:ca29dd5bc1d8 378 {
withboobs 0:ca29dd5bc1d8 379 TempTable_TA[j] = TempTable[j][i];
withboobs 0:ca29dd5bc1d8 380 }
withboobs 0:ca29dd5bc1d8 381 }
withboobs 0:ca29dd5bc1d8 382 else
withboobs 0:ca29dd5bc1d8 383 {
withboobs 0:ca29dd5bc1d8 384 uint16_t d1 = Ta_dK - XTATemps[i];
withboobs 0:ca29dd5bc1d8 385 uint16_t d2 = XTATemps[i_star] - Ta_dK;
withboobs 0:ca29dd5bc1d8 386
withboobs 0:ca29dd5bc1d8 387 for (j=0;j<NROFADELEMENTS;j++)
withboobs 0:ca29dd5bc1d8 388 {
withboobs 0:ca29dd5bc1d8 389 float d = (d2 * TempTable[j][i] + d1 * TempTable[j][i_star]) / TAEQUIDISTANCE;
withboobs 0:ca29dd5bc1d8 390 TempTable_TA[j] = d;
withboobs 0:ca29dd5bc1d8 391 }
withboobs 0:ca29dd5bc1d8 392 }
withboobs 0:ca29dd5bc1d8 393 }
withboobs 0:ca29dd5bc1d8 394 }
withboobs 0:ca29dd5bc1d8 395
withboobs 0:ca29dd5bc1d8 396 uint16_t HTPA32x32::find_dk_from_v ( int16_t v)
withboobs 0:ca29dd5bc1d8 397 {
withboobs 0:ca29dd5bc1d8 398 uint16_t t_dk, k;
withboobs 0:ca29dd5bc1d8 399
withboobs 0:ca29dd5bc1d8 400 if ( v <= YADValues[0] )
withboobs 0:ca29dd5bc1d8 401 {
withboobs 0:ca29dd5bc1d8 402 t_dk = TempTable_TA[0];
withboobs 0:ca29dd5bc1d8 403 }
withboobs 0:ca29dd5bc1d8 404 else if ( v >= YADValues[NROFADELEMENTS-1] )
withboobs 0:ca29dd5bc1d8 405 {
withboobs 0:ca29dd5bc1d8 406 t_dk = TempTable_TA[NROFADELEMENTS-1];
withboobs 0:ca29dd5bc1d8 407 }
withboobs 0:ca29dd5bc1d8 408 else
withboobs 0:ca29dd5bc1d8 409 {
withboobs 0:ca29dd5bc1d8 410 for (k=1; k<NROFADELEMENTS; k++)
withboobs 0:ca29dd5bc1d8 411 {
withboobs 0:ca29dd5bc1d8 412 if ( v == YADValues[k] )
withboobs 0:ca29dd5bc1d8 413 {
withboobs 0:ca29dd5bc1d8 414 t_dk = TempTable_TA[k];
withboobs 0:ca29dd5bc1d8 415 break;
withboobs 0:ca29dd5bc1d8 416 }
withboobs 0:ca29dd5bc1d8 417 else if ( v < YADValues[k] )
withboobs 0:ca29dd5bc1d8 418 {
withboobs 0:ca29dd5bc1d8 419 float dummy = TempTable_TA[k-1];
withboobs 0:ca29dd5bc1d8 420 dummy += (TempTable_TA[k] - TempTable_TA[k-1]) * ( v - YADValues[k-1]) / ADEQUIDISTANCE;
withboobs 0:ca29dd5bc1d8 421 t_dk = dummy;
withboobs 0:ca29dd5bc1d8 422 break;
withboobs 0:ca29dd5bc1d8 423 }
withboobs 0:ca29dd5bc1d8 424 }
withboobs 0:ca29dd5bc1d8 425 } // else
withboobs 0:ca29dd5bc1d8 426
withboobs 0:ca29dd5bc1d8 427 return t_dk;
withboobs 0:ca29dd5bc1d8 428 }
withboobs 0:ca29dd5bc1d8 429
withboobs 0:ca29dd5bc1d8 430 void HTPA32x32::apply_offsets( void )
withboobs 0:ca29dd5bc1d8 431 {
withboobs 0:ca29dd5bc1d8 432 uint16_t i,j;
withboobs 0:ca29dd5bc1d8 433 float dummyData;
withboobs 0:ca29dd5bc1d8 434
withboobs 0:ca29dd5bc1d8 435 // do we need to do apply any offsets?
withboobs 0:ca29dd5bc1d8 436 if (!proc)
withboobs 0:ca29dd5bc1d8 437 return;
withboobs 0:ca29dd5bc1d8 438
withboobs 0:ca29dd5bc1d8 439 if (proc & HTPA_PROC_CONVERT)
withboobs 0:ca29dd5bc1d8 440 {
withboobs 0:ca29dd5bc1d8 441 if (Ta_dK_prev != Ta_dK)
withboobs 0:ca29dd5bc1d8 442 {
withboobs 0:ca29dd5bc1d8 443 find_temptable_from_ta ();
withboobs 0:ca29dd5bc1d8 444 }
withboobs 0:ca29dd5bc1d8 445 }
withboobs 0:ca29dd5bc1d8 446
withboobs 0:ca29dd5bc1d8 447 /**
withboobs 0:ca29dd5bc1d8 448 * finish calculation of temperatures:
withboobs 0:ca29dd5bc1d8 449 * thermal offset
withboobs 0:ca29dd5bc1d8 450 */
withboobs 0:ca29dd5bc1d8 451 for (i=0; i<16; i++)
withboobs 0:ca29dd5bc1d8 452 {
withboobs 0:ca29dd5bc1d8 453 for (j=0; j<32; j++)
withboobs 0:ca29dd5bc1d8 454 {
withboobs 0:ca29dd5bc1d8 455 /* thermal offsets */
withboobs 0:ca29dd5bc1d8 456 if (proc & HTPA_PROC_THOFFS)
withboobs 0:ca29dd5bc1d8 457 {
withboobs 0:ca29dd5bc1d8 458 Data[i * 32 + j] -= ThOffs[i * 32 + j];
withboobs 0:ca29dd5bc1d8 459 Data[i * 32 + j] -= ThGrad[i * 32 + j] * Ta_dK / (2<<gradScale);
withboobs 0:ca29dd5bc1d8 460 }
withboobs 0:ca29dd5bc1d8 461 /* electric (blind) offsets */
withboobs 0:ca29dd5bc1d8 462 if (proc & HTPA_PROC_ELOFFS)
withboobs 0:ca29dd5bc1d8 463 Data[i * 32 + j] -= ElOffs[(i%4) * 32 + j];
withboobs 0:ca29dd5bc1d8 464 /* do interpolation */
withboobs 0:ca29dd5bc1d8 465 if (proc & HTPA_PROC_CONVERT)
withboobs 0:ca29dd5bc1d8 466 {
withboobs 0:ca29dd5bc1d8 467 dummyData = (float) Data[i * 32 + j] * PixC[i*32 + j] + TABLEOFFSET;
withboobs 0:ca29dd5bc1d8 468 Data[i * 32 + j] = find_dk_from_v( dummyData );
withboobs 0:ca29dd5bc1d8 469 }
withboobs 0:ca29dd5bc1d8 470 }
withboobs 0:ca29dd5bc1d8 471 }
withboobs 0:ca29dd5bc1d8 472 for (;i<32; i++)
withboobs 0:ca29dd5bc1d8 473 {
withboobs 0:ca29dd5bc1d8 474 for (j=0; j<32; j++)
withboobs 0:ca29dd5bc1d8 475 {
withboobs 0:ca29dd5bc1d8 476 /* thermal offsets */
withboobs 0:ca29dd5bc1d8 477 if (proc & HTPA_PROC_THOFFS)
withboobs 0:ca29dd5bc1d8 478 {
withboobs 0:ca29dd5bc1d8 479 Data[i * 32 + j] -= ThOffs[ (47-i) * 32 + j];
withboobs 0:ca29dd5bc1d8 480 Data[i * 32 + j] -= ThGrad[ (47-i) * 32 + j] * Ta_dK / (2<<gradScale);
withboobs 0:ca29dd5bc1d8 481 }
withboobs 0:ca29dd5bc1d8 482 /* electric (blind) offsets */
withboobs 0:ca29dd5bc1d8 483 if (proc & HTPA_PROC_ELOFFS)
withboobs 0:ca29dd5bc1d8 484 Data[i * 32 + j] -= ElOffs[(i%4) * 32 + j + 128];
withboobs 0:ca29dd5bc1d8 485 /* do interpolation */
withboobs 0:ca29dd5bc1d8 486 if (proc & HTPA_PROC_CONVERT)
withboobs 0:ca29dd5bc1d8 487 {
withboobs 0:ca29dd5bc1d8 488 dummyData = (float) Data[i * 32 + j] * PixC[(47 - i)*32 + j] + TABLEOFFSET;
withboobs 0:ca29dd5bc1d8 489 Data[i * 32 + j] = find_dk_from_v( dummyData );
withboobs 0:ca29dd5bc1d8 490 }
withboobs 0:ca29dd5bc1d8 491 }
withboobs 0:ca29dd5bc1d8 492 }
withboobs 0:ca29dd5bc1d8 493
withboobs 0:ca29dd5bc1d8 494 }
withboobs 0:ca29dd5bc1d8 495
withboobs 0:ca29dd5bc1d8 496
withboobs 0:ca29dd5bc1d8 497
withboobs 0:ca29dd5bc1d8 498
withboobs 0:ca29dd5bc1d8 499
withboobs 0:ca29dd5bc1d8 500
withboobs 0:ca29dd5bc1d8 501
withboobs 0:ca29dd5bc1d8 502