Sfoglia il codice sorgente

Implementing optional parameter `restart` to tmr:start() (#3111)

Lukáš Voborský 3 anni fa
parent
commit
d72ea91ed0
2 ha cambiato i file con 72 aggiunte e 65 eliminazioni
  1. 69 62
      app/modules/tmr.c
  2. 3 3
      docs/modules/tmr.md

+ 69 - 62
app/modules/tmr.c

@@ -56,35 +56,35 @@ static sint32_t soft_watchdog  = -1;
 static os_timer_t rtc_timer;
 
 static void alarm_timer_common(void* arg){
-  tmr_t *tmr = (tmr_t *) arg;
-  if(tmr->lua_ref > 0) {
-    lua_State* L = lua_getstate();
-    lua_rawgeti(L, LUA_REGISTRYINDEX, tmr->lua_ref);
-    lua_rawgeti(L, LUA_REGISTRYINDEX, tmr->self_ref);
-    if (tmr->mode != TIMER_MODE_AUTO) {
-    if(tmr->mode == TIMER_MODE_SINGLE) {
-      luaL_unref2(L, LUA_REGISTRYINDEX, tmr->lua_ref);
-      luaL_unref2(L, LUA_REGISTRYINDEX, tmr->self_ref);
-      tmr->mode = TIMER_MODE_OFF;
-    } else if (tmr->mode == TIMER_MODE_SEMI) {
-      tmr->mode |= TIMER_IDLE_FLAG;
-      luaL_unref2(L, LUA_REGISTRYINDEX, tmr->self_ref);
-      }
-    }
-    luaL_pcallx(L, 1, 0);
-  }
+	tmr_t *tmr = (tmr_t *) arg;
+	if(tmr->lua_ref > 0) {
+		lua_State* L = lua_getstate();
+		lua_rawgeti(L, LUA_REGISTRYINDEX, tmr->lua_ref);
+		lua_rawgeti(L, LUA_REGISTRYINDEX, tmr->self_ref);
+		if (tmr->mode != TIMER_MODE_AUTO) {
+		if(tmr->mode == TIMER_MODE_SINGLE) {
+			luaL_unref2(L, LUA_REGISTRYINDEX, tmr->lua_ref);
+			luaL_unref2(L, LUA_REGISTRYINDEX, tmr->self_ref);
+			tmr->mode = TIMER_MODE_OFF;
+		} else if (tmr->mode == TIMER_MODE_SEMI) {
+			tmr->mode |= TIMER_IDLE_FLAG;
+			luaL_unref2(L, LUA_REGISTRYINDEX, tmr->self_ref);
+			}
+		}
+		luaL_pcallx(L, 1, 0);
+	}
 }
 
 // Lua: tmr.delay( us )
 static int tmr_delay( lua_State* L ){
 	sint32_t us = luaL_checkinteger(L, 1);
-  luaL_argcheck(L, us>0, 1, "wrong arg range");
+	luaL_argcheck(L, us>0, 1, "wrong arg range");
 	while(us > 0){
 	  os_delay_us(us >= 1000000 ? 1000000 : us);
 	  system_soft_wdt_feed ();
 	  us -= 1000000;
 	}
-  return 0;
+	return 0;
 }
 
 // Lua: tmr.now() , return system timer in us
@@ -125,19 +125,26 @@ static int tmr_register(lua_State* L) {
 	return 0;
 }
 
-// Lua: t:start()
+// Lua: t:start( [restart] )
 static int tmr_start(lua_State* L){
 	tmr_t *tmr = (tmr_t *) luaL_checkudata(L, 1, "tmr.timer");
-  int idle = tmr->mode & TIMER_IDLE_FLAG;
+	lua_settop(L, 2);
+	luaL_argcheck(L, lua_isboolean(L, 2) || lua_isnil(L, 2), 2, "boolean expected");
+	int restart = lua_toboolean(L, 2);
 
-  lua_settop(L, 1);  /* ignore any args after the userdata */
+	lua_settop(L, 1);  /* ignore any args after the userdata */
 	if (tmr->self_ref == LUA_NOREF)
 		tmr->self_ref = luaL_ref(L, LUA_REGISTRYINDEX);
 
-	if(idle) {
-  	tmr->mode &= ~TIMER_IDLE_FLAG;
+	//we return false if the timer is not idle
+	int idle = tmr->mode&TIMER_IDLE_FLAG;
+	if(!(idle || restart)){
+		lua_pushboolean(L, 0);
+	}else{
+		if (!idle) {os_timer_disarm(&tmr->os);}
+		tmr->mode &= ~TIMER_IDLE_FLAG;
 		os_timer_arm(&tmr->os, tmr->interval, tmr->mode==TIMER_MODE_AUTO);
-  }
+	}
 	lua_pushboolean(L, !idle); /* false if the timer is not idle */
 	return 1;
 }
@@ -151,8 +158,8 @@ static int tmr_alarm(lua_State* L){
 // Lua: t:stop()
 static int tmr_stop(lua_State* L){
 	tmr_t *tmr = (tmr_t *) luaL_checkudata(L, 1, "tmr.timer");
-  int idle = tmr->mode == TIMER_MODE_OFF || (tmr->mode & TIMER_IDLE_FLAG);
-  luaL_unref2(L, LUA_REGISTRYINDEX, tmr->self_ref);
+	int idle = tmr->mode == TIMER_MODE_OFF || (tmr->mode & TIMER_IDLE_FLAG);
+	luaL_unref2(L, LUA_REGISTRYINDEX, tmr->self_ref);
 
 	if(!idle)
 		os_timer_disarm(&tmr->os);
@@ -169,14 +176,14 @@ static int tmr_stop(lua_State* L){
 #define tmr_suspend_all tmr_suspend_removed
 #define tmr_resume_all  tmr_suspend_removed
 static int tmr_suspend_removed(lua_State* L){
-  return luaL_error(L, TMR_SUSPEND_REMOVED_MSG);
+	return luaL_error(L, TMR_SUSPEND_REMOVED_MSG);
 }
 #endif
 
 // Lua: t:unregister()
 static int tmr_unregister(lua_State* L){
 	tmr_t *tmr =  (tmr_t *) luaL_checkudata(L, 1, "tmr.timer");
-  luaL_unref2(L, LUA_REGISTRYINDEX, tmr->self_ref);
+	luaL_unref2(L, LUA_REGISTRYINDEX, tmr->self_ref);
 	luaL_unref2(L, LUA_REGISTRYINDEX, tmr->lua_ref);
 	if(!(tmr->mode & TIMER_IDLE_FLAG) && tmr->mode != TIMER_MODE_OFF)
 		os_timer_disarm(&tmr->os);
@@ -207,8 +214,8 @@ static int tmr_state(lua_State* L){
 		return 1;
 	}
 
-  lua_pushboolean(L, (tmr->mode & TIMER_IDLE_FLAG) == 0);
-  lua_pushinteger(L, tmr->mode & (~TIMER_IDLE_FLAG));
+	lua_pushboolean(L, (tmr->mode & TIMER_IDLE_FLAG) == 0);
+	lua_pushinteger(L, tmr->mode & (~TIMER_IDLE_FLAG));
 	return 2;
 }
 
@@ -265,7 +272,7 @@ static int tmr_time( lua_State* L ){
 static int tmr_softwd( lua_State* L ){
 	int t = luaL_checkinteger(L, 1);
 	luaL_argcheck(L, t>0 , 2, "invalid time");
-  soft_watchdog = t;
+	soft_watchdog = t;
 	return 0;
 }
 
@@ -282,37 +289,37 @@ static int tmr_create( lua_State *L ) {
 // Module function map
 
 LROT_BEGIN(tmr_dyn, NULL, LROT_MASK_GC_INDEX)
-  LROT_FUNCENTRY( __gc, tmr_unregister )
-  LROT_TABENTRY(  __index, tmr_dyn )
-  LROT_FUNCENTRY( register, tmr_register )
-  LROT_FUNCENTRY( alarm, tmr_alarm )
-  LROT_FUNCENTRY( start, tmr_start )
-  LROT_FUNCENTRY( stop, tmr_stop )
-  LROT_FUNCENTRY( unregister, tmr_unregister )
-  LROT_FUNCENTRY( state, tmr_state )
-  LROT_FUNCENTRY( interval, tmr_interval )
+	LROT_FUNCENTRY( __gc, tmr_unregister )
+	LROT_TABENTRY(  __index, tmr_dyn )
+	LROT_FUNCENTRY( register, tmr_register )
+	LROT_FUNCENTRY( alarm, tmr_alarm )
+	LROT_FUNCENTRY( start, tmr_start )
+	LROT_FUNCENTRY( stop, tmr_stop )
+	LROT_FUNCENTRY( unregister, tmr_unregister )
+	LROT_FUNCENTRY( state, tmr_state )
+	LROT_FUNCENTRY( interval, tmr_interval )
 #ifdef TIMER_SUSPEND_ENABLE
-  LROT_FUNCENTRY( suspend, tmr_suspend )
-  LROT_FUNCENTRY( resume, tmr_resume )
+	LROT_FUNCENTRY( suspend, tmr_suspend )
+	LROT_FUNCENTRY( resume, tmr_resume )
 #endif
 LROT_END(tmr_dyn, NULL, LROT_MASK_GC_INDEX)
 
 
 LROT_BEGIN(tmr, NULL, 0)
-  LROT_FUNCENTRY( delay, tmr_delay )
-  LROT_FUNCENTRY( now, tmr_now )
-  LROT_FUNCENTRY( wdclr, tmr_wdclr )
-  LROT_FUNCENTRY( softwd, tmr_softwd )
-  LROT_FUNCENTRY( time, tmr_time )
-  LROT_FUNCENTRY( ccount, tmr_ccount )
+	LROT_FUNCENTRY( delay, tmr_delay )
+	LROT_FUNCENTRY( now, tmr_now )
+	LROT_FUNCENTRY( wdclr, tmr_wdclr )
+	LROT_FUNCENTRY( softwd, tmr_softwd )
+	LROT_FUNCENTRY( time, tmr_time )
+	LROT_FUNCENTRY( ccount, tmr_ccount )
 #ifdef TIMER_SUSPEND_ENABLE
-  LROT_FUNCENTRY( suspend_all, tmr_suspend_all )
-  LROT_FUNCENTRY( resume_all, tmr_resume_all )
+	LROT_FUNCENTRY( suspend_all, tmr_suspend_all )
+	LROT_FUNCENTRY( resume_all, tmr_resume_all )
 #endif
-  LROT_FUNCENTRY( create, tmr_create )
-  LROT_NUMENTRY( ALARM_SINGLE, TIMER_MODE_SINGLE )
-  LROT_NUMENTRY( ALARM_SEMI, TIMER_MODE_SEMI )
-  LROT_NUMENTRY( ALARM_AUTO, TIMER_MODE_AUTO )
+	LROT_FUNCENTRY( create, tmr_create )
+	LROT_NUMENTRY( ALARM_SINGLE, TIMER_MODE_SINGLE )
+	LROT_NUMENTRY( ALARM_SEMI, TIMER_MODE_SEMI )
+	LROT_NUMENTRY( ALARM_AUTO, TIMER_MODE_AUTO )
 LROT_END(tmr, NULL, 0)
 
 
@@ -327,14 +334,14 @@ int luaopen_tmr( lua_State *L ){
 	os_timer_setfn(&rtc_timer, rtc_callback, NULL);
 	os_timer_arm(&rtc_timer, 1000, 1);
 
-  // The function rtc_callback calls the a function that calibrates the SoftRTC
-  // for drift in the esp8266's clock.  My guess: after the duration of light_sleep
-  // there is bound to be some drift in the clock, so a calibration is due.
-  SWTIMER_REG_CB(rtc_callback, SWTIMER_RESUME);
+	// The function rtc_callback calls the a function that calibrates the SoftRTC
+	// for drift in the esp8266's clock.  My guess: after the duration of light_sleep
+	// there is bound to be some drift in the clock, so a calibration is due.
+	SWTIMER_REG_CB(rtc_callback, SWTIMER_RESUME);
 
-  // The function alarm_timer_common handles timers created by the developer via
-  // tmr.create().  No reason not to resume the timers, so resume em'.
-  SWTIMER_REG_CB(alarm_timer_common, SWTIMER_RESUME);
+	// The function alarm_timer_common handles timers created by the developer via
+	// tmr.create().  No reason not to resume the timers, so resume em'.
+	SWTIMER_REG_CB(alarm_timer_common, SWTIMER_RESUME);
 
 	return 0;
 }

+ 3 - 3
docs/modules/tmr.md

@@ -273,13 +273,13 @@ mytimer:start()
 
 ### tobj:start()
 
-Starts or restarts a previously configured timer.
+Starts or restarts a previously configured timer. If the timer is running the timer is restarted only when `restart` parameter is `true`. Otherwise `false` is returned signaling error.
 
 #### Syntax
-`tobj:start()`
+`tobj:start([restart])`
 
 #### Parameters
-None
+- `restart` optional boolean parameter forcing to restart already running timer
 
 #### Returns
 `true` if the timer was started, `false` on error