Commit 159673cf0a3d291abe556935c3686a63672e5a84

kanoi 2013-10-11T06:26:58

Merge pull request #502 from kanoi/master Klondike temp checking and read buffer size

diff --git a/driver-klondike.c b/driver-klondike.c
index 955c1c6..7dafc1d 100644
--- a/driver-klondike.c
+++ b/driver-klondike.c
@@ -39,7 +39,7 @@
 
 #define REPLY_SIZE		15	// adequate for all types of replies
 #define REPLY_BUFSIZE 		16	// reply + 1 byte to mark used
-#define MAX_REPLY_COUNT		32	// more unhandled replies than this will result in data loss
+#define MAX_REPLY_COUNT		4096	// more unhandled replies than this will result in data loss
 #define REPLY_WAIT_TIME		100 	// poll interval for a cmd waiting it's reply
 #define CMD_REPLY_RETRIES	8	// how many retries for cmds
 #define MAX_WORK_COUNT		4	// for now, must be binary multiple and match firmware
@@ -120,6 +120,9 @@ static double cvtKlnToC(uint8_t temp)
 {
 	double Rt, stein, celsius;
 
+	if (temp == 0)
+		return 0.0;
+
 	Rt = 1000.0 * 255.0 / (double)temp - 1000.0;
 
 	stein = log(Rt / 2200.0) / 3987.0;
@@ -128,13 +131,39 @@ static double cvtKlnToC(uint8_t temp)
 
 	celsius = (1.0 / stein) - 273.15;
 
+	// For display of bad data
+	if (celsius < 0.0)
+		celsius = 0.0;
+	if (celsius > 200.0)
+		celsius = 200.0;
+
 	return celsius;
 }
 
 static int cvtCToKln(double deg)
 {
-	double R = exp((1/(deg+273.15)-1/(273.15+25))*3987)*2200;
-	return 256*R/(R+1000);
+	double Rt, stein, temp;
+
+	if (deg < 0.0)
+		deg = 0.0;
+
+	stein = 1.0 / (deg + 273.15);
+
+	stein -= 1.0 / (double)(25.0 + 273.15);
+
+	Rt = exp(stein * 3987.0) * 2200.0;
+
+	if (Rt == -1000.0)
+		Rt++;
+
+	temp = 1000.0 * 256.0 / (Rt + 1000.0);
+
+	if (temp > 255)
+		temp = 255;
+	if (temp < 0)
+		temp = 0;
+
+	return (int)temp;
 }
 
 static char *SendCmdGetReply(struct cgpu_info *klncgpu, char Cmd, int device, int datalen, void *data)