aboutsummaryrefslogtreecommitdiffstats
path: root/channels/chan_skinny.c
diff options
context:
space:
mode:
authorjeremy <jeremy@f38db490-d61c-443f-a65b-d21fe96a405b>2005-05-24 22:24:04 +0000
committerjeremy <jeremy@f38db490-d61c-443f-a65b-d21fe96a405b>2005-05-24 22:24:04 +0000
commitffec70d5798fb32f6ef73c9be93b31269381c190 (patch)
tree902cec2d6934564b80804f73d6d94d3f31624183 /channels/chan_skinny.c
parent91dd8f203f8ca72204f8b480099c8fcb48f75e2c (diff)
Correctly implement the button templates in hopes to support more 79XX series phones. Needs testing, please report. Bug #4366
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@5762 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels/chan_skinny.c')
-rwxr-xr-xchannels/chan_skinny.c337
1 files changed, 155 insertions, 182 deletions
diff --git a/channels/chan_skinny.c b/channels/chan_skinny.c
index eaa48343f..500efe9c3 100755
--- a/channels/chan_skinny.c
+++ b/channels/chan_skinny.c
@@ -276,114 +276,109 @@ typedef struct server_res_message {
} server_res_message;
#define BUTTON_TEMPLATE_RES_MESSAGE 0x0097
-/*
- Define the template for a 30VIP phone, this is the older Selsius systems
- model that has 30 buttons for your button-pushing enjoyment. Each
- softbutton defition goes by a 'index' of a button followed by that buttons
- assignment for example "\x01\x09" means Line 1, while "\x02\x09" means Line 2
- comments on what each assignment means is below
-*/
-static const char *thirtyvip_button_definition_hack = {
- "\x01\x09" /* Line 1 */
- "\x02\x09" /* Line 2 */
- "\x03\x09" /* Line 3 */
- "\x04\x09" /* Line 4 */
- "\x01\x7e"
- "\x01\x01" /* Redial */
- "\x00\xff"
- "\x01\x02" /* Speeddial 1 */
- "\x02\x02" /* Speeddial 2 */
- "\x03\x02" /* Speeddial 3 */
- "\x04\x02" /* Speeddial 4 */
- "\x05\x02" /* Speeddial 5 */
- "\x06\x02" /* Speeddial 6 */
- "\x01\x0f" /* Voicemail */
- "\x01\x05" /* Forward all */
- "\x01\x7d" /* Conference */
- "\x00\xff"
- "\x00\xff"
- "\x00\xff"
- "\x00\xff"
- "\x00\xff"
- "\x07\x02" /* Speeddial 7 */
- "\x08\x02" /* Speeddial 8 */
- "\x09\x02" /* Speeddial 9 */
- "\x0A\x02" /* Speeddial 10 */
- "\x00\xff"
- "\x00\xff"
- "\x00\xff"
- "\x00\xff"
- "\x00\xff"
- "\x00\xff"
- "\x00\xff"
- "\x00\xff"
- "\x00\xff"
- "\x00\xff"
- "\x00\xff"
- "\x00\xff"
- "\x00\xff"
- "\x00\xff"
- "\x00\xff"
- "\x00\xff"
- "\x00\xff"
-};
-
-/*
- Now, define the buttons on the 12SP, you 79XX series folks, you get this
- too, as I don't know how the buttons are laid out, and I don't care as I
- don't have one. Code your own damn buttons or send me a 7960
-*/
-
-static const char *twelvesp_button_definition_hack = {
- "\x01\x09" /* Line 1 */
- "\x01\x09" /* Line 2 */
- "\x01\x02" /* Speeddial 1 */
- "\x02\x02" /* Speeddial 2 */
- "\x03\x02" /* Speeddial 3 */
- "\x04\x02" /* Speeddial 4 */
- "\x01\x0f" /* Voicemail */
- "\x05\x02" /* Speeddial 5 */
- "\x06\x02" /* Speeddial 6 */
- "\x07\x02" /* Speeddial 7 */
- "\x08\x02" /* Speeddial 8 */
- "\x09\x02" /* Speeddial 9 */
- "\x00\xff"
- "\x00\xff"
- "\x00\xff"
- "\x00\xff"
- "\x00\xff"
- "\x00\xff"
- "\x00\xff"
- "\x00\xff"
- "\x00\xff"
- "\x00\xff"
- "\x00\xff"
- "\x00\xff"
- "\x00\xff"
- "\x00\xff"
- "\x00\xff"
- "\x00\xff"
- "\x00\xff"
- "\x00\xff"
- "\x00\xff"
- "\x00\xff"
- "\x00\xff"
- "\x00\xff"
- "\x00\xff"
- "\x00\xff"
- "\x00\xff"
- "\x00\xff"
- "\x00\xff"
- "\x00\xff"
- "\x00\xff"
- "\x00\xff"
-};
typedef struct buttondefinition {
UINT8 instanceNumber;
UINT8 buttonDefinition;
} button_definition;
+#define STIMULUS_REDIAL 0x01
+#define STIMULUS_SPEEDDIAL 0x02
+#define STIMULUS_HOLD 0x03
+#define STIMULUS_TRANSFER 0x04
+#define STIMULUS_FORWARDALL 0x05
+#define STIMULUS_FORWARDBUSY 0x06
+#define STIMULUS_FORWARDNOANSWER 0x07
+#define STIMULUS_DISPLAY 0x08
+#define STIMULUS_LINE 0x09
+#define STIMULUS_VOICEMAIL 0x0F
+#define STIMULUS_AUTOANSWER 0x11
+#define STIMULUS_CONFERENCE 0x7D
+#define STIMULUS_CALLPARK 0x7E
+#define STIMULUS_CALLPICKUP 0x7F
+#define STIMULUS_NONE 0xFF
+
+button_definition button_def_30vip[] = {
+ { 1, STIMULUS_LINE }, /* Line 1 */
+ { 2, STIMULUS_LINE }, /* Line 2 */
+ { 3, STIMULUS_LINE }, /* Line 3 */
+ { 4, STIMULUS_LINE }, /* Line 4 */
+ { 1, STIMULUS_CALLPARK }, /* Call Park */
+ { 0, STIMULUS_NONE },
+ { 1, STIMULUS_SPEEDDIAL }, /* Speeddial 1 */
+ { 2, STIMULUS_SPEEDDIAL }, /* Speeddial 2 */
+ { 3, STIMULUS_SPEEDDIAL }, /* Speeddial 3 */
+ { 4, STIMULUS_SPEEDDIAL }, /* Speeddial 4 */
+ { 5, STIMULUS_SPEEDDIAL }, /* Speeddial 5 */
+ { 6, STIMULUS_SPEEDDIAL }, /* Speeddial 6 */
+ { 1, STIMULUS_VOICEMAIL }, /* Voicemail */
+ { 1, STIMULUS_FORWARDALL }, /* Forward All */
+ { 1, STIMULUS_CONFERENCE }, /* Conference */
+ { 0, STIMULUS_NONE },
+ { 0, STIMULUS_NONE },
+ { 0, STIMULUS_NONE },
+ { 0, STIMULUS_NONE },
+ { 0, STIMULUS_NONE },
+ { 7, STIMULUS_SPEEDDIAL }, /* Speeddial 7 */
+ { 8, STIMULUS_SPEEDDIAL }, /* Speeddial 8 */
+ { 9, STIMULUS_SPEEDDIAL }, /* Speeddial 9 */
+ { 10, STIMULUS_SPEEDDIAL } /* Speeddial 10 */
+};
+
+button_definition button_def_12sp[] = {
+ { 1, STIMULUS_LINE }, /* Line 1 */
+ { 1, STIMULUS_LINE }, /* Line 1 */
+ { 1, STIMULUS_SPEEDDIAL }, /* Speeddial 1 */
+ { 2, STIMULUS_SPEEDDIAL }, /* Speeddial 2 */
+ { 3, STIMULUS_SPEEDDIAL }, /* Speeddial 3 */
+ { 4, STIMULUS_SPEEDDIAL }, /* Speeddial 4 */
+ { 1, STIMULUS_VOICEMAIL }, /* Voicemail */
+ { 5, STIMULUS_SPEEDDIAL }, /* Speeddial 5 */
+ { 6, STIMULUS_SPEEDDIAL }, /* Speeddial 6 */
+ { 7, STIMULUS_SPEEDDIAL }, /* Speeddial 7 */
+ { 8, STIMULUS_SPEEDDIAL }, /* Speeddial 8 */
+ { 9, STIMULUS_SPEEDDIAL } /* Speeddial 9 */
+};
+
+button_definition button_def_7910[] = {
+ { 1, STIMULUS_LINE }, /* Line 1 */
+ { 1, STIMULUS_HOLD }, /* Hold */
+ { 1, STIMULUS_TRANSFER },
+ { 1, STIMULUS_DISPLAY },
+ { 1, STIMULUS_VOICEMAIL },
+ { 1, STIMULUS_CONFERENCE },
+ { 1, STIMULUS_FORWARDALL },
+ { 1, STIMULUS_SPEEDDIAL }, /* Speeddial 1 */
+ { 2, STIMULUS_SPEEDDIAL }, /* Speeddial 2 */
+ { 1, STIMULUS_REDIAL }
+};
+
+button_definition button_def_7920[] = {
+ { 1, STIMULUS_LINE }, /* Line 1 */
+ { 2, STIMULUS_LINE }, /* Line 2 */
+ { 1, STIMULUS_SPEEDDIAL }, /* Speeddial 1 */
+ { 2, STIMULUS_SPEEDDIAL }, /* Speeddial 2 */
+ { 3, STIMULUS_SPEEDDIAL }, /* Speeddial 3 */
+ { 4, STIMULUS_SPEEDDIAL } /* Speeddial 4 */
+};
+
+button_definition button_def_none = { 0, STIMULUS_NONE };
+
+typedef struct button_defs {
+ char *type;
+ int num_buttons;
+ button_definition *button_def;
+} button_defs_t;
+
+button_defs_t button_defs[] = {
+ { "12SP", 12, button_def_12sp }, /* First one is used if
+ there's no match */
+ { "30VIP", 26, button_def_30vip },
+ { "7910", 10, button_def_7910 },
+ { "7920", 6, button_def_7920 },
+ { NULL, 0, NULL }
+};
+
typedef struct button_template_res_message {
UINT32 buttonOffset;
UINT32 buttonCount;
@@ -415,40 +410,33 @@ typedef struct close_recieve_channel_message {
} close_recieve_channel_message;
#define SOFT_KEY_TEMPLATE_RES_MESSAGE 0x0108
-static const char *soft_key_template_hack = {
- "\x52\x65\x64\x69\x61\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x01\x00\x00\x00\x4e\x65\x77\x43\x61\x6c\6c\\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x02\x00\x00\x00\x48\x6f\x6c\x64\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x54\x72\x6e\x73"
- "\x66\x65\x72\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00"
- "\x43\x46\x77\x64\x41\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05"
- "\x00\x00\x00\x43\x46\x77\x64\x20\x42\x75\x73\x79\x00\x00\x00\x00"
- "\x00\x00\x00\x06\x00\x00\x00\x43\x46\x77\x64\x4e\x6f\x41\x6e\x73"
- "\x77\x65\x72\x00\x00\x00\x00\x07\x00\x00\x00\x3c\x3c\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x45"
- "\x6e\x64\x43\x61\x6c\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09"
- "\x00\x00\x00\x52\x65\x73\x75\x6d\x65\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x0a\x00\x00\x00\x41\x6e\x73\x77\x65\x72\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x0b\x00\x00\x00\x49\x6e\x66\x6f\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x43\x6f"
- "\x6e\x66\x72\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0d\x00\x00"
- "\x00\x50\x61\x72\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x0e\x00\x00\x00\x4a\x6f\x69\x6e\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x0f\x00\x00\x00\x4d\x65\x65\x74\x4d\x65\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x50\x69\x63\x6b"
- "\x55\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x00\x00"
- "\x47\x50\x69\x63\x6b\x55\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00"
- "\x12\x00\x00\x00\x52\x6d\x4c\x73\x43\x00\x00\x00\x00\x00\x00\x00"
- "\x00\x00\x00\x13\x00\x00\x00\x42\x61\x72\x67\x65\x00\x00\x00\x00"
- "\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x42\x61\x72\x67\x65"
- "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x00\x00\x00"
-};
typedef struct soft_key_template_definition {
char softKeyLabel[16];
int softKeyEvent;
} soft_key_template_definition;
+soft_key_template_definition soft_key_template_default[] = {
+ { "Redial", 1 },
+ { "NewCall", 2 },
+ { "Hold", 3 },
+ { "Trnsfer", 4 },
+ { "CFwdAll", 5 },
+ { "CFwdBusy", 6 },
+ { "CFwdNoAnswer", 7 },
+ { "<<", 8 },
+ { "EndCall", 9 },
+ { "Resume", 10 },
+ { "Answer", 11 },
+ { "Info", 12 },
+ { "Confrn", 13 },
+ { "Park", 14 },
+ { "Join", 15 },
+ { "MeetMe", 16 },
+ { "PickUp", 17 },
+ { "GPickUp", 18 }
+};
+
typedef struct soft_key_template {
int softKeyOffset;
int softKeyCount;
@@ -644,22 +632,6 @@ static int callnums = 1;
#define TYPE_TRUNK 1
#define TYPE_LINE 2
-#define STIMULUS_REDIAL 1
-#define STIMULUS_SPEEDDIAL 2
-#define STIMULUS_HOLD 3
-#define STIMULUS_TRANSFER 4
-#define STIMULUS_FORWARDALL 5
-#define STIMULUS_FORWARDBUSY 6
-#define STIMULUS_FORWARDNOANSWER 7
-#define STIMULUS_DISPLAY 8
-#define STIMULUS_LINE 9
-#define STIMULUS_VOICEMAIL 15
-#define STIMULUS_AUTOANSWER 17
-#define STIMULUS_CONFERENCE 125
-#define STIMULUS_CALLPARK 126
-#define STIMULUS_CALLPICKUP 127
-
-
/* Skinny rtp stream modes. Do we really need this? */
#define SKINNY_CX_SENDONLY 0
#define SKINNY_CX_RECVONLY 1
@@ -2077,6 +2049,7 @@ static int handle_message(skinny_req *req, struct skinnysession *s)
time_t timer;
struct tm *cmtime;
pthread_t t;
+ button_defs_t *b, *buse;
if ( (!s->device) && (req->e != REGISTER_MESSAGE && req->e != ALARM_MESSAGE)) {
ast_log(LOG_WARNING, "Client sent message #%d without first registering.\n", req->e);
@@ -2261,44 +2234,45 @@ static int handle_message(skinny_req *req, struct skinnysession *s)
if (skinnydebug) {
ast_verbose("Buttontemplate requested\n");
}
+
+ sub = find_subchannel_by_line(s->device->lines);
+
memset(req, 0, SKINNY_MAX_PACKET);
req->e = BUTTON_TEMPLATE_RES_MESSAGE;
- /* XXX Less of a hack, more of a kludge now */
- sub = find_subchannel_by_line(s->device->lines);
req->len = sizeof(button_template_res_message)+4;
- if (!strcmp(s->device->model,"30VIP")){
- req->data.buttontemplate.buttonOffset = 0;
- req->data.buttontemplate.buttonCount = 30;
- req->data.buttontemplate.totalButtonCount = 30;
- memcpy(req->data.buttontemplate.definition,
- thirtyvip_button_definition_hack,
- sizeof(req->data.buttontemplate.definition));
- if(skinnydebug){
- ast_verbose("Sending 30VIP template to %s@%s (%s)\n",sub->parent->name, sub->parent->parent->name, s->device->model);
+
+ /* Find a matching button definition, default to first in the
+ list */
+ buse = button_defs;
+ for(b=button_defs; b->type; b++) {
+ if (!strcmp(s->device->model, b->type)) {
+ buse = b;
}
- }else if(!strcmp(s->device->model,"12SP")){
- req->data.buttontemplate.buttonOffset = 0;
- req->data.buttontemplate.buttonCount = 12;
- req->data.buttontemplate.totalButtonCount = 12;
- memcpy(req->data.buttontemplate.definition,
- twelvesp_button_definition_hack,
- sizeof(req->data.buttontemplate.definition));
- if(skinnydebug){
- ast_verbose("Sending 12SP template to %s@%s (%s)\n",sub->parent->name, sub->parent->parent->name, s->device->model);
- }
- }else{
- req->data.buttontemplate.buttonOffset = 0;
- req->data.buttontemplate.buttonCount = 12;
- req->data.buttontemplate.totalButtonCount = 12;
- memcpy(req->data.buttontemplate.definition,
- twelvesp_button_definition_hack,
- sizeof(req->data.buttontemplate.definition));
- if(skinnydebug){
- ast_verbose("Sending default template to %s@%s (%s)\n",sub->parent->name, sub->parent->parent->name, s->device->model);
+ }
+
+ req->data.buttontemplate.buttonOffset = 0;
+ req->data.buttontemplate.buttonCount = buse->num_buttons;
+ req->data.buttontemplate.totalButtonCount = buse->num_buttons;
+ for (i=0; i<42; i++) {
+ if (i < buse->num_buttons) {
+ memcpy(&(req->data.buttontemplate.definition[i]),
+ &(buse->button_def[i]),
+ sizeof(button_definition));
+ } else {
+ memcpy(&(req->data.buttontemplate.definition[i]),
+ &(button_def_none),
+ sizeof(button_definition));
}
+ }
+ if(skinnydebug){
+ ast_verbose("Sending %s template to %s@%s (%s)\n",
+ buse->type,
+ sub->parent->name,
+ sub->parent->parent->name,
+ s->device->model);
}
-
+
transmit_response(s, req);
break;
case SOFT_KEY_SET_REQ_MESSAGE:
@@ -2325,12 +2299,11 @@ static int handle_message(skinny_req *req, struct skinnysession *s)
req->len = sizeof(soft_key_template)+4;
req->e = SOFT_KEY_TEMPLATE_RES_MESSAGE;
req->data.softkeytemplate.softKeyOffset = 0;
- req->data.softkeytemplate.softKeyCount = 21;
- req->data.softkeytemplate.totalSoftKeyCount = 21;
- /* XXX Another wicked hack XXX */
+ req->data.softkeytemplate.softKeyCount = sizeof(soft_key_template_default) / sizeof(soft_key_template_definition);
+ req->data.softkeytemplate.totalSoftKeyCount = sizeof(soft_key_template_default) / sizeof(soft_key_template_definition);
memcpy(req->data.softkeytemplate.softKeyTemplateDefinition,
- soft_key_template_hack,
- sizeof(req->data.softkeytemplate.softKeyTemplateDefinition));
+ soft_key_template_default,
+ sizeof(soft_key_template_default));
transmit_response(s,req);
break;
case TIME_DATE_REQ_MESSAGE: