[asterisk-commits] igorg: trunk r408932 - /trunk/channels/chan_unistim.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Wed Feb 26 02:57:21 CST 2014


Author: igorg
Date: Wed Feb 26 02:57:14 2014
New Revision: 408932

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=408932
Log:

Implement functions handling keypress, display icons and text for i2004 KEM support. 


Modified:
    trunk/channels/chan_unistim.c

Modified: trunk/channels/chan_unistim.c
URL: http://svnview.digium.com/svn/asterisk/trunk/channels/chan_unistim.c?view=diff&rev=408932&r1=408931&r2=408932
==============================================================================
--- trunk/channels/chan_unistim.c (original)
+++ trunk/channels/chan_unistim.c Wed Feb 26 02:57:14 2014
@@ -89,7 +89,7 @@
 /*! Size of the transmit buffer */
 #define MAX_BUF_SIZE	    64
 /*! Number of slots for the transmit queue */
-#define MAX_BUF_NUMBER	  50
+#define MAX_BUF_NUMBER	  150
 /*! Number of digits displayed on screen */
 #define MAX_SCREEN_NUMBER   15
 /*! Try x times before removing the phone */
@@ -196,6 +196,7 @@
 #define FAV_MAX_LENGTH		  0x0A
 
 #define FAVNUM                    6
+#define EXPNUM                    24
 #define FAV_LINE_ICON         FAV_ICON_ONHOOK_BLACK
 
 static void dummy(char *unused, ...)
@@ -380,6 +381,8 @@
 	char redial_number[AST_MAX_EXTENSION];	 /*!< the last phone number entered by the user */
 	char id[18];			    /*!< mac address of the current phone in ascii */
 	char name[DEVICE_NAME_LEN];     /*!< name of the device */
+	int hasexp;                          /*!< if device have expansion connected */
+	char expsoftkeylabel[EXPNUM][11];       /*!< soft key label */
 	char softkeylabel[FAVNUM][11];       /*!< soft key label */
 	char softkeynumber[FAVNUM][AST_MAX_EXTENSION];      /*!< number dialed when the soft key is pressed */
 	char softkeyicon[FAVNUM];	    /*!< icon number */
@@ -497,6 +500,15 @@
 	{ 0x00, 0x00, 0x00, 0x13, 0x99, 0x03, 0x03 };
 static const unsigned char packet_recv_r2[] = { 0x00, 0x00, 0x00, 0x13, 0x96, 0x03, 0x03 };
 
+/*! Expansion module (i2004 KEM) */
+static const unsigned char packet_recv_expansion_pressed_key[] =
+	{ 0x00, 0x00, 0x00, 0x13, 0x89, 0x04, 0x59 };
+static const unsigned char packet_send_expansion_next[] = { 0x09, 0x03, 0x17 };
+static const unsigned char packet_send_expansion_icon[] = { 0x09, 0x06, 0x59, 0x05, /*pos */ 0x47, /*icon */ 0x20 };      /* display an icon in front of the text zone */
+static const unsigned char packet_send_expansion_text[] = { 0x09, 0x0f, 0x57, 0x19, /*pos */ 0x47, /*text */ 0x20,
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 /*end_text */ };
+
+
 /*! TransportAdapter */
 static const unsigned char packet_recv_resume_connection_with_server[] =
 	{ 0xff, 0xff, 0xff, 0xff, 0x9e, 0x03, 0x08 };
@@ -1103,6 +1115,48 @@
 	send_client(SIZE_HEADER + sizeof(packet_send_icon), buffsend, pte);
 }
 
+static void send_expansion_next(struct unistimsession *pte)
+{
+	BUFFSEND;
+	memcpy(buffsend + SIZE_HEADER, packet_send_expansion_next, sizeof(packet_send_expansion_next));
+	send_client(SIZE_HEADER + sizeof(packet_send_expansion_next), buffsend, pte);
+}
+
+
+static void send_expansion_icon(unsigned char pos, unsigned char status, struct unistimsession *pte)
+{
+	BUFFSEND;
+	if (unistimdebug) {
+		ast_verb(0, "Sending expansion icon pos %d with status 0x%.2x\n", pos, status);
+	}
+	memcpy(buffsend + SIZE_HEADER, packet_send_expansion_icon, sizeof(packet_send_expansion_icon));
+	buffsend[10] = pos;
+	buffsend[11] = status;
+	send_client(SIZE_HEADER + sizeof(packet_send_expansion_icon), buffsend, pte);
+}
+
+/* inverse : TEXT_INVERSE : yes, TEXT_NORMAL  : no */
+static void send_expansion_text(unsigned char pos, struct unistimsession *pte, const char *text)
+{
+	int i;
+	BUFFSEND;
+	if (!text) {
+		ast_log(LOG_ERROR, "[expansion] Asked to display NULL text (pos %d)\n", pos);
+		return;
+	}
+	if (unistimdebug) {
+		ast_verb(0, "[expansion] Sending text at pos %d\n", pos);
+	}
+	memcpy(buffsend + SIZE_HEADER, packet_send_expansion_text, sizeof(packet_send_expansion_text));
+	buffsend[10] = pos;
+	i = strlen(text);
+	if (i > TEXT_LENGTH_MAX) {
+		i = TEXT_LENGTH_MAX;
+	}
+	memcpy(buffsend + 11, text, i);
+	send_client(SIZE_HEADER + sizeof(packet_send_expansion_text), buffsend, pte);
+}
+
 static void send_tone(struct unistimsession *pte, uint16_t tone1, uint16_t tone2)
 {
 	BUFFSEND;
@@ -1193,6 +1247,13 @@
 	return;
 }
 
+static void send_expansion_short(unsigned char pos, unsigned char status, struct unistimsession *pte) {
+	send_expansion_icon(pos, status, pte);
+	send_expansion_text(pos, pte, ustmtext(pte->device->expsoftkeylabel[pos], pte));
+	send_expansion_next(pte);
+	return;
+}
+
 static int soft_key_visible(struct unistim_device* d, unsigned char num)
 {
 	if(d->height == 1 && num % 3 == 2) {
@@ -1224,6 +1285,11 @@
 		}
 
 		send_favorite_short(i, status, pte);
+	}
+	if (pte->device->hasexp) {
+		for (i = 0; i < EXPNUM; i++) {
+			send_expansion_short(i, FAV_ICON_NONE, pte);
+		}
 	}
 }
 
@@ -1453,8 +1519,7 @@
 }
 
 /* inverse : TEXT_INVERSE : yes, TEXT_NORMAL  : no */
-static void
-send_text(unsigned char pos, unsigned char inverse, struct unistimsession *pte,
+static void send_text(unsigned char pos, unsigned char inverse, struct unistimsession *pte,
 		 const char *text)
 {
 	int i;
@@ -4351,6 +4416,14 @@
 			ast_verb(0, "Request not authorized in this state\n");
 		}
 		return;
+	}
+	if (!memcmp(buf + SIZE_HEADER, packet_recv_expansion_pressed_key, sizeof(packet_recv_expansion_pressed_key))) {
+		char keycode = buf[13];
+		
+		if (unistimdebug) {
+			ast_verb(0, "Expansion key pressed: keycode = 0x%.2x - current state: %s\n", keycode,
+						ptestate_tostr(pte->state));
+		}
 	}
 	if (!memcmp(buf + SIZE_HEADER, packet_recv_pressed_key, sizeof(packet_recv_pressed_key))) {
 		char keycode = buf[13];
@@ -6136,12 +6209,12 @@
 		memmove(line, line + 2, sizeof(line) - 2);
 	} else {
 		/* No position specified, looking for a free slot */
-		for (p = 0; p <= 5; p++) {
+		for (p = 0; p < FAVNUM; p++) {
 			if (!d->softkeyicon[p]) {
 				break;
 			}
 		}
-		if (p > 5) {
+		if (p == FAVNUM) {
 			ast_log(LOG_WARNING, "No more free bookmark position\n");
 			return 0;
 		}
@@ -6347,6 +6420,8 @@
 			}
 		} else if (!strcasecmp(v->name, "nat")) {
 			d->nat = ast_true(v->value);
+		} else if (!strcasecmp(v->name, "hasexp")) {
+			d->hasexp = ast_true(v->value);
 		} else if (!strcasecmp(v->name, "ringvolume")) {
 			ringvolume = atoi(v->value);
 		} else if (!strcasecmp(v->name, "ringstyle")) {




More information about the asterisk-commits mailing list