aboutsummaryrefslogtreecommitdiffstats
path: root/cphidgettextled.c
diff options
context:
space:
mode:
authorJonathan McCrohan <jmccrohan@gmail.com>2012-04-14 12:56:48 +0100
committerJonathan McCrohan <jmccrohan@gmail.com>2012-04-14 12:56:48 +0100
commit0b624384cd52be20e61284551d832b499d7b7707 (patch)
tree6f95a4bbef47abc9720b96c0722e8f632aef228a /cphidgettextled.c
downloadlibphidget21-0b624384cd52be20e61284551d832b499d7b7707.tar.gz
Imported Upstream version 2.1.8.20120216upstream/2.1.8.20120216
Diffstat (limited to 'cphidgettextled.c')
-rw-r--r--cphidgettextled.c492
1 files changed, 492 insertions, 0 deletions
diff --git a/cphidgettextled.c b/cphidgettextled.c
new file mode 100644
index 0000000..beacbc7
--- /dev/null
+++ b/cphidgettextled.c
@@ -0,0 +1,492 @@
+#include "stdafx.h"
+#include "cphidgettextled.h"
+#include "cusb.h"
+#include "csocket.h"
+#include "cthread.h"
+
+// === Internal Functions === //
+
+//clearVars - sets all device variables to unknown state
+CPHIDGETCLEARVARS(TextLED)
+
+ phid->brightness = PUNK_INT;
+
+ return EPHIDGET_OK;
+}
+
+//initAfterOpen - sets up the initial state of an object, reading in packets from the device if needed
+// used during attach initialization - on every attach
+CPHIDGETINIT(TextLED)
+ TESTPTR(phid);
+
+ //Make sure no old writes are still pending
+ phid->outputPacketLen = 0;
+
+ //set variables to unknown
+ phid->brightness = PUNK_INT;
+
+ return EPHIDGET_OK;
+}
+
+//dataInput - parses device packets - not used
+CPHIDGETDATA(TextLED)
+ phid = 0;
+ return EPHIDGET_OK;
+}
+
+//eventsAfterOpen - sends out an event for all valid data, used during attach initialization - not used
+CPHIDGETINITEVENTS(TextLED)
+ phid = 0;
+ return EPHIDGET_OK;
+}
+
+//getPacket - used by write thread to get the next packet to send to device
+CGETPACKET_BUF(TextLED)
+
+//sendpacket - sends a packet to the device asynchronously, blocking if the 1-packet queue is full
+CSENDPACKET_BUF(TextLED)
+
+const unsigned long LED_Brightness[33] = {
+ 0x00000000,
+ 0x00000001,
+ 0x00010001,
+ 0x01010001,
+
+ 0x01010101,
+ 0x01110101,
+ 0x01110111,
+ 0x11110111,
+
+ 0x11111111,
+ 0x11111115,
+ 0x11151115,
+ 0x15151115,
+
+ 0x15151515,
+ 0x55151515,
+ 0x55155515,
+ 0x55555515,
+
+ 0x55555555,
+ 0x55555557,
+ 0x55575557,
+ 0x57575557,
+
+ 0x57575757,
+ 0x77575757,
+ 0x77775757,
+ 0x77777757,
+
+ 0x77777777,
+ 0x7777777F,
+ 0x777F777F,
+ 0x7F7F777F,
+ 0x7F7F7F7F,
+
+ 0x7FFF7F7F,
+ 0x7FFF7FFF,
+ 0x7FFFFFFF,
+ 0xFFFFFFFF};
+
+//BL: Is this the same mapping as the LCD custom chars?
+const unsigned char LED_Translate[256] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00,
+ 0x7E, 0x42, 0x3B, 0x6B, 0x47, 0x6D, 0x7D, 0x4A,
+ 0x7F, 0x6F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ 0x00, 0x5F, 0x7F, 0x3C, 0x73, 0x3D, 0x1D, 0x7C, /* A,B,C,D,E,F,G */
+ 0x57, 0x42, 0x72, 0x57, 0x34, 0x5E, 0x5E, 0x7E, /* H, I, J, K, L, M, N, O */
+ 0x1F, 0x7E, 0x5F, 0x6D, 0x1C, 0x76, 0x76, 0x76, /* P, Q, R, S, T, U, V, W */
+ 0x57, 0x67, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, /* X, Y, Z */
+
+ 0x00, 0x5F, 0x7F, 0x3C, 0x73, 0x3D, 0x1D, 0x7C, /* A,B,C,D,E,F,G */
+ 0x57, 0x42, 0x72, 0x57, 0x34, 0x5E, 0x5E, 0x7E, /* H, I, J, K, L, M, N, O */
+ 0x1F, 0x7E, 0x5F, 0x6D, 0x1C, 0x76, 0x76, 0x76, /* P, Q, R, S, T, U, V, W */
+ 0x57, 0x67, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, /* X, Y, Z */
+
+ 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7,
+ 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf,
+ 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+ 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
+
+ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
+ 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
+ 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
+
+ 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+ 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
+ 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+ 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
+
+ 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
+ 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
+ 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+ 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f};
+
+
+const unsigned char LEDV2_Table[512] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0 - 0x0F
+
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x10 - 0x1F
+
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x20 - 0x2F
+
+ 46, 177, 18, 48, 98, 131, 98, 178,
+ 70, 34, 108, 178, 108, 179, 48, 8,
+ 110, 179, 110, 178, 1, 4, 1, 8,
+ 16, 64, 0, 0, 128, 8, 110, 50, // 0x30 - 0x3F
+
+ 62, 147, 110, 35, 110, 179, 44, 129,
+ 46, 177, 108, 131, 108, 3, 44,179,
+ 78, 51, 33, 132, 34, 177, 20, 73,
+ 12, 129, 47, 53, 142, 113, 46, 177, // 0x40 - 0x4F
+
+ 110, 3, 110, 82, 110, 67, 108, 178,
+ 41,4, 70, 179, 20, 9, 6, 181,
+ 144, 72, 144, 4, 48, 136, 36, 129,
+ 128, 64, 34, 160, 0, 72, 0, 128, // 0x50 - 0x5F
+
+ 128, 0, 64, 179, 68, 179, 64, 131,
+ 2, 186, 64, 139, 108, 1, 18, 178,
+ 68, 35, 0, 4, 2, 112, 17, 68,
+ 4, 1, 64,55, 64,5, 64, 163, 204, 1, // 0x60 - 0x6F
+
+ 204, 8, 64, 1, 0, 0, 65, 6,
+ 0, 161, 0, 9, 0, 165, 144, 72,
+ 144, 8, 64, 136, 0, 0, 0, 0, // 0x70 - 0x7F
+
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x80 - 0x8F
+
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x90 - 0x9F
+
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xA0 - 0xAF
+
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xB0 - 0xBF
+
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xC0 - 0xCF
+
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xD0 - 0xDF
+
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xE0 - 0xEF
+
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; // 0xF0 - 0xFF
+
+
+/*
+A = 102, 35
+B = 110, 79
+C = 44, 129
+D = 46, 177
+E = 108,131
+F = 108, 3
+G = 44,179
+H = 78, 51
+I = 33, 132
+J = 34, 177
+K = 20, 73
+L = 12, 129
+M = 47, 53
+N = 142, 113
+O = 46, 177
+P = 110, 3
+Q = 110, 82
+R = 110, 67
+S = 108,178
+T = 41,4
+U = 66, 177
+V = 20, 9
+W = 6, 165
+X = 144, 72
+Y = 144, 4
+Z = 48, 136
+
+0 = 46,177
+1 = 18,48
+2 = 98, 131
+3 = 98,178
+4 = 70, 34
+5 = 108, 178
+6 = 108, 179
+7 = 48,136
+8 = 110, 179
+9 = 110,178
+
+a = 64, 179
+b = 68, 179
+c = 64, 131
+d = 2, 186
+e = 64, 139
+f = 108, 129
+g = 18, 178
+h = 68, 35
+i = 0, 04
+j = 2, 112
+k = 17, 68
+l = 4, 1
+m = 64,55
+n = 64,5
+o = 64, 163
+p = 204, 1
+q = 204, 8
+r = 64, 1
+s =
+t = 65, 6
+u = 0, 161
+v = 0, 9
+w = 0, 165
+x = 144, 72
+y = 144, 8
+z = 64, 136
+
+" = 3, 0
+] = 34, 160
+[ = 36, 129
+` = 128, 0
+' = 16, 0
+% = 24, 24
+
+*/
+
+//makePacket - constructs a packet using current device state
+CMAKEPACKETINDEXED(TextLED)
+ int brightness = 0;
+ char displayString[TEXTLED_MAXROWS][TEXTLED_MAXCOLS];
+ size_t length = 0;
+ int j, k, correction, result;
+ unsigned int ui;
+
+ correction = -1;
+
+ TESTPTRS(phid, buffer)
+
+ switch(phid->phid.deviceIDSpec)
+ {
+ case PHIDID_TEXTLED_1x8:
+ if ((phid->phid.deviceVersion >= 111) && (phid->phid.deviceVersion < 114))
+ {
+ switch(Index)
+ {
+ case TEXTLED_BRIGHTNESS_PACKET:
+ brightness = round((phid->brightness * 31) / 100.0);
+
+ buffer[0] = 0x1C | (0x04 << 5);
+ buffer[1] = (unsigned char)(LED_Brightness[brightness] & 0xff);
+ buffer[2] = (unsigned char)((LED_Brightness[brightness] >> 8) & 0xff);
+ buffer[3] = (unsigned char)((LED_Brightness[brightness] >> 16) & 0xff);
+ buffer[4] = (unsigned char)((LED_Brightness[brightness] >> 24) & 0xff);
+
+ break;
+ case TEXTLED_DISPLAYSTRING_PACKET + 0:
+ length = strlen(phid->displayStringPtr[0]);
+ correction = 0;
+
+ for (ui = 0; ui<=length; ui++)
+ {
+ displayString[0][ui] = LED_Translate[phid->displayStringPtr[0][ui + correction] & 0xff];
+ if (((phid->displayStringPtr[0][ui + correction] & 0xff) == 0x2E) && (ui > 0))
+ {
+ displayString[0][ui-1] |= 0x80;
+ correction++;
+ displayString[0][ui] = LED_Translate[phid->displayStringPtr[0][ui + correction] & 0xff];
+ }
+ }
+
+ //Takes 2 packets to set string, so we have to send the first one here manually
+
+ //3-bit character count, 5-bit position
+ buffer[0] = ((0x07 << 5) | 0x00); //7 characters at posn 0
+ memcpy(buffer+1, displayString[0], 7); //the first 7 characters
+ //send the first 7 characters
+ if ((result = CPhidgetTextLED_sendpacket(phid, buffer)) != EPHIDGET_OK)
+ {
+ return result;
+ }
+
+ //3-bit character count, 5-bit position
+ ZEROMEM(buffer, phid->phid.outputReportByteLength);
+ buffer[0] = ((0x01 << 5) | 0x07); //1 character at posn 7
+ memcpy(buffer+1, displayString[0]+7, 1); //the 8th character
+
+ break;
+ default:
+ return EPHIDGET_UNEXPECTED;
+ }
+ }
+ else
+ return EPHIDGET_UNEXPECTED;
+ break;
+ case PHIDID_TEXTLED_4x8:
+ if ((phid->phid.deviceVersion >= 200) && (phid->phid.deviceVersion < 300))
+ {
+ switch(Index)
+ {
+ case TEXTLED_BRIGHTNESS_PACKET:
+ brightness = round((phid->brightness * 63) / 100.0);
+
+ buffer[0] = 0x80;
+ buffer[1] = brightness;
+
+ break;
+ case TEXTLED_DISPLAYSTRING_PACKET + 0:
+ case TEXTLED_DISPLAYSTRING_PACKET + 1:
+ case TEXTLED_DISPLAYSTRING_PACKET + 2:
+ case TEXTLED_DISPLAYSTRING_PACKET + 3:
+ length = strlen(phid->displayStringPtr[Index]);
+ buffer[0] = (unsigned char)Index;
+
+ for (ui = 0, j = 1, k=8; ui<length; ui++)
+ {
+ /* Collapse decimal point into previous digit if possible */
+ if (phid->displayStringPtr[Index][ui] == '.')
+ {
+ if(buffer[7] & j)
+ {
+ k+=2;
+ j=j<<1;
+ }
+ buffer[7] |= j;
+ if (k == 8) k+=2;
+ }
+ else
+ {
+ buffer[k] = LEDV2_Table[((unsigned short)phid->displayStringPtr[Index][ui] << 1)];
+ buffer[k+1] = LEDV2_Table[(((unsigned short)phid->displayStringPtr[Index][ui] << 1) + 1)];
+ if (k != 8) j=j<<1;
+ k+=2;
+ }
+ }
+ break;
+ default:
+ return EPHIDGET_UNEXPECTED;
+ }
+ }
+ else
+ return EPHIDGET_UNEXPECTED;
+ break;
+ default:
+ return EPHIDGET_UNEXPECTED;
+ }
+
+ return EPHIDGET_OK;
+}
+
+// === Exported Functions === //
+
+//create and initialize a device structure
+CCREATE(TextLED, PHIDCLASS_TEXTLED)
+
+CGET(TextLED,RowCount,int)
+ TESTPTRS(phid,pVal)
+ TESTDEVICETYPE(PHIDCLASS_TEXTLED)
+ TESTATTACHED
+
+ MASGN(phid.attr.textled.numRows)
+}
+CGET(TextLED,ColumnCount,int)
+ TESTPTRS(phid,pVal)
+ TESTDEVICETYPE(PHIDCLASS_TEXTLED)
+ TESTATTACHED
+
+ MASGN(phid.attr.textled.numColumns)
+}
+
+CGET(TextLED,Brightness,int)
+ TESTPTRS(phid,pVal)
+ TESTDEVICETYPE(PHIDCLASS_TEXTLED)
+ TESTATTACHED
+ TESTMASGN(brightness, PUNK_INT)
+
+ MASGN(brightness)
+}
+CSET(TextLED,Brightness,int)
+ TESTPTR(phid)
+ TESTDEVICETYPE(PHIDCLASS_TEXTLED)
+ TESTATTACHED
+ TESTRANGE(0, 100)
+
+ if(CPhidget_statusFlagIsSet(phid->phid.status, PHIDGET_REMOTE_FLAG))
+ ADDNETWORKKEY(Brightness, "%d", brightness);
+ else
+ SENDPACKETINDEXED(TextLED, brightness, TEXTLED_BRIGHTNESS_PACKET);
+
+ return EPHIDGET_OK;
+}
+
+CSETINDEX(TextLED, DisplayString, char *)
+ size_t length = strlen(newVal);
+ int i = 0, length_temp = 0;
+ TESTPTR(phid)
+ TESTDEVICETYPE(PHIDCLASS_TEXTLED)
+ TESTATTACHED
+ TESTINDEX(phid.attr.textled.numRows)
+
+ //for the 4 row textled, periods don't count in the length
+ // unless the first char is a period, or there are two in a row
+ switch(phid->phid.deviceIDSpec)
+ {
+ case PHIDID_TEXTLED_4x8:
+ length_temp = (int)length;
+ for(i=1;i<length_temp;i++)
+ if(newVal[i] == '.' && newVal[i-1] != '.') length--;
+ break;
+ default:
+ break;
+ }
+ if (length > (size_t)phid->phid.attr.textled.numColumns) return EPHIDGET_INVALIDARG;
+
+ if(CPhidget_statusFlagIsSet(phid->phid.status, PHIDGET_REMOTE_FLAG))
+ ADDNETWORKKEYINDEXED(DisplayString, "%s", strings);
+ else
+ SENDPACKETINDEXED(TextLED, displayStringPtr[Index], TEXTLED_DISPLAYSTRING_PACKET + Index);
+
+ return EPHIDGET_OK;
+}
+
+// === Deprecated Functions === //
+
+CGET(TextLED,NumRows,int)
+ return CPhidgetTextLED_getRowCount(phid, pVal);
+}
+CGET(TextLED,NumColumns,int)
+ return CPhidgetTextLED_getColumnCount(phid, pVal);
+}