PICO OT07 Firmware

Dependencies:   USBDevice

Committer:
walterluu
Date:
Wed Dec 29 06:43:21 2021 +0000
Revision:
32:51535920edd1
PICO_OT07_Firmware;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
walterluu 32:51535920edd1 1
walterluu 32:51535920edd1 2 #include "mbed.h"
walterluu 32:51535920edd1 3 #include "OT07_lib.h"
walterluu 32:51535920edd1 4
walterluu 32:51535920edd1 5 // *****************************************************************************
walterluu 32:51535920edd1 6 // OT07_write_register(char, char, char) writes single byte to OT07
walterluu 32:51535920edd1 7 // char I2C address
walterluu 32:51535920edd1 8 // char OT07 register address
walterluu 32:51535920edd1 9 // char data byte to be writen
walterluu 32:51535920edd1 10 // returns 0 on success ACK, 1 on NACK
walterluu 32:51535920edd1 11 // *****************************************************************************
walterluu 32:51535920edd1 12
walterluu 32:51535920edd1 13 int OT07_write_register(I2C *i2c, char I2C_add, char reg_add, char byte){
walterluu 32:51535920edd1 14 char data[2]; // char type ranges from 0 to 255 (8 bytes)
walterluu 32:51535920edd1 15 int error;
walterluu 32:51535920edd1 16 data[0] = reg_add;
walterluu 32:51535920edd1 17 data[1] = byte;
walterluu 32:51535920edd1 18 error = i2c->write(I2C_add,data,2);
walterluu 32:51535920edd1 19 //if(DEBUG)db.printf("wr[%02X %02X %d]\r\n", data[0], data[1], error);
walterluu 32:51535920edd1 20 return error;
walterluu 32:51535920edd1 21
walterluu 32:51535920edd1 22 }
walterluu 32:51535920edd1 23
walterluu 32:51535920edd1 24 /// ****************************************************************************
walterluu 32:51535920edd1 25 // OT07_write_register(char, char, char *, int) writes multiple bytes to OT07
walterluu 32:51535920edd1 26 // char I2C address
walterluu 32:51535920edd1 27 // char OT07 register address
walterluu 32:51535920edd1 28 // char * data vector of bytes to be written
walterluu 32:51535920edd1 29 // int number of bytes to write
walterluu 32:51535920edd1 30 // returns 0 on success ACK, 1 on NACK
walterluu 32:51535920edd1 31 // *****************************************************************************
walterluu 32:51535920edd1 32
walterluu 32:51535920edd1 33 int OT07_write_register(I2C *i2c, char I2C_add, char reg_add, char *bytes, int n){
walterluu 32:51535920edd1 34 int i;
walterluu 32:51535920edd1 35 //set start address
walterluu 32:51535920edd1 36 char data[16];
walterluu 32:51535920edd1 37 int error;
walterluu 32:51535920edd1 38 data[0] = reg_add;
walterluu 32:51535920edd1 39 for(i=1;i<=n;i++){
walterluu 32:51535920edd1 40 data[i] = bytes[i-1];
walterluu 32:51535920edd1 41 }
walterluu 32:51535920edd1 42 error = i2c->write(I2C_add,data,n+1); // send n bytes of data
walterluu 32:51535920edd1 43
walterluu 32:51535920edd1 44 return error;
walterluu 32:51535920edd1 45 }
walterluu 32:51535920edd1 46
walterluu 32:51535920edd1 47 // *****************************************************************************
walterluu 32:51535920edd1 48 // OT07_read_register(char, char, char *, int) writes single byte to OT07
walterluu 32:51535920edd1 49 // char I2C address
walterluu 32:51535920edd1 50 // char OT07 register address
walterluu 32:51535920edd1 51 // char * data vector for read bytes to be stored in
walterluu 32:51535920edd1 52 // int number of bytes to read
walterluu 32:51535920edd1 53 // returns 0 on success, 1 on fail
walterluu 32:51535920edd1 54 // *****************************************************************************
walterluu 32:51535920edd1 55
walterluu 32:51535920edd1 56 int OT07_read_register(I2C *i2c, char I2C_add, char reg_add, char *bytes, int n){
walterluu 32:51535920edd1 57 int error;
walterluu 32:51535920edd1 58 error = i2c->write(I2C_add,&reg_add,1,1);
walterluu 32:51535920edd1 59 if(error)return error;
walterluu 32:51535920edd1 60 error = i2c->read(I2C_add,bytes,n);
walterluu 32:51535920edd1 61 //if(DEBUG)db.printf("rr e[%d]\r\n",error);
walterluu 32:51535920edd1 62 return error;
walterluu 32:51535920edd1 63 }
walterluu 32:51535920edd1 64
walterluu 32:51535920edd1 65 // *****************************************************************************
walterluu 32:51535920edd1 66 // search_I2C_bus(OT07_struct *) searches I2C address 0xA0, 0xA2, 0xA4 and 0xA6
walterluu 32:51535920edd1 67 // OT07_struct * structure array to holds I2C address and rom_ids
walterluu 32:51535920edd1 68 // returns number of devices found
walterluu 32:51535920edd1 69 // *****************************************************************************
walterluu 32:51535920edd1 70
walterluu 32:51535920edd1 71 int search_I2C_bus(I2C *i2c, OT07_struct OT07[]){
walterluu 32:51535920edd1 72 char data[16];
walterluu 32:51535920edd1 73 char I2C_add;
walterluu 32:51535920edd1 74 //char GPIO;
walterluu 32:51535920edd1 75 int error;
walterluu 32:51535920edd1 76 int device_count = 0;
walterluu 32:51535920edd1 77 int i;
walterluu 32:51535920edd1 78 int j;
walterluu 32:51535920edd1 79 for(i = 0;i<4;i++){
walterluu 32:51535920edd1 80 I2C_add = 0xA0 + i*2;
walterluu 32:51535920edd1 81 error = OT07_read_register(i2c, I2C_add,0xff,data,1);
walterluu 32:51535920edd1 82
walterluu 32:51535920edd1 83 if(error == 0){
walterluu 32:51535920edd1 84 if(data[0] == 0x30){
walterluu 32:51535920edd1 85
walterluu 32:51535920edd1 86 OT07[device_count].I2C_address = I2C_add;
walterluu 32:51535920edd1 87
walterluu 32:51535920edd1 88 OT07_read_register(i2c, I2C_add,OT07_ROM_ID,data,ID_LENGTH);
walterluu 32:51535920edd1 89 for(j=ID_LENGTH-1;j>=0;j--){
walterluu 32:51535920edd1 90 OT07[device_count].rom_id[j] = data[j];
walterluu 32:51535920edd1 91
walterluu 32:51535920edd1 92 }
walterluu 32:51535920edd1 93 device_count++;
walterluu 32:51535920edd1 94 }
walterluu 32:51535920edd1 95 }
walterluu 32:51535920edd1 96
walterluu 32:51535920edd1 97 }
walterluu 32:51535920edd1 98 return device_count;
walterluu 32:51535920edd1 99 }
walterluu 32:51535920edd1 100
walterluu 32:51535920edd1 101 // *****************************************************************************
walterluu 32:51535920edd1 102 // convert_temperature(char) sends convert command to OT07 device
walterluu 32:51535920edd1 103 // char I2C address
walterluu 32:51535920edd1 104 // *****************************************************************************
walterluu 32:51535920edd1 105
walterluu 32:51535920edd1 106 void convert_temperature(I2C *i2c, char I2C_add){ // set convert bit to start conversion
walterluu 32:51535920edd1 107
walterluu 32:51535920edd1 108 char data[2];
walterluu 32:51535920edd1 109
walterluu 32:51535920edd1 110 //read ADC_SETUP register 0x14
walterluu 32:51535920edd1 111 OT07_read_register(i2c, I2C_add, OT07_ADC_SETUP,data,1);
walterluu 32:51535920edd1 112
walterluu 32:51535920edd1 113 //mask convert register value with 0x01 and write back register 0x14
walterluu 32:51535920edd1 114 OT07_write_register(i2c, I2C_add, OT07_ADC_SETUP, data[0]|0x01);
walterluu 32:51535920edd1 115 }
walterluu 32:51535920edd1 116
walterluu 32:51535920edd1 117 //******************************************************************************
walterluu 32:51535920edd1 118 // get_temperature(char) read temperature from OT07 device FIFO register
walterluu 32:51535920edd1 119 // char I2C address
walterluu 32:51535920edd1 120 // returns TempResponse tempC = temperature in oC
walterluu 32:51535920edd1 121 // status = register read result
walterluu 32:51535920edd1 122 //******************************************************************************
walterluu 32:51535920edd1 123
walterluu 32:51535920edd1 124 TempResponse get_temperature(I2C *i2c, char I2C_add){
walterluu 32:51535920edd1 125 char data[2];
walterluu 32:51535920edd1 126 double T;
walterluu 32:51535920edd1 127 int count;
walterluu 32:51535920edd1 128
walterluu 32:51535920edd1 129 // Read temperature from FIFO, 2 bytes
walterluu 32:51535920edd1 130 int error = OT07_read_register(i2c, I2C_add,OT07_FIFO_DATA,data,2);
walterluu 32:51535920edd1 131
walterluu 32:51535920edd1 132 //calculate temperture from data
walterluu 32:51535920edd1 133 count = (int)(data[0]*256 + data[1]);
walterluu 32:51535920edd1 134 if (count >= 32768)count = count - 65536; // 2s comp
walterluu 32:51535920edd1 135 T = (double)count*0.005;
walterluu 32:51535920edd1 136
walterluu 32:51535920edd1 137 TempResponse resp;
walterluu 32:51535920edd1 138 resp.tempC = T;
walterluu 32:51535920edd1 139 resp.status = error; // 1 for nack/error. 0 for ack/success
walterluu 32:51535920edd1 140 return resp;
walterluu 32:51535920edd1 141 }
walterluu 32:51535920edd1 142
walterluu 32:51535920edd1 143 // other functions
walterluu 32:51535920edd1 144
walterluu 32:51535920edd1 145 //void write_settings_file(int interval, bool device_logged[MAX_DEVICES])
walterluu 32:51535920edd1 146 //{
walterluu 32:51535920edd1 147 // FILE *fp = fopen(settings_file, "w");
walterluu 32:51535920edd1 148 // if (fp != NULL)
walterluu 32:51535920edd1 149 // {
walterluu 32:51535920edd1 150 // fprintf(fp, "i %d\r\n", interval);
walterluu 32:51535920edd1 151 //
walterluu 32:51535920edd1 152 // fprintf(fp, "d");
walterluu 32:51535920edd1 153 //
walterluu 32:51535920edd1 154 // for(int i = 0; i < MAX_DEVICES; i++)
walterluu 32:51535920edd1 155 // {
walterluu 32:51535920edd1 156 // if(device_logged[i] == true)
walterluu 32:51535920edd1 157 // {
walterluu 32:51535920edd1 158 // fprintf(fp," %d", i);
walterluu 32:51535920edd1 159 // }
walterluu 32:51535920edd1 160 // }
walterluu 32:51535920edd1 161 // fprintf(fp,"\r\n");
walterluu 32:51535920edd1 162 //
walterluu 32:51535920edd1 163 // fclose(fp);
walterluu 32:51535920edd1 164 // }
walterluu 32:51535920edd1 165 // return;
walterluu 32:51535920edd1 166 //}
walterluu 32:51535920edd1 167
walterluu 32:51535920edd1 168 //void clear_log_file()
walterluu 32:51535920edd1 169 //{
walterluu 32:51535920edd1 170 // FILE *fp = fopen(log_file, "w");
walterluu 32:51535920edd1 171 // if (fp != NULL)
walterluu 32:51535920edd1 172 // {
walterluu 32:51535920edd1 173 // fclose(fp);
walterluu 32:51535920edd1 174 // }
walterluu 32:51535920edd1 175 // return;
walterluu 32:51535920edd1 176 //}
walterluu 32:51535920edd1 177
walterluu 32:51535920edd1 178 //bool print_settings_file()
walterluu 32:51535920edd1 179 //{
walterluu 32:51535920edd1 180 // FILE *fp = fopen(settings_file, "r");
walterluu 32:51535920edd1 181 // if (fp != NULL)
walterluu 32:51535920edd1 182 // {
walterluu 32:51535920edd1 183 // pc.printf("*\r\n");
walterluu 32:51535920edd1 184 //
walterluu 32:51535920edd1 185 // // Read contents from file
walterluu 32:51535920edd1 186 // char c = fgetc(fp);
walterluu 32:51535920edd1 187 //
walterluu 32:51535920edd1 188 // while (!feof(fp))
walterluu 32:51535920edd1 189 // {
walterluu 32:51535920edd1 190 // pc.printf("%c", c);
walterluu 32:51535920edd1 191 // c = fgetc(fp);
walterluu 32:51535920edd1 192 // }
walterluu 32:51535920edd1 193 //
walterluu 32:51535920edd1 194 // pc.printf("*\r\n");
walterluu 32:51535920edd1 195 //
walterluu 32:51535920edd1 196 // fclose(fp);
walterluu 32:51535920edd1 197 // }
walterluu 32:51535920edd1 198 // else
walterluu 32:51535920edd1 199 // {
walterluu 32:51535920edd1 200 // return false;
walterluu 32:51535920edd1 201 // }
walterluu 32:51535920edd1 202 // return true;
walterluu 32:51535920edd1 203 //}
walterluu 32:51535920edd1 204
walterluu 32:51535920edd1 205 //bool print_log_file()
walterluu 32:51535920edd1 206 //{
walterluu 32:51535920edd1 207 // FILE *fp = fopen(log_file, "r");
walterluu 32:51535920edd1 208 // if (fp != NULL)
walterluu 32:51535920edd1 209 // {
walterluu 32:51535920edd1 210 // pc.printf("*\r\n");
walterluu 32:51535920edd1 211 //
walterluu 32:51535920edd1 212 // // Read contents from file
walterluu 32:51535920edd1 213 // char c = fgetc(fp);
walterluu 32:51535920edd1 214 // while (!feof(fp))
walterluu 32:51535920edd1 215 // {
walterluu 32:51535920edd1 216 // pc.printf("%c", c);
walterluu 32:51535920edd1 217 // c = fgetc(fp);
walterluu 32:51535920edd1 218 // }
walterluu 32:51535920edd1 219 //
walterluu 32:51535920edd1 220 // pc.printf("*\r\n");
walterluu 32:51535920edd1 221 //
walterluu 32:51535920edd1 222 // fclose(fp);
walterluu 32:51535920edd1 223 // }
walterluu 32:51535920edd1 224 // else
walterluu 32:51535920edd1 225 // {
walterluu 32:51535920edd1 226 // return false;
walterluu 32:51535920edd1 227 // }
walterluu 32:51535920edd1 228 // return true;
walterluu 32:51535920edd1 229 //}
walterluu 32:51535920edd1 230
walterluu 32:51535920edd1 231 //int getline(char **lineptr, int *n, FILE *stream) {
walterluu 32:51535920edd1 232 // char *bufptr = NULL;
walterluu 32:51535920edd1 233 // char *p = bufptr;
walterluu 32:51535920edd1 234 // size_t size;
walterluu 32:51535920edd1 235 // int c;
walterluu 32:51535920edd1 236 //
walterluu 32:51535920edd1 237 // if (lineptr == NULL) {
walterluu 32:51535920edd1 238 // return -1;
walterluu 32:51535920edd1 239 // }
walterluu 32:51535920edd1 240 // if (stream == NULL) {
walterluu 32:51535920edd1 241 // return -1;
walterluu 32:51535920edd1 242 // }
walterluu 32:51535920edd1 243 // if (n == NULL) {
walterluu 32:51535920edd1 244 // return -1;
walterluu 32:51535920edd1 245 // }
walterluu 32:51535920edd1 246 // bufptr = *lineptr;
walterluu 32:51535920edd1 247 // size = *n;
walterluu 32:51535920edd1 248 //
walterluu 32:51535920edd1 249 // c = fgetc(stream);
walterluu 32:51535920edd1 250 // if (c == EOF) {
walterluu 32:51535920edd1 251 // return -1;
walterluu 32:51535920edd1 252 // }
walterluu 32:51535920edd1 253 // if (bufptr == NULL) {
walterluu 32:51535920edd1 254 // bufptr = (char *)malloc(128);
walterluu 32:51535920edd1 255 // if (bufptr == NULL) {
walterluu 32:51535920edd1 256 // return -1;
walterluu 32:51535920edd1 257 // }
walterluu 32:51535920edd1 258 // size = 128;
walterluu 32:51535920edd1 259 // }
walterluu 32:51535920edd1 260 // p = bufptr;
walterluu 32:51535920edd1 261 // while(c != EOF) {
walterluu 32:51535920edd1 262 // if ((p - bufptr) > (size - 1)) {
walterluu 32:51535920edd1 263 // size = size + 128;
walterluu 32:51535920edd1 264 // bufptr = (char *)realloc(bufptr, size);
walterluu 32:51535920edd1 265 // if (bufptr == NULL) {
walterluu 32:51535920edd1 266 // return -1;
walterluu 32:51535920edd1 267 // }
walterluu 32:51535920edd1 268 // }
walterluu 32:51535920edd1 269 // *p++ = c;
walterluu 32:51535920edd1 270 // if (c == '\n') {
walterluu 32:51535920edd1 271 // break;
walterluu 32:51535920edd1 272 // }
walterluu 32:51535920edd1 273 // c = fgetc(stream);
walterluu 32:51535920edd1 274 // }
walterluu 32:51535920edd1 275 //
walterluu 32:51535920edd1 276 // *p++ = '\0';
walterluu 32:51535920edd1 277 // *lineptr = bufptr;
walterluu 32:51535920edd1 278 // *n = size;
walterluu 32:51535920edd1 279 //
walterluu 32:51535920edd1 280 // return p - bufptr - 1;
walterluu 32:51535920edd1 281 //}
walterluu 32:51535920edd1 282 //
walterluu 32:51535920edd1 283 //bool print_settings_file_2()
walterluu 32:51535920edd1 284 //{
walterluu 32:51535920edd1 285 // char * line = NULL;
walterluu 32:51535920edd1 286 // int len = 0;
walterluu 32:51535920edd1 287 //
walterluu 32:51535920edd1 288 // FILE *fp = fopen(settings_file, "r");
walterluu 32:51535920edd1 289 // if (fp != NULL)
walterluu 32:51535920edd1 290 // {
walterluu 32:51535920edd1 291 // pc.printf("*\r\n");
walterluu 32:51535920edd1 292 //
walterluu 32:51535920edd1 293 // // Read contents from file
walterluu 32:51535920edd1 294 // while ((getline(&line, &len, fp)) != -1)
walterluu 32:51535920edd1 295 // {
walterluu 32:51535920edd1 296 // pc.printf("%s", line);
walterluu 32:51535920edd1 297 // }
walterluu 32:51535920edd1 298 // pc.printf("*\r\n");
walterluu 32:51535920edd1 299 //
walterluu 32:51535920edd1 300 // fclose(fp);
walterluu 32:51535920edd1 301 // }
walterluu 32:51535920edd1 302 // else
walterluu 32:51535920edd1 303 // {
walterluu 32:51535920edd1 304 // return false;
walterluu 32:51535920edd1 305 // }
walterluu 32:51535920edd1 306 // return true;
walterluu 32:51535920edd1 307 //}
walterluu 32:51535920edd1 308 //
walterluu 32:51535920edd1 309 ////returns true if settings file exists and is in the proper format
walterluu 32:51535920edd1 310 //bool apply_settings_file(bool (&logged_devices)[MAX_DEVICES], int& interval)
walterluu 32:51535920edd1 311 //{
walterluu 32:51535920edd1 312 //
walterluu 32:51535920edd1 313 // char * line = NULL;
walterluu 32:51535920edd1 314 // int len = 0;
walterluu 32:51535920edd1 315 // int line_number = 0;
walterluu 32:51535920edd1 316 //
walterluu 32:51535920edd1 317 //
walterluu 32:51535920edd1 318 // FILE *fp = fopen("/sd/settings.txt", "r");
walterluu 32:51535920edd1 319 // if (fp != NULL)
walterluu 32:51535920edd1 320 // {
walterluu 32:51535920edd1 321 //
walterluu 32:51535920edd1 322 // //initialize devices to all false;
walterluu 32:51535920edd1 323 // for(int i = 0; i < MAX_DEVICES; i++)
walterluu 32:51535920edd1 324 // {
walterluu 32:51535920edd1 325 // logged_devices[i] = false;
walterluu 32:51535920edd1 326 // }
walterluu 32:51535920edd1 327 //
walterluu 32:51535920edd1 328 // // Read contents from file
walterluu 32:51535920edd1 329 // while ((getline(&line, &len, fp)) != -1)
walterluu 32:51535920edd1 330 // {
walterluu 32:51535920edd1 331 // line_number++;
walterluu 32:51535920edd1 332 //
walterluu 32:51535920edd1 333 // char i = 0;
walterluu 32:51535920edd1 334 // char c = line[i];
walterluu 32:51535920edd1 335 // while(c != '\0')
walterluu 32:51535920edd1 336 // {
walterluu 32:51535920edd1 337 // int number;
walterluu 32:51535920edd1 338 // int n;
walterluu 32:51535920edd1 339 // sscanf((line+i), "%d%n", &number, &n);
walterluu 32:51535920edd1 340 // if(isdigit(c))
walterluu 32:51535920edd1 341 // {
walterluu 32:51535920edd1 342 // if(line_number == 1)
walterluu 32:51535920edd1 343 // {
walterluu 32:51535920edd1 344 // interval = number;
walterluu 32:51535920edd1 345 // }
walterluu 32:51535920edd1 346 // else if(line_number == 2)
walterluu 32:51535920edd1 347 // {
walterluu 32:51535920edd1 348 // logged_devices[number] = true;
walterluu 32:51535920edd1 349 // }
walterluu 32:51535920edd1 350 // if(n > 1)
walterluu 32:51535920edd1 351 // i = i + (n - 1);
walterluu 32:51535920edd1 352 // }
walterluu 32:51535920edd1 353 // i++;
walterluu 32:51535920edd1 354 // c = line[i];
walterluu 32:51535920edd1 355 // }
walterluu 32:51535920edd1 356 // }
walterluu 32:51535920edd1 357 //
walterluu 32:51535920edd1 358 // fclose(fp);
walterluu 32:51535920edd1 359 // }
walterluu 32:51535920edd1 360 // else
walterluu 32:51535920edd1 361 // {
walterluu 32:51535920edd1 362 // return false;
walterluu 32:51535920edd1 363 // }
walterluu 32:51535920edd1 364 //
walterluu 32:51535920edd1 365 // return true;
walterluu 32:51535920edd1 366 //
walterluu 32:51535920edd1 367 //}