Initial commit

Dependencies:   MODSERIAL Terminal TextLCD mbed

Committer:
anmar
Date:
Fri Dec 05 10:27:17 2014 +0000
Revision:
1:a6b0e0ce3e7a
Parent:
0:0903545c0460
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
anmar 0:0903545c0460 1 #include "thermal.h"
anmar 0:0903545c0460 2
anmar 0:0903545c0460 3 #include "defines.h"
anmar 0:0903545c0460 4
anmar 0:0903545c0460 5
anmar 0:0903545c0460 6 extern DigitalOut led2;
anmar 0:0903545c0460 7 extern DigitalOut led3;
anmar 0:0903545c0460 8 extern DigitalOut led4;
anmar 0:0903545c0460 9
anmar 0:0903545c0460 10
anmar 0:0903545c0460 11
anmar 0:0903545c0460 12 Thermal::Thermal(Terminal *t, I2C *i)
anmar 0:0903545c0460 13 {
anmar 0:0903545c0460 14 term = t;
anmar 0:0903545c0460 15 //i2c = i;
anmar 0:0903545c0460 16
anmar 0:0903545c0460 17
anmar 0:0903545c0460 18 i2c = new I2C(p28, p27);
anmar 0:0903545c0460 19
anmar 0:0903545c0460 20 i2c->frequency(100000);
anmar 0:0903545c0460 21
anmar 0:0903545c0460 22
anmar 0:0903545c0460 23 }
anmar 0:0903545c0460 24
anmar 0:0903545c0460 25
anmar 0:0903545c0460 26
anmar 0:0903545c0460 27 int Thermal::D6T_getvalue()
anmar 0:0903545c0460 28 {
anmar 0:0903545c0460 29 //const char cmd[] = { 0x4C };
anmar 0:0903545c0460 30 char I2C_rd[64];
anmar 0:0903545c0460 31
anmar 0:0903545c0460 32 short PTAT;
anmar 0:0903545c0460 33 int i,j;
anmar 0:0903545c0460 34 int itemp;
anmar 0:0903545c0460 35
anmar 0:0903545c0460 36 i2c->start();
anmar 0:0903545c0460 37 i2c->write(D6T_addr);
anmar 0:0903545c0460 38 i2c->write(D6T_cmd);
anmar 0:0903545c0460 39 // Repeated Start condition
anmar 0:0903545c0460 40 i2c->read(D6T_addr,I2C_rd,35);
anmar 0:0903545c0460 41 // if(check_PEC(I2C_rd) == -1) continue; // error
anmar 0:0903545c0460 42 for(i=0,j=0;i<17;i++)
anmar 0:0903545c0460 43 {
anmar 0:0903545c0460 44 itemp = (I2C_rd[j++] & 0xff);
anmar 0:0903545c0460 45 itemp += I2C_rd[j++] * 256;
anmar 0:0903545c0460 46 if(i == 0) PTAT = itemp;
anmar 0:0903545c0460 47 else temp[i-1] = itemp;
anmar 0:0903545c0460 48 }
anmar 0:0903545c0460 49 for(i=0;i<16;i++){
anmar 0:0903545c0460 50 dt[i] = 0.1 * temp[i];
anmar 0:0903545c0460 51 }
anmar 0:0903545c0460 52 d_PTAT = 0.1 * PTAT;
anmar 0:0903545c0460 53
anmar 0:0903545c0460 54 tPEC = readbuff[34];
anmar 0:0903545c0460 55 return 1;
anmar 0:0903545c0460 56 }
anmar 0:0903545c0460 57
anmar 0:0903545c0460 58
anmar 0:0903545c0460 59
anmar 0:0903545c0460 60
anmar 0:0903545c0460 61 void Thermal::measure()
anmar 0:0903545c0460 62 {
anmar 0:0903545c0460 63 int n;
anmar 0:0903545c0460 64 int status;
anmar 0:0903545c0460 65
anmar 0:0903545c0460 66 n = 0;
anmar 0:0903545c0460 67 do{
anmar 0:0903545c0460 68 status = D6T_getvalue();
anmar 0:0903545c0460 69 n++;
anmar 0:0903545c0460 70 } while(!status && n < LOOPLIMIT);
anmar 0:0903545c0460 71
anmar 0:0903545c0460 72 if ( !status )
anmar 0:0903545c0460 73 {
anmar 0:0903545c0460 74 // error operation.
anmar 0:0903545c0460 75 }
anmar 0:0903545c0460 76
anmar 0:0903545c0460 77
anmar 0:0903545c0460 78 l = 40.0;
anmar 0:0903545c0460 79 h = 0.0;
anmar 0:0903545c0460 80 m = 0.0;
anmar 0:0903545c0460 81
anmar 0:0903545c0460 82 for (int x = 0; x < 16; x++ )
anmar 0:0903545c0460 83 {
anmar 0:0903545c0460 84 if ( dt[x] > h )
anmar 0:0903545c0460 85 h = dt[x];
anmar 0:0903545c0460 86 if ( dt[x] < l )
anmar 0:0903545c0460 87 l = dt[x];
anmar 0:0903545c0460 88 m += dt[x];
anmar 0:0903545c0460 89
anmar 0:0903545c0460 90
anmar 0:0903545c0460 91 }
anmar 0:0903545c0460 92
anmar 0:0903545c0460 93 m /= 16;
anmar 0:0903545c0460 94
anmar 0:0903545c0460 95 mean = m;
anmar 0:0903545c0460 96 low = l;
anmar 0:0903545c0460 97 high = h;
anmar 0:0903545c0460 98
anmar 0:0903545c0460 99
anmar 0:0903545c0460 100 char color[20];
anmar 0:0903545c0460 101 uint8_t detected;
anmar 0:0903545c0460 102
anmar 0:0903545c0460 103 term->printf(" %2.1f, ", d_PTAT);
anmar 0:0903545c0460 104
anmar 0:0903545c0460 105 detected = 0;
anmar 0:0903545c0460 106 for ( int x = 0; x < 16; x++ )
anmar 0:0903545c0460 107 {
anmar 0:0903545c0460 108 if ( dt[x] > mean + 0.5 )
anmar 0:0903545c0460 109 {
anmar 0:0903545c0460 110 strcpy(color, "\033[31m");
anmar 0:0903545c0460 111 detected = 1;
anmar 0:0903545c0460 112 }
anmar 0:0903545c0460 113 else
anmar 0:0903545c0460 114 strcpy(color, "");
anmar 0:0903545c0460 115 term->printf("%s%2.1f\033[37m,", color, dt[x]);
anmar 0:0903545c0460 116 }
anmar 0:0903545c0460 117
anmar 0:0903545c0460 118 term->printf(",%d" ,tPEC);
anmar 0:0903545c0460 119 term->printf(", %2.1f - %2.1f [%2.1f]\r\n", low, high, mean);
anmar 0:0903545c0460 120
anmar 0:0903545c0460 121 if ( detected )
anmar 0:0903545c0460 122 {
anmar 0:0903545c0460 123 led2 = 1;
anmar 0:0903545c0460 124 led3 = 1;
anmar 0:0903545c0460 125 led4 = 1;
anmar 0:0903545c0460 126 }
anmar 0:0903545c0460 127 else
anmar 0:0903545c0460 128 {
anmar 0:0903545c0460 129 led2 = 0;
anmar 0:0903545c0460 130 led3 = 0;
anmar 0:0903545c0460 131 led4 = 0;
anmar 0:0903545c0460 132 }
anmar 0:0903545c0460 133
anmar 0:0903545c0460 134
anmar 0:0903545c0460 135
anmar 0:0903545c0460 136 /*term->printf(" %d, %d,%d,%d,%d,%d,%d,%d,%d ,%d,%d,%d,%d,%d,%d,%d,%d ,%d\n" ,
anmar 0:0903545c0460 137 tPTAT,tP[0],tP[1],tP[2],tP[3],tP[4],tP[5],tP[6],tP[7]
anmar 0:0903545c0460 138 ,tP[8],tP[9],tP[10],tP[11],tP[12],tP[13],tP[14],tP[15],tPEC); */
anmar 0:0903545c0460 139
anmar 0:0903545c0460 140 }
anmar 0:0903545c0460 141
anmar 0:0903545c0460 142
anmar 0:0903545c0460 143 uint8_t Thermal::calc_crc( uint8_t data )
anmar 0:0903545c0460 144 {
anmar 0:0903545c0460 145 int index;
anmar 0:0903545c0460 146 unsigned char temp;
anmar 0:0903545c0460 147
anmar 0:0903545c0460 148 for( index = 0; index < 8; index++ )
anmar 0:0903545c0460 149 {
anmar 0:0903545c0460 150 temp = data;
anmar 0:0903545c0460 151 data <<= 1;
anmar 0:0903545c0460 152 if ( temp & 0x80 )
anmar 0:0903545c0460 153 data ^= 0x07;
anmar 0:0903545c0460 154 }
anmar 0:0903545c0460 155 return data;
anmar 0:0903545c0460 156 }
anmar 0:0903545c0460 157
anmar 0:0903545c0460 158 int Thermal::D6T_checkPEC( uint8_t readbuff[] , int pPEC )
anmar 0:0903545c0460 159 {
anmar 0:0903545c0460 160 uint8_t crc;
anmar 0:0903545c0460 161 int i;
anmar 0:0903545c0460 162
anmar 0:0903545c0460 163 crc = calc_crc( 0x14 );
anmar 0:0903545c0460 164 crc = calc_crc( 0x4C ^ crc );
anmar 0:0903545c0460 165 crc = calc_crc( 0x15 ^ crc );
anmar 0:0903545c0460 166 for( i = 0; i < pPEC; i++ )
anmar 0:0903545c0460 167 {
anmar 0:0903545c0460 168 crc = calc_crc( readbuff[i] ^ crc );
anmar 0:0903545c0460 169 }
anmar 0:0903545c0460 170 return (crc == readbuff[pPEC]);
anmar 0:0903545c0460 171 }