From ffec70d5798fb32f6ef73c9be93b31269381c190 Mon Sep 17 00:00:00 2001 From: jeremy Date: Tue, 24 May 2005 22:24:04 +0000 Subject: 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 --- channels/chan_skinny.c | 337 +++++++++++++++++++++++-------------------------- 1 file 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: -- cgit v1.2.3