|  | @@ -0,0 +1,643 @@
 | 
	
		
			
				|  |  | +/******************************************************************************
 | 
	
		
			
				|  |  | + * Additional info
 | 
	
		
			
				|  |  | + * ****************************************************************************
 | 
	
		
			
				|  |  | + * Changelog:
 | 
	
		
			
				|  |  | + * - v. 2.0 Optimize memory usage. Option to use binary search.
 | 
	
		
			
				|  |  | + *   2016-01-09 by Joakim Soderberg joakim.soderberg@gmail.com
 | 
	
		
			
				|  |  | + * - v. 1.0 Initial release)
 | 
	
		
			
				|  |  | + *   2014-04-24 by Albertas Mickėnas mic@wemakethings.net
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * ****************************************************************************
 | 
	
		
			
				|  |  | + * Bugs, feedback, questions and modifications can be posted on the github page
 | 
	
		
			
				|  |  | + * on https://github.com/Miceuz/k-thermocouple-lib/
 | 
	
		
			
				|  |  | + * ****************************************************************************
 | 
	
		
			
				|  |  | + * - LICENSE -
 | 
	
		
			
				|  |  | + * GNU GPL v2 (http://www.gnu.org/licenses/gpl.txt)
 | 
	
		
			
				|  |  | + * This program is free software. You can redistribute it and/or modify
 | 
	
		
			
				|  |  | + * it under the terms of the GNU General Public License version 2 as published
 | 
	
		
			
				|  |  | + * by the Free Software Foundation.
 | 
	
		
			
				|  |  | + * ****************************************************************************
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +#include <stdio.h>
 | 
	
		
			
				|  |  | +#include "thermocouple.h"
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +#ifdef __AVR__
 | 
	
		
			
				|  |  | +#include <avr/pgmspace.h>
 | 
	
		
			
				|  |  | +#else
 | 
	
		
			
				|  |  | +#undef KTHERM_WITH_PROGMEM
 | 
	
		
			
				|  |  | +#endif
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +#ifdef KTHERM_TEST
 | 
	
		
			
				|  |  | +#include <string.h>
 | 
	
		
			
				|  |  | +#endif
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/*
 | 
	
		
			
				|  |  | + * Values for this table should be multiplied with 1000 when used.
 | 
	
		
			
				|  |  | + * If we store the table as that instead, we need to use unsigned long
 | 
	
		
			
				|  |  | + * For example it would need (on an ATmega328):
 | 
	
		
			
				|  |  | + *    66 * 4 = 264 bytes
 | 
	
		
			
				|  |  | + * instead of:
 | 
	
		
			
				|  |  | + *    66 * 2 = 132 bytes
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +#define TEMP_TABLE_SCALE 1000
 | 
	
		
			
				|  |  | +static const signed int temp_tablek[]
 | 
	
		
			
				|  |  | +    #ifdef KTHERM_WITH_PROGMEM
 | 
	
		
			
				|  |  | +    PROGMEM
 | 
	
		
			
				|  |  | +    #endif
 | 
	
		
			
				|  |  | +    = {
 | 
	
		
			
				|  |  | +	-250,
 | 
	
		
			
				|  |  | +	-240,
 | 
	
		
			
				|  |  | +	-230,
 | 
	
		
			
				|  |  | +	-220,
 | 
	
		
			
				|  |  | +	-210,
 | 
	
		
			
				|  |  | +	-200,
 | 
	
		
			
				|  |  | +	-190,
 | 
	
		
			
				|  |  | +	-180,
 | 
	
		
			
				|  |  | +	-170,
 | 
	
		
			
				|  |  | +	-160,
 | 
	
		
			
				|  |  | +	-150,
 | 
	
		
			
				|  |  | +	-140,
 | 
	
		
			
				|  |  | +	-130,
 | 
	
		
			
				|  |  | +	-120,
 | 
	
		
			
				|  |  | +	-110,
 | 
	
		
			
				|  |  | +	-100,
 | 
	
		
			
				|  |  | +	-90,
 | 
	
		
			
				|  |  | +	-80,
 | 
	
		
			
				|  |  | +	-70,
 | 
	
		
			
				|  |  | +	-60,
 | 
	
		
			
				|  |  | +	-50,
 | 
	
		
			
				|  |  | +	-40,
 | 
	
		
			
				|  |  | +	-30,
 | 
	
		
			
				|  |  | +	-20,
 | 
	
		
			
				|  |  | +	-10,
 | 
	
		
			
				|  |  | +    0,
 | 
	
		
			
				|  |  | +    10,
 | 
	
		
			
				|  |  | +    20,
 | 
	
		
			
				|  |  | +    30,
 | 
	
		
			
				|  |  | +    40,
 | 
	
		
			
				|  |  | +    50,
 | 
	
		
			
				|  |  | +    60,
 | 
	
		
			
				|  |  | +    79,
 | 
	
		
			
				|  |  | +    98,
 | 
	
		
			
				|  |  | +    116,
 | 
	
		
			
				|  |  | +    134,
 | 
	
		
			
				|  |  | +    139,
 | 
	
		
			
				|  |  | +    155,
 | 
	
		
			
				|  |  | +    172,
 | 
	
		
			
				|  |  | +    193,
 | 
	
		
			
				|  |  | +    212,
 | 
	
		
			
				|  |  | +    231,
 | 
	
		
			
				|  |  | +    250,
 | 
	
		
			
				|  |  | +    269,
 | 
	
		
			
				|  |  | +    288,
 | 
	
		
			
				|  |  | +    307,
 | 
	
		
			
				|  |  | +    326,
 | 
	
		
			
				|  |  | +    345,
 | 
	
		
			
				|  |  | +    364,
 | 
	
		
			
				|  |  | +    383,
 | 
	
		
			
				|  |  | +    402,
 | 
	
		
			
				|  |  | +    421,
 | 
	
		
			
				|  |  | +    440,
 | 
	
		
			
				|  |  | +    459,
 | 
	
		
			
				|  |  | +    478,
 | 
	
		
			
				|  |  | +    497,
 | 
	
		
			
				|  |  | +    516,
 | 
	
		
			
				|  |  | +    535,
 | 
	
		
			
				|  |  | +    554,
 | 
	
		
			
				|  |  | +    573,
 | 
	
		
			
				|  |  | +    592,
 | 
	
		
			
				|  |  | +    611,
 | 
	
		
			
				|  |  | +    630,
 | 
	
		
			
				|  |  | +    649,
 | 
	
		
			
				|  |  | +    668,
 | 
	
		
			
				|  |  | +    687,
 | 
	
		
			
				|  |  | +    706,
 | 
	
		
			
				|  |  | +    725,
 | 
	
		
			
				|  |  | +    744,
 | 
	
		
			
				|  |  | +    763,
 | 
	
		
			
				|  |  | +    782,
 | 
	
		
			
				|  |  | +    801,
 | 
	
		
			
				|  |  | +    820,
 | 
	
		
			
				|  |  | +    839,
 | 
	
		
			
				|  |  | +    858,
 | 
	
		
			
				|  |  | +    877,
 | 
	
		
			
				|  |  | +    896,
 | 
	
		
			
				|  |  | +    915,
 | 
	
		
			
				|  |  | +    934,
 | 
	
		
			
				|  |  | +    953,
 | 
	
		
			
				|  |  | +    972,
 | 
	
		
			
				|  |  | +    991,
 | 
	
		
			
				|  |  | +    1010,
 | 
	
		
			
				|  |  | +    1029,
 | 
	
		
			
				|  |  | +    1048,
 | 
	
		
			
				|  |  | +    1067,
 | 
	
		
			
				|  |  | +    1086,
 | 
	
		
			
				|  |  | +    1105,
 | 
	
		
			
				|  |  | +    1124,
 | 
	
		
			
				|  |  | +    1143,
 | 
	
		
			
				|  |  | +    1200
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +#define TEMP_TABLE_SIZEK (sizeof(temp_table) / sizeof(temp_table[0]))
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static const signed int volt_tablek[]
 | 
	
		
			
				|  |  | +    #ifdef KTHERM_WITH_PROGMEM
 | 
	
		
			
				|  |  | +    PROGMEM
 | 
	
		
			
				|  |  | +    #endif
 | 
	
		
			
				|  |  | +    = {
 | 
	
		
			
				|  |  | +	-6404,
 | 
	
		
			
				|  |  | +	-6344,
 | 
	
		
			
				|  |  | +	-6262,
 | 
	
		
			
				|  |  | +	-6158,
 | 
	
		
			
				|  |  | +	-6035,
 | 
	
		
			
				|  |  | +	-5891,
 | 
	
		
			
				|  |  | +	-5730,
 | 
	
		
			
				|  |  | +	-5550,
 | 
	
		
			
				|  |  | +	-5354,
 | 
	
		
			
				|  |  | +	-5141,
 | 
	
		
			
				|  |  | +	-4913,
 | 
	
		
			
				|  |  | +	-4669,
 | 
	
		
			
				|  |  | +	-4411,
 | 
	
		
			
				|  |  | +	-4138,
 | 
	
		
			
				|  |  | +	-3852,
 | 
	
		
			
				|  |  | +	-3554,
 | 
	
		
			
				|  |  | +	-3243,
 | 
	
		
			
				|  |  | +	-2920,
 | 
	
		
			
				|  |  | +	-2587,
 | 
	
		
			
				|  |  | +	-2243,
 | 
	
		
			
				|  |  | +	-1889,
 | 
	
		
			
				|  |  | +	-1527,
 | 
	
		
			
				|  |  | +	-1156,
 | 
	
		
			
				|  |  | +	-778,
 | 
	
		
			
				|  |  | +    -392,
 | 
	
		
			
				|  |  | +	0,
 | 
	
		
			
				|  |  | +    397,
 | 
	
		
			
				|  |  | +    798,
 | 
	
		
			
				|  |  | +    1203,
 | 
	
		
			
				|  |  | +    1612,
 | 
	
		
			
				|  |  | +    2023,
 | 
	
		
			
				|  |  | +    2436,
 | 
	
		
			
				|  |  | +    3225,
 | 
	
		
			
				|  |  | +    4013,
 | 
	
		
			
				|  |  | +    4756,
 | 
	
		
			
				|  |  | +    5491,
 | 
	
		
			
				|  |  | +    5694,
 | 
	
		
			
				|  |  | +    6339,
 | 
	
		
			
				|  |  | +    7021,
 | 
	
		
			
				|  |  | +    7859,
 | 
	
		
			
				|  |  | +    8619,
 | 
	
		
			
				|  |  | +    9383,
 | 
	
		
			
				|  |  | +    10153,
 | 
	
		
			
				|  |  | +    10930,
 | 
	
		
			
				|  |  | +    11712,
 | 
	
		
			
				|  |  | +    12499,
 | 
	
		
			
				|  |  | +    13290,
 | 
	
		
			
				|  |  | +    14084,
 | 
	
		
			
				|  |  | +    14881,
 | 
	
		
			
				|  |  | +    15680,
 | 
	
		
			
				|  |  | +    16482,
 | 
	
		
			
				|  |  | +    17285,
 | 
	
		
			
				|  |  | +    18091,
 | 
	
		
			
				|  |  | +    18898,
 | 
	
		
			
				|  |  | +    19707,
 | 
	
		
			
				|  |  | +    20516,
 | 
	
		
			
				|  |  | +    21326,
 | 
	
		
			
				|  |  | +    22137,
 | 
	
		
			
				|  |  | +    22947,
 | 
	
		
			
				|  |  | +    23757,
 | 
	
		
			
				|  |  | +    24565,
 | 
	
		
			
				|  |  | +    25373,
 | 
	
		
			
				|  |  | +    26179,
 | 
	
		
			
				|  |  | +    26983,
 | 
	
		
			
				|  |  | +    27784,
 | 
	
		
			
				|  |  | +    28584,
 | 
	
		
			
				|  |  | +    29380,
 | 
	
		
			
				|  |  | +    30174,
 | 
	
		
			
				|  |  | +    30964,
 | 
	
		
			
				|  |  | +    31752,
 | 
	
		
			
				|  |  | +    32536,
 | 
	
		
			
				|  |  | +    33316,
 | 
	
		
			
				|  |  | +    34093,
 | 
	
		
			
				|  |  | +    34867,
 | 
	
		
			
				|  |  | +    35637,
 | 
	
		
			
				|  |  | +    36403,
 | 
	
		
			
				|  |  | +    37166,
 | 
	
		
			
				|  |  | +    37925,
 | 
	
		
			
				|  |  | +    38680,
 | 
	
		
			
				|  |  | +    39432,
 | 
	
		
			
				|  |  | +    40180,
 | 
	
		
			
				|  |  | +    40924,
 | 
	
		
			
				|  |  | +    41665,
 | 
	
		
			
				|  |  | +    42402,
 | 
	
		
			
				|  |  | +    43134,
 | 
	
		
			
				|  |  | +    43863,
 | 
	
		
			
				|  |  | +    44588,
 | 
	
		
			
				|  |  | +    45308,
 | 
	
		
			
				|  |  | +    46024,
 | 
	
		
			
				|  |  | +    46735,
 | 
	
		
			
				|  |  | +    48838
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +//T
 | 
	
		
			
				|  |  | +static const signed int temp_tablet[]
 | 
	
		
			
				|  |  | +    #ifdef KTHERM_WITH_PROGMEM
 | 
	
		
			
				|  |  | +    PROGMEM
 | 
	
		
			
				|  |  | +    #endif
 | 
	
		
			
				|  |  | +    = {
 | 
	
		
			
				|  |  | +	-250,
 | 
	
		
			
				|  |  | +	-240,
 | 
	
		
			
				|  |  | +	-230,
 | 
	
		
			
				|  |  | +	-220,
 | 
	
		
			
				|  |  | +	-210,
 | 
	
		
			
				|  |  | +	-200,
 | 
	
		
			
				|  |  | +	-190,
 | 
	
		
			
				|  |  | +	-180,
 | 
	
		
			
				|  |  | +	-170,
 | 
	
		
			
				|  |  | +	-160,
 | 
	
		
			
				|  |  | +	-150,
 | 
	
		
			
				|  |  | +	-140,
 | 
	
		
			
				|  |  | +	-130,
 | 
	
		
			
				|  |  | +	-120,
 | 
	
		
			
				|  |  | +	-110,
 | 
	
		
			
				|  |  | +	-100,
 | 
	
		
			
				|  |  | +	-90,
 | 
	
		
			
				|  |  | +	-80,
 | 
	
		
			
				|  |  | +	-70,
 | 
	
		
			
				|  |  | +	-60,
 | 
	
		
			
				|  |  | +	-50,
 | 
	
		
			
				|  |  | +	-40,
 | 
	
		
			
				|  |  | +	-30,
 | 
	
		
			
				|  |  | +	-20,
 | 
	
		
			
				|  |  | +	-10,
 | 
	
		
			
				|  |  | +    0,
 | 
	
		
			
				|  |  | +    10,
 | 
	
		
			
				|  |  | +    20,
 | 
	
		
			
				|  |  | +    30,
 | 
	
		
			
				|  |  | +    40,
 | 
	
		
			
				|  |  | +    50,
 | 
	
		
			
				|  |  | +    60,
 | 
	
		
			
				|  |  | +    79,
 | 
	
		
			
				|  |  | +    98,
 | 
	
		
			
				|  |  | +    116,
 | 
	
		
			
				|  |  | +    134,
 | 
	
		
			
				|  |  | +    139,
 | 
	
		
			
				|  |  | +    155,
 | 
	
		
			
				|  |  | +    172,
 | 
	
		
			
				|  |  | +    193,
 | 
	
		
			
				|  |  | +    212,
 | 
	
		
			
				|  |  | +    231,
 | 
	
		
			
				|  |  | +    250,
 | 
	
		
			
				|  |  | +    269,
 | 
	
		
			
				|  |  | +    288,
 | 
	
		
			
				|  |  | +    307,
 | 
	
		
			
				|  |  | +    326,
 | 
	
		
			
				|  |  | +    345,
 | 
	
		
			
				|  |  | +    364,
 | 
	
		
			
				|  |  | +    383,
 | 
	
		
			
				|  |  | +    400
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +#define TEMP_TABLE_SIZET (sizeof(temp_tablet) / sizeof(temp_tablet[0]))
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static const signed int volt_tablet[]
 | 
	
		
			
				|  |  | +    #ifdef KTHERM_WITH_PROGMEM
 | 
	
		
			
				|  |  | +    PROGMEM
 | 
	
		
			
				|  |  | +    #endif
 | 
	
		
			
				|  |  | +    = {
 | 
	
		
			
				|  |  | +	-6180,
 | 
	
		
			
				|  |  | +	-6105,
 | 
	
		
			
				|  |  | +	-6007,
 | 
	
		
			
				|  |  | +	-5888,
 | 
	
		
			
				|  |  | +	-5753,
 | 
	
		
			
				|  |  | +	-5603,
 | 
	
		
			
				|  |  | +	-5439,
 | 
	
		
			
				|  |  | +	-5261,
 | 
	
		
			
				|  |  | +	-5070,
 | 
	
		
			
				|  |  | +	-4865,
 | 
	
		
			
				|  |  | +	-4648,
 | 
	
		
			
				|  |  | +	-4419,
 | 
	
		
			
				|  |  | +	-4177,
 | 
	
		
			
				|  |  | +	-3923,
 | 
	
		
			
				|  |  | +	-3657,
 | 
	
		
			
				|  |  | +	-3379,
 | 
	
		
			
				|  |  | +	-3089,
 | 
	
		
			
				|  |  | +	-2788,
 | 
	
		
			
				|  |  | +	-2476,
 | 
	
		
			
				|  |  | +	-2153,
 | 
	
		
			
				|  |  | +	-1819,
 | 
	
		
			
				|  |  | +	-1475,
 | 
	
		
			
				|  |  | +	-1121,
 | 
	
		
			
				|  |  | +	-757,
 | 
	
		
			
				|  |  | +    -383,
 | 
	
		
			
				|  |  | +	0,
 | 
	
		
			
				|  |  | +    391,
 | 
	
		
			
				|  |  | +    790,
 | 
	
		
			
				|  |  | +    1196,
 | 
	
		
			
				|  |  | +    1612,
 | 
	
		
			
				|  |  | +    2036,
 | 
	
		
			
				|  |  | +    2468,
 | 
	
		
			
				|  |  | +    3312,
 | 
	
		
			
				|  |  | +    4185,
 | 
	
		
			
				|  |  | +    5036,
 | 
	
		
			
				|  |  | +    5491,
 | 
	
		
			
				|  |  | +    5910,
 | 
	
		
			
				|  |  | +    6956,
 | 
	
		
			
				|  |  | +    7823,
 | 
	
		
			
				|  |  | +    8917,
 | 
	
		
			
				|  |  | +    9930,
 | 
	
		
			
				|  |  | +    10962,
 | 
	
		
			
				|  |  | +    12013,
 | 
	
		
			
				|  |  | +    13082,
 | 
	
		
			
				|  |  | +    14168,
 | 
	
		
			
				|  |  | +    15270,
 | 
	
		
			
				|  |  | +    16387,
 | 
	
		
			
				|  |  | +    17518,
 | 
	
		
			
				|  |  | +    18665,
 | 
	
		
			
				|  |  | +    19825,
 | 
	
		
			
				|  |  | +    20872
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +#define VOLTAGE_TABLE_SIZEK (sizeof(volt_tablek) / sizeof(volt_tablek[0]))
 | 
	
		
			
				|  |  | +#define VOLTAGE_TABLE_SIZET (sizeof(volt_tablet) / sizeof(volt_tablet[0]))
 | 
	
		
			
				|  |  | +#define POINTS_COUNTK (VOLTAGE_TABLE_SIZEK - 1)
 | 
	
		
			
				|  |  | +#define POINTS_COUNTT (VOLTAGE_TABLE_SIZET - 1)
 | 
	
		
			
				|  |  | +static inline signed long getTableVal(const signed int *t,
 | 
	
		
			
				|  |  | +                                        unsigned char i)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +    #ifdef KTHERM_WITH_PROGMEM
 | 
	
		
			
				|  |  | +    return (unsigned long)pgm_read_word_near(t + i);
 | 
	
		
			
				|  |  | +    #else
 | 
	
		
			
				|  |  | +    return (signed long)t[i];
 | 
	
		
			
				|  |  | +    #endif
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static inline signed long interpolate(signed long val,
 | 
	
		
			
				|  |  | +                                        signed long rangeStart,
 | 
	
		
			
				|  |  | +                                        signed long rangeEnd,
 | 
	
		
			
				|  |  | +                                        signed long valStart,
 | 
	
		
			
				|  |  | +                                        signed long valEnd)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +    signed long valDiff = valEnd - valStart;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    if (valDiff == 0)
 | 
	
		
			
				|  |  | +        return 0;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    return rangeStart + (rangeEnd - rangeStart) * (val - valStart) / valDiff;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static inline signed long interpolateVoltagek(signed long temp,
 | 
	
		
			
				|  |  | +                                               signed char i)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +    return interpolate(temp,
 | 
	
		
			
				|  |  | +                       getTableVal(volt_tablek, i - 1),
 | 
	
		
			
				|  |  | +                       getTableVal(volt_tablek, i),
 | 
	
		
			
				|  |  | +                       getTableVal(temp_tablek, i - 1) * TEMP_TABLE_SCALE,
 | 
	
		
			
				|  |  | +                       getTableVal(temp_tablek, i) * TEMP_TABLE_SCALE);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +static inline signed long interpolateVoltaget(signed long temp,
 | 
	
		
			
				|  |  | +                                               signed char i)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +    return interpolate(temp,
 | 
	
		
			
				|  |  | +                       getTableVal(volt_tablet, i - 1),
 | 
	
		
			
				|  |  | +                       getTableVal(volt_tablet, i),
 | 
	
		
			
				|  |  | +                       getTableVal(temp_tablet, i - 1) * TEMP_TABLE_SCALE,
 | 
	
		
			
				|  |  | +                       getTableVal(temp_tablet, i) * TEMP_TABLE_SCALE);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +static inline signed long interpolateTemperaturek(signed long microvolts,
 | 
	
		
			
				|  |  | +                                                   signed char i)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +    return interpolate(microvolts,
 | 
	
		
			
				|  |  | +                       getTableVal(temp_tablek, i - 1) * TEMP_TABLE_SCALE,
 | 
	
		
			
				|  |  | +                       getTableVal(temp_tablek, i) * TEMP_TABLE_SCALE,
 | 
	
		
			
				|  |  | +                       getTableVal(volt_tablek, i - 1),
 | 
	
		
			
				|  |  | +                       getTableVal(volt_tablek, i));
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +static inline signed long interpolateTemperaturet(signed long microvolts,
 | 
	
		
			
				|  |  | +                                                   signed char i)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +    return interpolate(microvolts,
 | 
	
		
			
				|  |  | +                       getTableVal(temp_tablet, i - 1) * TEMP_TABLE_SCALE,
 | 
	
		
			
				|  |  | +                       getTableVal(temp_tablet, i) * TEMP_TABLE_SCALE,
 | 
	
		
			
				|  |  | +                       getTableVal(volt_tablet, i - 1),
 | 
	
		
			
				|  |  | +                       getTableVal(volt_tablet, i));
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +static inline unsigned char binarySearchK(const signed int *t,
 | 
	
		
			
				|  |  | +                                         signed long val,
 | 
	
		
			
				|  |  | +                                         signed long scale)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +    unsigned char first;
 | 
	
		
			
				|  |  | +    unsigned char middle;
 | 
	
		
			
				|  |  | +    unsigned char last;
 | 
	
		
			
				|  |  | +    unsigned long cur;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // Note that we skip the first item in the list.
 | 
	
		
			
				|  |  | +    first = 1;
 | 
	
		
			
				|  |  | +    last = POINTS_COUNTK - 2;
 | 
	
		
			
				|  |  | +    middle = (first + last) / 2;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    while (first <= last)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        cur = getTableVal(t, middle) * scale;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        if (val > cur)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            first = middle + 1;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        else if (val == cur)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            return middle + 1;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        else
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            last = middle - 1;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        middle = (first + last) / 2;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    return last + 1;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +static inline unsigned char binarySearchT(const signed int *t,
 | 
	
		
			
				|  |  | +                                         signed long val,
 | 
	
		
			
				|  |  | +                                         signed long scale)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +    unsigned char first;
 | 
	
		
			
				|  |  | +    unsigned char middle;
 | 
	
		
			
				|  |  | +    unsigned char last;
 | 
	
		
			
				|  |  | +    unsigned long cur;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // Note that we skip the first item in the list.
 | 
	
		
			
				|  |  | +    first = 1;
 | 
	
		
			
				|  |  | +    last = POINTS_COUNTT - 2;
 | 
	
		
			
				|  |  | +    middle = (first + last) / 2;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    while (first <= last)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        cur = getTableVal(t, middle) * scale;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        if (val > cur)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            first = middle + 1;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        else if (val == cur)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            return middle + 1;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        else
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            last = middle - 1;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        middle = (first + last) / 2;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    return last + 1;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +static inline unsigned char linearSearchK(const signed int *t,
 | 
	
		
			
				|  |  | +                                         signed long val,
 | 
	
		
			
				|  |  | +                                         signed long scale)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +    unsigned char i;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    for (i = 0; i < POINTS_COUNTK; i++)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        if ((getTableVal(t, i) * scale) > val)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            return i;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    return POINTS_COUNTK - 1;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +static inline unsigned char linearSearchT(const signed int *t,
 | 
	
		
			
				|  |  | +                                         signed long val,
 | 
	
		
			
				|  |  | +                                         signed long scale)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +    unsigned char i;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    for (i = 0; i < POINTS_COUNTT; i++)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        if ((getTableVal(t, i) * scale) > val)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            return i;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    return POINTS_COUNTT - 1;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * Returns the index of the first point whose temperature
 | 
	
		
			
				|  |  | + * value is greater than argument
 | 
	
		
			
				|  |  | + **/
 | 
	
		
			
				|  |  | +static inline unsigned char searchTempk(signed long temp)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +    #ifdef KTHERM_WITH_BINARY_SEARCH
 | 
	
		
			
				|  |  | +    return binarySearch(temp_table, temp, TEMP_TABLE_SCALE);
 | 
	
		
			
				|  |  | +    #else
 | 
	
		
			
				|  |  | +    return linearSearchK(temp_tablek, temp, TEMP_TABLE_SCALE);
 | 
	
		
			
				|  |  | +    #endif
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +static inline unsigned char searchTempt(signed long temp)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +    #ifdef KTHERM_WITH_BINARY_SEARCH
 | 
	
		
			
				|  |  | +    return binarySearch(temp_table, temp, TEMP_TABLE_SCALE);
 | 
	
		
			
				|  |  | +    #else
 | 
	
		
			
				|  |  | +    return linearSearchT(temp_tablet, temp, TEMP_TABLE_SCALE);
 | 
	
		
			
				|  |  | +    #endif
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * Returns the index of the first point whose microvolts
 | 
	
		
			
				|  |  | + * value is greater than argument
 | 
	
		
			
				|  |  | + **/
 | 
	
		
			
				|  |  | +static inline unsigned char searchMicrovoltsk(signed long microvolts)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +    #ifdef KTHERM_WITH_BINARY_SEARCH
 | 
	
		
			
				|  |  | +    return binarySearch(volt_table, microvolts, 1);
 | 
	
		
			
				|  |  | +    #else
 | 
	
		
			
				|  |  | +    return linearSearchK(volt_tablek, microvolts, 1);
 | 
	
		
			
				|  |  | +    #endif
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +static inline unsigned char searchMicrovoltst(signed long microvolts)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +    #ifdef KTHERM_WITH_BINARY_SEARCH
 | 
	
		
			
				|  |  | +    return binarySearch(volt_table, microvolts, 1);
 | 
	
		
			
				|  |  | +    #else
 | 
	
		
			
				|  |  | +    return linearSearchT(volt_tablet, microvolts, 1);
 | 
	
		
			
				|  |  | +    #endif
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * Returns temperature as a function of the ambient temperature
 | 
	
		
			
				|  |  | + * and measured thermocouple voltage.
 | 
	
		
			
				|  |  | + * Currently only positive ambient temperature is supported
 | 
	
		
			
				|  |  | + **/
 | 
	
		
			
				|  |  | +long thermocoupleConvertWithCJCompensationk(signed long microvoltsMeasured,
 | 
	
		
			
				|  |  | +                                           signed long ambient)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +    // Convert ambient temp to microvolts
 | 
	
		
			
				|  |  | +    // and add them to the thermocouple measured microvolts 
 | 
	
		
			
				|  |  | +    signed long microvolts = 
 | 
	
		
			
				|  |  | +        microvoltsMeasured + interpolateVoltagek(ambient, searchTempk(ambient));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // look up microvolts in The Table and interpolate
 | 
	
		
			
				|  |  | +    return interpolateTemperaturek(microvolts, searchMicrovoltsk(microvolts));
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +long thermocoupleConvertWithCJCompensationt(signed long microvoltsMeasured,
 | 
	
		
			
				|  |  | +                                           signed long ambient)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +    // Convert ambient temp to microvolts
 | 
	
		
			
				|  |  | +    // and add them to the thermocouple measured microvolts 
 | 
	
		
			
				|  |  | +    signed long microvolts = 
 | 
	
		
			
				|  |  | +        microvoltsMeasured + interpolateVoltaget(ambient, searchTempt(ambient));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // look up microvolts in The Table and interpolate
 | 
	
		
			
				|  |  | +    return interpolateTemperaturet(microvolts, searchMicrovoltst(microvolts));
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * Returns temperature, equivalent to the voltage provided in microvolts
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +long thermocoupleMvToCk(signed long microvolts)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +    return interpolateTemperaturek(microvolts, searchMicrovoltsk(microvolts));
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +long thermocoupleMvToCt(signed long microvolts)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +    return interpolateTemperaturet(microvolts, searchMicrovoltst(microvolts));
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +#ifdef KTHERM_TEST
 | 
	
		
			
				|  |  | +int main(int argc, char **argv)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +    unsigned long i = 0;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    if (argc < 2)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        goto usage;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    for (i = 1; i < argc; i++)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        if (!strcmp(argv[i], "--temps"))
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            for (i = 0; i < 16383; i++)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                unsigned long voltage = 5000000 / 16384 * i / 101;
 | 
	
		
			
				|  |  | +                printf("%ld\n", thermocoupleMvToC(voltage));
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        else if (!strcmp(argv[i], "--microvolts"))
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            for (i = 0; i < 1280000; i+= 1000)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                printf("%ld\n", interpolateVoltage(i, searchTemp(i)));
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        else
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            fprintf(stderr, "Unknown option %s\n", argv[i]);
 | 
	
		
			
				|  |  | +            goto usage;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    return 0;
 | 
	
		
			
				|  |  | +usage:
 | 
	
		
			
				|  |  | +    printf("K-Type Thermocouple Library Tests\n");
 | 
	
		
			
				|  |  | +    printf(" Usage: %s [--microvolts] [--temps]\n", argv[0]);
 | 
	
		
			
				|  |  | +    return -1;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +#endif
 |