blob: 2b895e6c26d763257935a6826cd8a4e4bc9dc65a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2013 IBM Corp.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* and Eclipse Distribution License v1.0 which accompany this distribution.
*
* The Eclipse Public License is available at
* http://www.eclipse.org/legal/epl-v10.html
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* Contributors:
* Ian Craggs - initial API and implementation and/or initial documentation
*******************************************************************************/
/**
*
* Description : MQTT-SN timer file
*
*/
#include <stdlib.h>
#include <string.h>
#include "mqtts-timer.h"
#include "gp_api.h"
#include "mqtts_api.h"
/* Timer ids */
static unsigned char timer_ack;
static unsigned char timer_keep_alive;
static unsigned char timer_wait_searchgw;
static unsigned char timer_wait_gwinfo;
static unsigned char gAckMissedCnt=0;
/* Keep-alive timer value */
static unsigned char gKeepAliveTime[2]={0,0};
/* SEARCHGW procedure */
/* simplified procedure
* SEARCHGW delay: double after each time-out acc. until it reaches 255 sec
*/
static unsigned char gSearchGwDelay = SEARCHGW_MIN_DELAY;
/*callback functions when time-out */
void timeoutcb_ack(void);
void timeoutcb_keep_alive(void);
void timeoutcb_wait_searchgw(void);
void timeoutcb_wait_gwinfo(void);
/* functions prototypes, see mqtts-core.c */
void lost_gw(void);
void mqtts_pingreq(void);
void mqtts_searchgw(void);
void mqtts_gwinfo(void);
void send_backupMsg(void);
/**
* init timer component */
void mqtts_timer_init(void) {
/* ask gp to create timers */
timer_ack = gp_timer_new(timeoutcb_ack);
timer_keep_alive = gp_timer_new(timeoutcb_keep_alive);
timer_wait_searchgw = gp_timer_new(timeoutcb_wait_searchgw);
timer_wait_gwinfo = gp_timer_new(timeoutcb_wait_gwinfo);
}
/**
* set the keep alive timer value, value in sec */
void mqtts_timer_set_keep_alive_time(unsigned char *time) {
gKeepAliveTime[0] = time[0]; /*Most significant byte*/
gKeepAliveTime[1] = time[1]; /*Least significant byte */
}
/**
* stop and release all timers */
void mqtts_timer_end(void) {
gp_timer_end(timer_ack);
gp_timer_end(timer_keep_alive);
gp_timer_end(timer_wait_searchgw);
gp_timer_end(timer_wait_gwinfo);
gAckMissedCnt=0;
gSearchGwDelay=SEARCHGW_MIN_DELAY;
}
/**
* start ACK timer */
void mqtts_timer_start_ack(void) {
gp_timer_start(timer_ack, 0, ACK_TIME);
}
/**
* start keep alive timer */
void mqtts_timer_start_keep_alive(void) {
gp_timer_start(timer_keep_alive, gKeepAliveTime[0], gKeepAliveTime[1]);
}
/**
* start timer for SEARCHGW */
void mqtts_timer_start_wait_searchgw() {
gp_timer_start(timer_wait_searchgw,0,gSearchGwDelay);
/* douple time delay for SEARCHGW after every time-out
* until it reaches 255 sec */
if ((gSearchGwDelay==0x80) || (gSearchGwDelay==0xFF)) {
gSearchGwDelay = 0xFF;
} else {
gSearchGwDelay = gSearchGwDelay << 1;
}
}
/**
* start timer for GWINFO */
void mqtts_timer_start_wait_gwinfo() {
gp_timer_start(timer_wait_gwinfo,0,GWINFO_MIN_DELAY);
}
/**
* stop ack timer and reset gAckMissedCnt */
void mqtts_timer_stop_ack(void) {
gp_timer_stop(timer_ack);
gAckMissedCnt=0;
}
/**
* stop keep alive timer */
void mqtts_timer_stop_keep_alive(void) {
gp_timer_stop(timer_keep_alive);
}
/**
* stop wait GWINFO timer */
void mqtts_timer_stop_wait_gwinfo(void) {
gp_timer_stop(timer_wait_gwinfo);
}
/**
* stop wait SEARCHGW timer */
void mqtts_timer_stop_wait_searchgw(void) {
gp_timer_stop(timer_wait_searchgw);
gSearchGwDelay = 0x01;
}
/**
* ACK time-out */
void timeoutcb_ack(void) {
/* increment counter and stop timer */
gAckMissedCnt++;
/*no need for stop, timer already stopped when times out*/
/*gp_timer_stop(timer_ack);*/
if (gAckMissedCnt > MAX_ACK_MISSED) {
/* too many ACKs missed */
lost_gw();
gAckMissedCnt=0;
} else {
/* send backup message */
send_backupMsg();
}
}
/**
* Keep alive time out: send a PINGREQ to gw */
void timeoutcb_keep_alive(void) {
mqtts_pingreq();
}
/**
* Wait GWINFO time out => send GWINFO */
void timeoutcb_wait_gwinfo(void) {
mqtts_gwinfo();
}
/**
* Wait SEARCHGW time out => send SERACHGW */
void timeoutcb_wait_searchgw(void) {
mqtts_searchgw();
}