dect
/
asterisk
Archived
13
0
Fork 0

There she goes! First commit from me to trunk \o/

Make app_alarmreceiver honor code guidelines and fix whitespace errors.
No functional changes.


git-svn-id: http://svn.digium.com/svn/asterisk/trunk@102906 f38db490-d61c-443f-a65b-d21fe96a405b
This commit is contained in:
mvanbaak 2008-02-07 20:42:59 +00:00
parent a849ca171e
commit 95fe49f760
1 changed files with 155 additions and 242 deletions

View File

@ -77,7 +77,6 @@ static char *descrip =
"tones.\n";
/* Config Variables */
static int fdtimeout = 2000;
static int sdtimeout = 200;
static int toneloudness = 4096;
@ -88,7 +87,6 @@ static char db_family[128] = {'\0'};
static char time_stamp_format[128] = {"%a %b %d, %Y @ %H:%M:%S %Z"};
/* Misc variables */
static char event_file[14] = "/event-XXXXXX";
/*
@ -98,7 +96,6 @@ static char event_file[14] = "/event-XXXXXX";
* in this family if it is defined. If the new key doesn't exist in the
* family, then create it and set its value to 1.
*/
static void database_increment( char *key )
{
int res = 0;
@ -111,7 +108,7 @@ static void database_increment( char *key )
res = ast_db_get(db_family, key, value, sizeof(value) - 1);
if(res){
if (res) {
ast_verb(4, "AlarmReceiver: Creating database entry %s and setting to 1\n", key);
/* Guess we have to create it */
res = ast_db_put(db_family, key, "1");
@ -137,20 +134,20 @@ static void database_increment( char *key )
/*
* Build a MuLaw data block for a single frequency tone
*/
static void make_tone_burst(unsigned char *data, float freq, float loudness, int len, int *x)
{
int i;
float val;
for(i = 0; i < len; i++){
for (i = 0; i < len; i++) {
val = loudness * sin((freq * 2.0 * M_PI * (*x)++)/8000.0);
data[i] = AST_LIN2MU((int)val);
}
/* wrap back around from 8000 */
if (*x >= 8000) *x = 0;
if (*x >= 8000)
*x = 0;
return;
}
@ -158,7 +155,6 @@ static void make_tone_burst(unsigned char *data, float freq, float loudness, int
* Send a single tone burst for a specifed duration and frequency.
* Returns 0 if successful
*/
static int send_tone_burst(struct ast_channel *chan, float freq, int duration, int tldn)
{
int res = 0;
@ -171,16 +167,15 @@ static int send_tone_burst(struct ast_channel *chan, float freq, int duration, i
unsigned char buf[640];
} tone_block;
for(;;)
{
for (;;) {
if (ast_waitfor(chan, -1) < 0){
if (ast_waitfor(chan, -1) < 0) {
res = -1;
break;
}
f = ast_read(chan);
if (!f){
if (!f) {
res = -1;
break;
}
@ -201,7 +196,7 @@ static int send_tone_burst(struct ast_channel *chan, float freq, int duration, i
ast_frfree(f);
break;
}
if (ast_write(chan, &wf)){
if (ast_write(chan, &wf)) {
ast_verb(4, "AlarmReceiver: Failed to write frame on %s\n", chan->name);
ast_log(LOG_WARNING, "AlarmReceiver Failed to write frame on %s\n",chan->name);
res = -1;
@ -225,7 +220,6 @@ static int send_tone_burst(struct ast_channel *chan, float freq, int duration, i
* Returns -1 if the caller hung up or there was a channel error.
*
*/
static int receive_dtmf_digits(struct ast_channel *chan, char *digit_string, int length, int fdto, int sdto)
{
int res = 0;
@ -235,14 +229,11 @@ static int receive_dtmf_digits(struct ast_channel *chan, char *digit_string, int
struct timeval lastdigittime;
lastdigittime = ast_tvnow();
for(;;){
/* if outa time, leave */
if (ast_tvdiff_ms(ast_tvnow(), lastdigittime) >
((i > 0) ? sdto : fdto)){
for (;;) {
/* if outa time, leave */
if (ast_tvdiff_ms(ast_tvnow(), lastdigittime) > ((i > 0) ? sdto : fdto)) {
ast_verb(4, "AlarmReceiver: DTMF Digit Timeout on %s\n", chan->name);
ast_debug(1,"AlarmReceiver: DTMF timeout on chan %s\n",chan->name);
res = 1;
break;
}
@ -254,21 +245,20 @@ static int receive_dtmf_digits(struct ast_channel *chan, char *digit_string, int
f = ast_read(chan);
if (f == NULL){
if (f == NULL) {
res = -1;
break;
}
/* If they hung up, leave */
if ((f->frametype == AST_FRAME_CONTROL) &&
(f->subclass == AST_CONTROL_HANGUP)){
if ((f->frametype == AST_FRAME_CONTROL) && (f->subclass == AST_CONTROL_HANGUP)) {
ast_frfree(f);
res = -1;
break;
}
/* if not DTMF, just do it again */
if (f->frametype != AST_FRAME_DTMF){
if (f->frametype != AST_FRAME_DTMF) {
ast_frfree(f);
continue;
}
@ -286,13 +276,11 @@ static int receive_dtmf_digits(struct ast_channel *chan, char *digit_string, int
digit_string[i] = '\0'; /* Nul terminate the end of the digit string */
return res;
}
/*
* Write the metadata to the log file
*/
static int write_metadata( FILE *logfile, char *signalling_type, struct ast_channel *chan)
{
int res = 0;
@ -311,40 +299,34 @@ static int write_metadata( FILE *logfile, char *signalling_type, struct ast_chan
if (cl)
ast_shrink_phone_number(cl);
/* Get the current time */
t = ast_tvnow();
ast_localtime(&t, &now, NULL);
/* Format the time */
ast_strftime(timestamp, sizeof(timestamp), time_stamp_format, &now);
res = fprintf(logfile, "\n\n[metadata]\n\n");
if(res >= 0)
if (res >= 0)
res = fprintf(logfile, "PROTOCOL=%s\n", signalling_type);
if(res >= 0)
if (res >= 0)
res = fprintf(logfile, "CALLINGFROM=%s\n", (!cl) ? "<unknown>" : cl);
if(res >- 0)
if (res >- 0)
res = fprintf(logfile, "CALLERNAME=%s\n", (!cn) ? "<unknown>" : cn);
if(res >= 0)
if (res >= 0)
res = fprintf(logfile, "TIMESTAMP=%s\n\n", timestamp);
if(res >= 0)
if (res >= 0)
res = fprintf(logfile, "[events]\n\n");
if(res < 0){
if (res < 0) {
ast_verb(3, "AlarmReceiver: can't write metadata\n");
ast_debug(1,"AlarmReceiver: can't write metadata\n");
}
else
} else
res = 0;
return res;
@ -353,23 +335,20 @@ static int write_metadata( FILE *logfile, char *signalling_type, struct ast_chan
/*
* Write a single event to the log file
*/
static int write_event( FILE *logfile, event_node_t *event)
{
int res = 0;
if( fprintf(logfile, "%s\n", event->data) < 0)
if (fprintf(logfile, "%s\n", event->data) < 0)
res = -1;
return res;
}
/*
* If we are configured to log events, do so here.
*
*/
static int log_events(struct ast_channel *chan, char *signalling_type, event_node_t *event)
{
@ -382,40 +361,37 @@ static int log_events(struct ast_channel *chan, char *signalling_type, event_no
if (!ast_strlen_zero(event_spool_dir)) {
/* Make a template */
ast_copy_string(workstring, event_spool_dir, sizeof(workstring));
strncat(workstring, event_file, sizeof(workstring) - strlen(workstring) - 1);
/* Make the temporary file */
fd = mkstemp(workstring);
if(fd == -1) {
if (fd == -1) {
ast_verb(3, "AlarmReceiver: can't make temporary file\n");
ast_debug(1,"AlarmReceiver: can't make temporary file\n");
res = -1;
}
if(!res){
if (!res) {
logfile = fdopen(fd, "w");
if(logfile){
if (logfile) {
/* Write the file */
res = write_metadata(logfile, signalling_type, chan);
if(!res)
while((!res) && (elp != NULL)){
if (!res)
while ((!res) && (elp != NULL)) {
res = write_event(logfile, elp);
elp = elp->next;
}
if(!res){
if(fflush(logfile) == EOF)
if (!res) {
if (fflush(logfile) == EOF)
res = -1;
if(!res){
if(fclose(logfile) == EOF)
if (!res) {
if (fclose(logfile) == EOF)
res = -1;
}
}
}
else
} else
res = -1;
}
}
@ -428,10 +404,9 @@ static int log_events(struct ast_channel *chan, char *signalling_type, event_no
*
* The function will return 0 when the caller hangs up, else a -1 if there was a problem.
*/
static int receive_ademco_contact_id( struct ast_channel *chan, void *data, int fdto, int sdto, int tldn, event_node_t **ehead)
{
int i,j;
int i, j;
int res = 0;
int checksum;
char event[17];
@ -441,49 +416,34 @@ static int receive_ademco_contact_id( struct ast_channel *chan, void *data, int
int ack_retries = 0;
static char digit_map[15] = "0123456789*#ABC";
static unsigned char digit_weights[15] = {10,1,2,3,4,5,6,7,8,9,11,12,13,14,15};
static unsigned char digit_weights[15] = {10,1,2,3,4,5,6,7,8,9,11,12,13,14,15};
database_increment("calls-received");
/* Wait for first event */
ast_verb(4, "AlarmReceiver: Waiting for first event from panel\n");
while(res >= 0){
if(got_some_digits == 0){
/* Send ACK tone sequence */
ast_verb(4, "AlarmReceiver: Sending 1400Hz 100ms burst (ACK)\n");
res = send_tone_burst(chan, 1400.0, 100, tldn);
if(!res)
res = ast_safe_sleep(chan, 100);
if(!res){
ast_verb(4, "AlarmReceiver: Sending 2300Hz 100ms burst (ACK)\n");
res = send_tone_burst(chan, 2300.0, 100, tldn);
}
while (res >= 0) {
if (got_some_digits == 0) {
/* Send ACK tone sequence */
ast_verb(4, "AlarmReceiver: Sending 1400Hz 100ms burst (ACK)\n");
res = send_tone_burst(chan, 1400.0, 100, tldn);
if (!res)
res = ast_safe_sleep(chan, 100);
if (!res) {
ast_verb(4, "AlarmReceiver: Sending 2300Hz 100ms burst (ACK)\n");
res = send_tone_burst(chan, 2300.0, 100, tldn);
}
}
if( res >= 0)
if ( res >= 0)
res = receive_dtmf_digits(chan, event, sizeof(event) - 1, fdto, sdto);
if (res < 0){
if(events_received == 0)
if (res < 0) {
if (events_received == 0) {
/* Hangup with no events received should be logged in the DB */
database_increment("no-events-received");
else{
if(ack_retries){
} else {
if (ack_retries) {
ast_verb(4, "AlarmReceiver: ACK retries during this call: %d\n", ack_retries);
database_increment("ack-retries");
}
}
@ -492,11 +452,11 @@ static int receive_ademco_contact_id( struct ast_channel *chan, void *data, int
break;
}
if(res != 0){
/* Didn't get all of the digits */
if (res != 0) {
/* Didn't get all of the digits */
ast_verb(2, "AlarmReceiver: Incomplete string: %s, trying again...\n", event);
if(!got_some_digits){
if (!got_some_digits) {
got_some_digits = (!ast_strlen_zero(event)) ? 1 : 0;
ack_retries++;
}
@ -510,19 +470,18 @@ static int receive_ademco_contact_id( struct ast_channel *chan, void *data, int
/* Calculate checksum */
for(j = 0, checksum = 0; j < 16; j++){
for(i = 0 ; i < sizeof(digit_map) ; i++){
if(digit_map[i] == event[j])
for (j = 0, checksum = 0; j < 16; j++) {
for (i = 0; i < sizeof(digit_map); i++) {
if (digit_map[i] == event[j])
break;
}
if(i == 16)
if (i == 16)
break;
checksum += digit_weights[i];
}
if(i == 16){
if (i == 16) {
ast_verb(2, "AlarmReceiver: Bad DTMF character %c, trying again\n", event[j]);
continue; /* Bad character */
}
@ -540,8 +499,8 @@ static int receive_ademco_contact_id( struct ast_channel *chan, void *data, int
/* Check the message type for correctness */
if(strncmp(event + 4, "18", 2)){
if(strncmp(event + 4, "98", 2)){
if (strncmp(event + 4, "18", 2)) {
if (strncmp(event + 4, "98", 2)) {
database_increment("format-errors");
ast_verb(2, "AlarmReceiver: Wrong message type\n");
ast_debug(1, "AlarmReceiver: Wrong message type\n");
@ -563,116 +522,89 @@ static int receive_ademco_contact_id( struct ast_channel *chan, void *data, int
/*
* Insert event onto end of list
*/
if(*ehead == NULL){
if (*ehead == NULL)
*ehead = enew;
}
else{
else {
for(elp = *ehead; elp->next != NULL; elp = elp->next)
;
elp->next = enew;
}
if(res > 0)
if (res > 0)
res = 0;
/* Let the user have the option of logging the single event before sending the kissoff tone */
if((res == 0) && (log_individual_events))
if ((res == 0) && (log_individual_events))
res = log_events(chan, ADEMCO_CONTACT_ID, enew);
/* Wait 200 msec before sending kissoff */
if(res == 0)
if (res == 0)
res = ast_safe_sleep(chan, 200);
/* Send the kissoff tone */
if(res == 0)
if (res == 0)
res = send_tone_burst(chan, 1400.0, 900, tldn);
}
return res;
}
/*
* This is the main function called by Asterisk Core whenever the App is invoked in the extension logic.
* This function will always return 0.
*/
static int alarmreceiver_exec(struct ast_channel *chan, void *data)
{
int res = 0;
event_node_t *elp, *efree;
char signalling_type[64] = "";
event_node_t *event_head = NULL;
/* Set write and read formats to ULAW */
ast_verb(4, "AlarmReceiver: Setting read and write formats to ULAW\n");
if (ast_set_write_format(chan,AST_FORMAT_ULAW)){
if (ast_set_write_format(chan,AST_FORMAT_ULAW)) {
ast_log(LOG_WARNING, "AlarmReceiver: Unable to set write format to Mu-law on %s\n",chan->name);
return -1;
}
if (ast_set_read_format(chan,AST_FORMAT_ULAW)){
if (ast_set_read_format(chan,AST_FORMAT_ULAW)) {
ast_log(LOG_WARNING, "AlarmReceiver: Unable to set read format to Mu-law on %s\n",chan->name);
return -1;
}
/* Set default values for this invocation of the application */
ast_copy_string(signalling_type, ADEMCO_CONTACT_ID, sizeof(signalling_type));
/* Answer the channel if it is not already */
ast_verb(4, "AlarmReceiver: Answering channel\n");
if (chan->_state != AST_STATE_UP) {
if ((res = ast_answer(chan)))
return -1;
}
/* Wait for the connection to settle post-answer */
ast_verb(4, "AlarmReceiver: Waiting for connection to stabilize\n");
res = ast_safe_sleep(chan, 1250);
/* Attempt to receive the events */
if(!res){
if (!res) {
/* Determine the protocol to receive in advance */
/* Note: Ademco contact is the only one supported at this time */
/* Others may be added later */
if(!strcmp(signalling_type, ADEMCO_CONTACT_ID))
receive_ademco_contact_id(chan, data, fdtimeout, sdtimeout, toneloudness, &event_head);
else
res = -1;
}
/* Events queued by receiver, write them all out here if so configured */
if((!res) && (log_individual_events == 0)){
if ((!res) && (log_individual_events == 0))
res = log_events(chan, signalling_type, event_head);
}
/*
* Do we exec a command line at the end?
*/
if((!res) && (!ast_strlen_zero(event_app)) && (event_head)){
if ((!res) && (!ast_strlen_zero(event_app)) && (event_head)) {
ast_debug(1,"Alarmreceiver: executing: %s\n", event_app);
ast_safe_system(event_app);
}
@ -680,8 +612,7 @@ static int alarmreceiver_exec(struct ast_channel *chan, void *data)
/*
* Free up the data allocated in our linked list
*/
for(elp = event_head; (elp != NULL);){
for (elp = event_head; (elp != NULL);) {
efree = elp;
elp = elp->next;
ast_free(efree);
@ -693,7 +624,6 @@ static int alarmreceiver_exec(struct ast_channel *chan, void *data)
/*
* Load the configuration from the configuration file
*/
static int load_config(void)
{
struct ast_config *cfg;
@ -701,26 +631,19 @@ static int load_config(void)
struct ast_flags config_flags = { 0 };
/* Read in the config file */
cfg = ast_config_load(ALMRCV_CONFIG, config_flags);
if(!cfg){
if (!cfg) {
ast_verb(4, "AlarmReceiver: No config file\n");
return 0;
}
else{
} else {
p = ast_variable_retrieve(cfg, "general", "eventcmd");
if(p){
if (p) {
ast_copy_string(event_app, p, sizeof(event_app));
event_app[sizeof(event_app) - 1] = '\0';
}
p = ast_variable_retrieve(cfg, "general", "loudness");
if(p){
if (p) {
toneloudness = atoi(p);
if(toneloudness < 100)
toneloudness = 100;
@ -728,7 +651,7 @@ static int load_config(void)
toneloudness = 8192;
}
p = ast_variable_retrieve(cfg, "general", "fdtimeout");
if(p){
if (p) {
fdtimeout = atoi(p);
if(fdtimeout < 1000)
fdtimeout = 1000;
@ -737,52 +660,43 @@ static int load_config(void)
}
p = ast_variable_retrieve(cfg, "general", "sdtimeout");
if(p){
if (p) {
sdtimeout = atoi(p);
if(sdtimeout < 110)
sdtimeout = 110;
if(sdtimeout > 4000)
sdtimeout = 4000;
}
p = ast_variable_retrieve(cfg, "general", "logindividualevents");
if(p){
if (p)
log_individual_events = ast_true(p);
}
p = ast_variable_retrieve(cfg, "general", "eventspooldir");
if(p){
if (p) {
ast_copy_string(event_spool_dir, p, sizeof(event_spool_dir));
event_spool_dir[sizeof(event_spool_dir) - 1] = '\0';
}
p = ast_variable_retrieve(cfg, "general", "timestampformat");
if(p){
if (p) {
ast_copy_string(time_stamp_format, p, sizeof(time_stamp_format));
time_stamp_format[sizeof(time_stamp_format) - 1] = '\0';
}
p = ast_variable_retrieve(cfg, "general", "db-family");
if(p){
if (p) {
ast_copy_string(db_family, p, sizeof(db_family));
db_family[sizeof(db_family) - 1] = '\0';
}
ast_config_destroy(cfg);
}
return 1;
}
/*
* These functions are required to implement an Asterisk App.
*/
static int unload_module(void)
{
return ast_unregister_application(app);
@ -790,12 +704,11 @@ static int unload_module(void)
static int load_module(void)
{
if(load_config()) {
if (load_config()) {
if (ast_register_application(app, alarmreceiver_exec, synopsis, descrip))
return AST_MODULE_LOAD_FAILURE;
return AST_MODULE_LOAD_SUCCESS;
}
else
} else
return AST_MODULE_LOAD_DECLINE;
}