Example #1
0
uint32_t mp_hal_ticks_us(void) {
    return system_get_time();
}
Example #2
0
int _gettimeofday_r(struct _reent *r, struct timeval *tp, void *tzp) {
    uint32_t time = system_get_time();
    tp->tv_sec = time / 1000000;
    tp->tv_usec = time % 1000000;
    return 0;
}
Example #3
0
uint32_t mp_hal_ticks_ms(void) {
    return ((uint64_t)system_time_high_word << 32 | (uint64_t)system_get_time()) / 1000;
}
Example #4
0
//-----------------------------------------------------------------------------------------
void static dht11_protocol(uint32 gpio_status,int cause)
{
    static int actual_bit;

    switch(cause) // 0 = gpio interrupt, 1=timer
    {
        case 0: // gpio edge
        {
// disable interrupt for GPIO
            gpio_pin_intr_state_set(GPIO_ID_PIN(dht11_gpio), GPIO_PIN_INTR_DISABLE);
// clear interrupt status for GPIO
            GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status & GPIO_Pin(dht11_gpio));
// Reactivate interrupts for GPIO0
            gpio_pin_intr_state_set(GPIO_ID_PIN(dht11_gpio), GPIO_PIN_INTR_ANYEGDE);

            switch(sStatus)
            {
                case dht11_connecting:
                    if(GPIO_INPUT_GET(dht11_gpio))
                    {
// Rising edge ?? Error.
                        dht11_set_read_nok();
                        dht11_set_standby();
                    }
                    else
                    {
                        sStatus = dht11_mark_connecting;
                    }
                break;
                case dht11_mark_connecting:
                    if(!GPIO_INPUT_GET(dht11_gpio))
                    {
// Falling edge ?? Error.
                        dht11_set_read_nok();
                        dht11_set_standby();
                    }
                    else
                    {
                        sStatus = dht11_waiting_bit;
                    }
                break;
                case dht11_waiting_bit:
                    if(GPIO_INPUT_GET(dht11_gpio))
                    {
// Rising edge ?? Error.
                        dht11_set_read_nok();
                        dht11_set_standby();
                    }
                    else
                    {
                        sStatus = dht11_mark_bit;
                        actual_bit=0;
                    }
                break;
                case dht11_mark_bit:
                    if(! GPIO_INPUT_GET(dht11_gpio))
                    {
// Falling edge ?? Error.
                        dht11_set_read_nok();
                        dht11_set_standby();
                    }
                    else
                    {
                        if(actual_bit >= 40)
                        {
                            dht11_set_standby();     // finish OK
                        }
                        else
                        {
                            last_timer = system_get_time();
                            sStatus = dht11_read_bit;
                        }
                    }
                break;
                case dht11_read_bit:
                    if(GPIO_INPUT_GET(dht11_gpio))
                    {
// Rising edge ?? Error.
                        dht11_set_read_nok();
                        dht11_set_standby();
                    }
                    else
                    {
// 26-28 uS means 0.   70 uS means 1
                        int bit_data = ((system_get_time()-last_timer) > 40) ? 1:0;
                        int actual_byte = actual_bit / 8;
                        sRead[actual_byte] <<= 1;
                        sRead[actual_byte] |= bit_data;
                        actual_bit++;
                        sStatus = dht11_mark_bit;
                    }
                break;
                case dht11_standby:
                case dht11_mark:
                default:
                    dht11_set_standby();
                break;
            }
        }
        break;
        case 1: //timer
            switch(sStatus)
            {
                case dht11_mark: // end of mark
                    sStatus = dht11_connecting;
                    // GPIO as Output to high level by default.
                    GPIO_OUTPUT_SET(dht11_gpio,1);
                    GPIO_AS_INPUT(dht11_gpio);

                    ETS_GPIO_INTR_DISABLE();

                    gpio_register_set(GPIO_PIN_ADDR(dht11_gpio),
                                       GPIO_PIN_INT_TYPE_SET(GPIO_PIN_INTR_DISABLE)  |
                                       GPIO_PIN_PAD_DRIVER_SET(GPIO_PAD_DRIVER_DISABLE) |
                                       GPIO_PIN_SOURCE_SET(GPIO_AS_PIN_SOURCE));

                    GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, BIT(dht11_gpio));

                    gpio_pin_intr_state_set(GPIO_ID_PIN(dht11_gpio), GPIO_PIN_INTR_ANYEGDE);

                    ETS_GPIO_INTR_ENABLE();

                    os_timer_disarm(&dht11_timer);
                    os_timer_arm(&dht11_timer,6,0); // maximun frame time 4.8 ms
                break;
                case dht11_connecting:
                case dht11_mark_connecting:
                case dht11_waiting_bit:
                case dht11_mark_bit:
                case dht11_read_bit:
                default:
                    dht11_set_read_nok();
                    dht11_set_standby();
                break;
            }

        default:
        break;
    }
}
// internal function to process extracted message from the received socket stream
static void ICACHE_FLASH_ATTR ctrl_stack_process_message(tCtrlMessage *msg)
{
	// if we are currently in the authorization mode, process received data differently
	if(authMode)
	{
		// receiving challenge?
		// we must answer to it here
		if(authPhase == 1)
		{
			authPhase++;

			char challResponse[32];
			unsigned char i = 0;
			for(i=0; i<4; i++)
			{
				unsigned long r = system_get_time() + rand(); // TODO: make better random generation here? system_get_time() will probably have only one value in this loop...
				os_memcpy(challResponse+(i*4), &r, 4);
			}
			os_memcpy(challResponse+16, msg->data, 16);

			tCtrlMessage msg;
			msg.length = 1 + 4 + 32;
			msg.header = 0x00; // value not relevant during authentication procedure
			msg.TXsender = 0; // value not relevant during authentication procedure
			msg.data = challResponse; // contains: random 16 bytes + original challenge value

			// We have nothing pending to send? (TXbase is 1 in that case)
			if(authSync == 1)
			{
				msg.header |= CH_SYNC;
			}

			ctrl_stack_send_msg(&msg);
		}
		// receiving reply to our response on server's challenge :)
		// this means we are authenticated! here we get 4 bytes of data
		// containing TXserver value we need to reload. it is saved on Server
		// so that we don't wear out our Flash or EEPROM memory. cool feature, right?
		// also, here we need to check if Header has SYNC so that we reset TXserver to 0
		else if(authPhase == 2)
		{
			authMode = 0;

			if((msg->header) & CH_SYNC)
			{
				TXserver = 0;
			}
			else
			{
				os_memcpy(&TXserver, msg->data, 4);
			}

			if(ctrlCallbacks->auth_response != NULL)
			{
				ctrlCallbacks->auth_response();
			}
		}
	}
	else
	{
		// we received an ACK?
		if((msg->header) & CH_ACK)
		{
			// push the received ack to callback
			if(ctrlCallbacks->message_acked != NULL)
			{
				ctrlCallbacks->message_acked(msg);
			}
		}
		// fresh message, acknowledge and push it to the app
		else
		{
			// Reply with an ACK on received message. Mind the global backoff variable!
			tCtrlMessage ack;
			ack.header = CH_ACK;
			if(backoff)
			{
				ack.header |= CH_BACKOFF;
			}
			ack.TXsender = msg->TXsender;
			ack.length = 1+4; // fixed ACK length, without payload (data)
			char TXserver2Save[4]; // will need this bellow

			// is this NOT a notification message?
			if(!(msg->header & CH_NOTIFICATION))
			{
				if (msg->TXsender <= TXserver)
                {
                    ack.header &= ~CH_PROCESSED;
                    //uart0_sendStr("ERROR: Re-transmitted message, ignoring!\r\n");
                }
                else if (msg->TXsender > (TXserver + 1))
                {
					// SYNC PROBLEM! Server sent higher than we expected! This means we missed some previous Message!
                    // This part should be handled on Server's side.
                    // Server will flush all data after receiving X successive out-of-sync messages from us,
                    // and he will break the connection. Re-sync should then naturally occur
                    // in auth procedure as there would be nothing pending in queue to send to us.

                    ack.header |= CH_OUT_OF_SYNC;
                    ack.header &= ~CH_PROCESSED;
                    //uart0_sendStr("ERROR: Out-of-sync message!\r\n");
                }
                else
                {
                	ack.header |= CH_PROCESSED;
                	TXserver++; // next package we will receive must be +1 of current value, so lets ++

					// Server offers us a feature to store a copy of this TXserver on his side so that
					// we don't wear out our Flash or EEPROM memory, lets do that! Thanks Server :)
					// Why are we saving this? We might get powered down and we must not loose this value!
					// If we do, Server will send it to us when we (re-)connect! Cool.
					ack.length += 4; // extend the length of this ACK because we are appending data as well
					ack.header |= CH_SAVE_TXSERVER;

					os_memcpy(&TXserver2Save, &TXserver, 4);
					ack.data = TXserver2Save;
                }

                // send reply
                ctrl_stack_send_msg(&ack);

                //uart0_sendStr("ACKed to a msg!\r\n");
			}
			else
			{
				ack.header |= CH_PROCESSED; // need this for code bellow to execute
				//uart0_sendStr("Didn't ACK because this is a notification-type msg!\r\n");
			}

			// received a message which is new and as expected?
			if(ack.header & CH_PROCESSED)
			{
				//uart0_sendStr("Got fresh message!\r\n");

				// 7-12-2014 pushing system messages to ctrl_platform.c!
				// push the received message to callback
				if(ctrlCallbacks->message_received != NULL)
				{
					ctrlCallbacks->message_received(msg);
				}
			}
		}
	}
}
Example #6
0
// Lua: tmr.now() , return system timer in us
static int tmr_now(lua_State* L){
	uint32_t now = 0x7FFFFFFF & system_get_time();
	lua_pushinteger(L, now);
	return 1; 
}
Example #7
0
void milisec(uint32_t tempo)
{
uint32_t t = system_get_time() + (tempo*1000);
	while(t > system_get_time() )
		system_soft_wdt_feed ();
}
Example #8
0
void micros_overflow_tick(void* arg) {
    uint32_t m = system_get_time();
    if(m < micros_at_last_overflow_tick)
        ++micros_overflow_count;
    micros_at_last_overflow_tick = m;
}
Example #9
0
unsigned long millis() {
    uint32_t m = system_get_time();
    uint32_t c = micros_overflow_count + ((m < micros_at_last_overflow_tick) ? 1 : 0);
    return c * 4294967 + m / 1000;
}
Example #10
0
STATIC mp_obj_t pyb_elapsed_micros(mp_obj_t start) {
    uint32_t startMicros = mp_obj_get_int(start);
    uint32_t currMicros = system_get_time();
    return MP_OBJ_NEW_SMALL_INT((currMicros - startMicros) & 0x3fffffff);
}
Example #11
0
uint32_t HAL_GetTick(void) {
    return system_get_time() / 1000;
}
Example #12
0
STATIC mp_obj_t pyb_micros(void) {
    return MP_OBJ_NEW_SMALL_INT(system_get_time());
}
Example #13
0
void ZCD_tick(){
	u32 T=system_get_time();
	register u32 dt1,dt2,dtm=GPIO_INPUT_GET(zeroCrossCalculator.pin_internal_gpio);
	register size_t j;
	size_t i;
	if(dtm==zeroCrossCalculator.last_state) return;//false positive
	if(T<zeroCrossCalculator.times[zeroCrossCalculator.current_time]){
		for(i=0;i<times_size;++i){
			zeroCrossCalculator.times[i]=0;
		}
		zeroCrossCalculator.current_time=times_size;
		zeroCrossCalculator.last_overflow=times_size;
		zeroCrossCalculator.delta_inc=0;
	}
	INCI(zeroCrossCalculator.current_time,times_size);
	zeroCrossCalculator.times[zeroCrossCalculator.current_time]=T;
	zeroCrossCalculator.last_state=dtm;

	if(zeroCrossCalculator.last_overflow>0){ --zeroCrossCalculator.last_overflow;
	}else{
		i=zeroCrossCalculator.current_time;
		dt1=zeroCrossCalculator.times[i];
		dt1-=zeroCrossCalculator.times[DECI(i,times_size)];
#ifdef ZCDETECTOR_DEBUG
		INCI(zeroCrossCalculator.delta_c,times_size);
		zeroCrossCalculator.deltas[zeroCrossCalculator.delta_c]=dt1;
#endif
		dt1+=zeroCrossCalculator.delta_inc;
		if(dt1<2000){
				zeroCrossCalculator.delta_inc=dt1;
				DECI(zeroCrossCalculator.current_time,times_size);
		}else{
			MAYBE_EXIT_TO_BG;
			if(dt1>15000){
				zeroCrossCalculator.delta_inc=0;
			}
			for(dt1=0,i=zeroCrossCalculator.current_time,j=1ul<<(times_size_b-1);j;--j){
				dt1+=zeroCrossCalculator.times[i];
				dt1-=zeroCrossCalculator.times[DECI(i,times_size)];
				DECI(i,times_size);
			}
			dt1+=zeroCrossCalculator.delta_inc;
			zeroCrossCalculator.delta_inc=0;
			dt1>>=times_size_b-1;
			MAYBE_EXIT_TO_BG;
			for(dt2=0,i=zeroCrossCalculator.current_time,j=1ul<<(times_size_b-1);j;--j){
				dt2+=zeroCrossCalculator.times[DECI(i,times_size)];
				dt2-=zeroCrossCalculator.times[DECI(i,times_size)];
			}
			dt2>>=times_size_b-1;
			i=zeroCrossCalculator.current_time;
			if(dt1>dt2){
				//even if we know for sure which of these is bigger through "last_state" param,
				//it is safer to test and swap these two on their own.
				//last_state=0 here
				SWAP(dt1,dt2);
			}
			dtm=dt2;
			dtm-=dt1;
//			dtm>>=1;//my ZCD falls to slow, but regains voltage fast at the very edge.
			zeroCrossCalculator.detector_shift=dtm;
			dtm=dt2;
			dtm+=dt1;
			dtm>>=1;
			zeroCrossCalculator.halfperiod=dtm;
		}
	}
	MAYBE_EXIT_TO_BG;
//	ZCD_planFire();
#ifdef ZCDETECTOR_DEBUG
	if(printdebug){
		printdebug=0;
		for(i=0;i<times_size;++i){
			ets_uart_printf("%lx ",zeroCrossCalculator.times[i]);
		}
		ets_uart_printf("\n");
		for(i=0;i<times_size;++i){
			ets_uart_printf("%lu ",zeroCrossCalculator.deltas[i]);
		}
		ets_uart_printf("\nDEBUG: Dt: %lu %lu, lo: %d, s: %d\n",dt1,dt2,zeroCrossCalculator.last_overflow,zeroCrossCalculator.last_state);
		ets_uart_printf("DEBUG: T: %lx, ct: %d \n",T,zeroCrossCalculator.current_time);
		ets_uart_printf("DEBUG: T/2: %lu, shift: %lu \n",zeroCrossCalculator.halfperiod,zeroCrossCalculator.detector_shift);
	}
#endif
}
/******************************************************************************
 * FunctionName : mesh_GetStartMs
 * Description  : Get the time expire since the beginning of mesh initialization
                  Count in Ms
*******************************************************************************/
uint32 ICACHE_FLASH_ATTR
mesh_GetStartMs()
{
    return (system_get_time()-LightMeshProc.start_time)/1000;
}
Example #15
0
void mp_hal_delay_us(uint32_t us) {
    uint32_t start = system_get_time();
    while (system_get_time() - start < us) {
        ets_event_poll();
    }
}
Example #16
0
unsigned long millis(void)
{
	return system_get_time() / 1000UL;
}
Example #17
0
 uint32_t FUNC_FLASHMEM micros()
 {
     return system_get_time();
 }
Example #18
0
unsigned long micros(void)
{
	return system_get_time();
}
Example #19
0
uint32_t mp_hal_ticks_ms(void) {
    return system_get_time() / 1000;
}
Example #20
0
static void ICACHE_FLASH_ATTR gpio_intr(void *arg) {
    uint32_t gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS);
    GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status);

    static uint32_t start = 0;
    uint32_t now = system_get_time();
    uint32_t delta=(now - start) / USECPERTICK + 1;
    switch(irparams.rcvstate){
    case STATE_IDLE: //check if val =1
    	if(0==(gpio_status&(1<<irparams.recvpin)))goto l_Error;
    	irparams.rcvstate = STATE_MARK;
    	break;
    case STATE_MARK:
//l_Error://check if new cmd come
       	if (MATCH_MARK(delta, NEC_HDR_MARK)){ // Initial mark
   	   	irparams.rcvstate = STATE_SPACE;
   	    break;
    	}
    l_Error:
		irparams.rcvstate = STATE_IDLE;
		os_timer_disarm(&timer);
		return;
    case STATE_SPACE:
    	 // Initial space
    	  if (MATCH_SPACE(delta, NEC_HDR_SPACE)) {
    		  irparams.rcvstate = STATE_DATA_MARK;
    		  irparams.BitExpected=NEC_BITS;
    		  irparams.isRepeat=false;
    		  break;
    	  }
    	  if (MATCH_SPACE(delta, NEC_RPT_SPACE)) {
    		  irparams.rcvstate = STATE_REPEAT;
    		  break;
    	  }
    	  goto l_Error;
    case STATE_REPEAT:
  	  if (MATCH_SPACE(delta, NEC_BIT_MARK)) {
  		  //repeat previous command need check time out
  		  if((irparams.Rpt_TimeOut-now)>((NEC_RPT_TIMEOUT-1)*USECPERTICK))return;
  		  irparams.isRepeat=true;
  		  irparams.buffer=irparams.PrevValue;
  		  goto l_CMD_RETURN;
  	  }
  	  goto l_Error;
    case STATE_DATA_MARK:
    	if (MATCH_SPACE(delta, NEC_BIT_MARK)) {
    		irparams.rcvstate = STATE_DATA;
    		break;
    	}
    	goto l_Error;
    case STATE_DATA:
    	irparams.rcvstate = STATE_DATA_MARK;
    	irparams.buffer<<=1;
    	irparams.BitExpected--;
    	if(0==irparams.BitExpected)irparams.rcvstate = STATE_END_OF_MSG;
    	if (MATCH_SPACE(delta, NEC_ONE_SPACE)) {
    		irparams.buffer|=1;
    	    break;
    	   }
    	if (MATCH_SPACE(delta, NEC_ZERO_SPACE)) {
    	    break;
    	   }
    	goto l_Error;
    case STATE_END_OF_MSG:
     	if (MATCH_SPACE(delta, NEC_BIT_MARK)) {
    l_CMD_RETURN:
     			if(false==irparams.isValueReady)// skip if previous was not readet
     				irparams.Value=irparams.buffer;
        		irparams.rcvstate = STATE_IDLE;
        		irparams.isValueReady=true;
        		irparams.Rpt_TimeOut=now;
        		irparams.PrevValue=irparams.buffer;
        		return;
     	}
     	goto l_Error;
    }

    start = now;

    os_timer_disarm(&timer);
    os_timer_arm(&timer, 15, 0);
}