コード例 #1
0
ファイル: m_tran.c プロジェクト: utopiaprince/esn
/*recevice data */
void m_tran_recv(void)
{
    /* 如果当前正在发送帧 */
    if (phy_get_state() == PHY_TX_STATE)
    {
        phy_set_state(PHY_IDLE_STATE);
        if (tran_state.sbuf != NULL)
        {
            hal_int_state_t s;
            HAL_ENTER_CRITICAL(s);
            if (ack_timer != NULL)
            {
                hal_timer_cancel(&ack_timer);
            }

            tran_state.can_send = TRUE;
            tran_state.ack_needed = FALSE;
            sbuf_t *sbuf_tmp = tran_state.sbuf;
            tran_state.sbuf = NULL;
            HAL_EXIT_CRITICAL(s);

            DBG_ASSERT(tran_state.cb.tx_finish != NULL __DBG_LINE);
            tran_state.cb.tx_finish(sbuf_tmp, FAILE);

            sbuf_tmp = NULL;
        }
    }
    
    tran_rx_sfd_set(FALSE);
    phy_set_state(PHY_RX_STATE);

#if M_TRAN_DGB_EN > 0
    osel_memset((void *)&m_tran_recv_tracker, 0, sizeof(m_tran_recv_tracker));
#endif
}
コード例 #2
0
ファイル: gprs.c プロジェクト: fuosck/gprs-of-sim928a
uint8_t gprs_send(void *data_p, uint8_t len, uint16_t tag, uint16_t time)
{
    DBG_ASSERT(data_p != NULL __DBG_LINE);
    DBG_ASSERT(len != 0 __DBG_LINE);
    
    queue_data_type new_item;
    osel_memset(&new_item, 0x00, sizeof new_item);
    
    OSEL_ISR_ENTRY();
    osel_memcpy(new_item.gprs_data, data_p, len);
    new_item.gprs_data_len  = len;
    new_item.gprs_tag       = tag; 
    new_item.ack_time       = time;
    OSEL_ISR_EXIT();
    
    if(GET_QUEUE_LEN == QUEUE_MAXLEN)
    {
        return QUEUE_MAXLEN+1;
    }
    else
    {
        queue_send(&gprs_queue, new_item);      //入队成功
        osel_post(GPRS_SEND_EVENT, NULL, OSEL_EVENT_PRIO_LOW);
        return(GET_QUEUE_LEN);                 //返回队列长度
    }
}
コード例 #3
0
ファイル: gprs.c プロジェクト: utopiaprince/esn
static void gprs_sent_timeout_cb(TimerHandle_t timer)
{
	xTimerStop(timer, 0);
	osel_memset(recv.buf, 0 , SIZE);
	recv.offset = 0;
	xSemaphoreGive(gprs_mutex);
}
コード例 #4
0
ファイル: m_tran.c プロジェクト: utopiaprince/esn
/*send data about considering ACK and late send completely*/
void m_tran_send(sbuf_t *const sbuf, tran_tx_finish_cb_t tx_finish, uint8_t resend_times)
{
    DBG_ASSERT(sbuf != NULL __DBG_LINE);
    DBG_ASSERT(sbuf->primargs.pbuf != NULL __DBG_LINE);
    DBG_ASSERT(tx_finish != NULL __DBG_LINE);

    pbuf_t *pbuf = NULL;

    /* 如果当前正在等待ACK或重发则不接受新数据 */
    if (tran_state.can_send == FALSE)
    {
        asm("NOP");
        tx_finish(sbuf, FALSE);
        return;
    }

    m_tran_stop();

    if (tx_finish != NULL)
    {
        tran_state.cb.tx_finish = tx_finish;
    }
    else
    {
        return;
    }

    if (sbuf != NULL)
    {
        pbuf = sbuf->primargs.pbuf;
        if (pbuf != NULL)
        {
            tran_state.sbuf = sbuf;
            tran_state.ack_received   = FALSE;
            tran_state.need_resend_times  = resend_times;
            already_send_times = 0;

#if M_TRAN_DGB_EN > 0
            osel_memset((uint8_t *)&m_tran_tracker, 0, sizeof(m_tran_tracker));
            m_tran_tracker.data_send_start++;
#endif
            tran_send_intra();
        }
        else
        {
            hal_int_state_t s;
            HAL_ENTER_CRITICAL(s);

            tran_state.ack_needed   = FALSE;
            tran_state.can_send     = TRUE;
            sbuf_t *sbuf_tmp        = tran_state.sbuf;
            tran_state.sbuf         = NULL;
            HAL_EXIT_CRITICAL(s);
            phy_set_state(PHY_SLEEP_STATE);

            DBG_ASSERT(tran_state.cb.tx_finish != NULL __DBG_LINE);
            tran_state.cb.tx_finish(sbuf_tmp, FAILE);
        }
    }
}
コード例 #5
0
ファイル: gprs.c プロジェクト: fuosck/gprs-of-sim928a
static void gprs_cmd_cipstart(void)
{
    uint8_t cmd[0x30];
    osel_memset(cmd, 0x00, sizeof(cmd));

    wsnos_sprintf((char *)cmd, 
                  "AT+CIPSTART=%s,%s\r", 
                  (char *)ip_mode, 
                  (char *)ip_config);
    
    gprs_send_cmd(cmd, mystrlen((char *)cmd));
}
コード例 #6
0
ファイル: gprs.c プロジェクト: utopiaprince/esn
static bool_t write_fifo( uint8_t *payload,  uint16_t len)
{
	DBG_ASSERT(payload != NULL __DBG_LINE);
	if (len > SEND_SIZE)
	{
		DBG_ASSERT(FALSE __DBG_LINE);
	}
	osel_memset(recv.buf, 0 , SIZE);
	recv.offset = 0;
	uart_send_string(gprs_info.uart_port, payload, len);
	return TRUE;
}
コード例 #7
0
ファイル: gprs.c プロジェクト: utopiaprince/esn
static void ipconfig_get(uint8_t *cmd, uint8_t len)
{
	uint8_t ip_config[30];
	osel_memset(cmd, 0x00, len);
	osel_memset(ip_config, 0x00, 30);
	tfp_sprintf((char *)ip_config,
				"\"%d.%d.%d.%d\",%u",
				gprs_info.dip[0], gprs_info.dip[1], gprs_info.dip[2], gprs_info.dip[3], gprs_info.port);
	if (gprs_info.mode)
	{
		tfp_sprintf((char *)cmd,
					(char *)CIPSTART,
					(char *)tcp_mode, (char *)ip_config);
	}
	else if(gprs_info.mode)
	{
		tfp_sprintf((char *)cmd,
					(char *)CIPSTART,
					(char *)udp_mode, (char *)ip_config);
	}
}
コード例 #8
0
ファイル: lora.c プロジェクト: utopiaprince/esn
static bool_t lora_reg_write(uint8_t reg, uint8_t *buf, uint8_t len)
{
    uint8_t send_buf[30];
    uint8_t index = 0;

    lora_mode = SETTING_MODE;
//    lora_reg = reg;

    send_buf[index++] = 0xFF;
    send_buf[index++] = 0x56;
    send_buf[index++] = 0xAE;
    send_buf[index++] = 0x35;
    send_buf[index++] = 0xA9;
    send_buf[index++] = 0x55;
    send_buf[index++] = 0x90;
    send_buf[index++] = reg;
    send_buf[index++] = len;
    osel_memcpy(&send_buf[index], buf, len);
    index += len;

    lora_recv_rxok_flag = FALSE;
    uart_send_string(lora_port, send_buf, index);

    vTaskDelay(600 / portTICK_PERIOD_MS);

    if (lora_recv_index!=0)
    {
        if ((lora_recv_index == (len + 1)) &&
                (lora_recv_data[0] == 0x24))
        {
            lora_recv_index = 0;
            osel_memset(lora_recv_data, 0x00, 150);
            return TRUE;
        }
    }

    lora_recv_index = 0;
    osel_memset(lora_recv_data, 0x00, 150);
    return FALSE;
}
コード例 #9
0
ファイル: lora.c プロジェクト: utopiaprince/esn
/**
 * @biref the cmd of read the config
 * @param reg  start of read config
 * @param len  how many bytes read
 */
static bool_t lora_reg_read(uint8_t reg, uint8_t len)
{
    uint8_t buf[15];
    uint8_t index = 0;

    lora_mode = SETTING_MODE;
//    lora_reg = reg;

    buf[index++] = 0xFF;
    buf[index++] = 0x56;
    buf[index++] = 0xAE;
    buf[index++] = 0x35;
    buf[index++] = 0xA9;
    buf[index++] = 0x55;
    buf[index++] = 0xf0;
    buf[index++] = reg;
    buf[index++] = len;

    lora_recv_rxok_flag = FALSE;
    uart_send_string(lora_port, buf, index);

    vTaskDelay(50 / portTICK_PERIOD_MS);
    
    if (lora_recv_index!=0)
    {
        if ((lora_recv_index == (len + 1)) &&
                (lora_recv_data[0] == 0x24))
        {
            lora_recv_index = 0;
            osel_memset(lora_recv_data, 0x00, 150);
            return TRUE;
        }
    }

    lora_recv_index = 0;
    osel_memset(lora_recv_data, 0x00, 150);
    return FALSE;
}
コード例 #10
0
ファイル: gprs.c プロジェクト: utopiaprince/esn
static bool_t gprs_write_fifo(const uint8_t *const payload, const uint16_t len)
{
	DBG_ASSERT(payload != NULL __DBG_LINE);
	if (gprs_info.gprs_state == WORK_ON && len < SEND_SIZE)
	{
		if(gprs_info.data_mode)
		{
            wdt_clear(SOFT_WDT);
            led_set(LED_RED, TRUE);
            osel_memset(send.buf, 0x00, SEND_SIZE);
            osel_memcpy(send.buf, payload, len);
            send.len = len;
            write_fifo(send.buf, send.len);
            led_set(LED_RED, FALSE);
			return TRUE;
		}
		else
		{
			if(xSemaphoreTake(gprs_mutex, 600) == pdTRUE)
			{
				led_set(LED_RED, TRUE);
				//等待数据发送完成
				xTimerReset(gprs_daemon_timer, 400);
				osel_memset(send_data, 0x00, SIZE);
				tfp_sprintf((char *)send_data, CIPSEND, len);
				
				osel_memset(send.buf, 0x00, SEND_SIZE);
				osel_memcpy(send.buf, payload, len);
				send.len = len;
				write_fifo(send_data, mystrlen((char *)send_data));
				return TRUE;
			}
		}
	}
	
	return FALSE;
}
コード例 #11
0
ファイル: gprs.c プロジェクト: fuosck/gprs-of-sim928a
static void gprs_presend_cmd(void)      //"AT+CIPSEND=LEN\R"
{                
    uint8_t len;
    uint8_t cmd[0x30];
    osel_memset(cmd, 0x00, sizeof(cmd));
    
    if(PEEK_QUEUE_FIRST_DATA)            //看队首元素的长度并不出队
    {
        len = n_item.gprs_data_len;
        wsnos_sprintf((char *)cmd, "AT+CIPSEND=%d\r", len); //AT+CIPSEND=LEN\r
        gprs_send_cmd(cmd, mystrlen((char *)cmd));
    }
    else                                //队列为空
    {
        osel_post(GPRS_POLL_EVENT, NULL, OSEL_EVENT_PRIO_LOW);
    }
}
コード例 #12
0
ファイル: lora.c プロジェクト: utopiaprince/esn
uint8_t lora_data_read(uint8_t *buf, uint8_t len)
{
    uint8_t read_len = 0;
    if(len > lora_recv_index)
    {
        read_len = lora_recv_index;
    }
    else
    {
        read_len = len;
    }
    
    osel_memcpy(buf, lora_recv_data, read_len);
    
    osel_memset(lora_recv_data, 0x00, read_len);
    lora_recv_index = 0;
    return read_len;
}
コード例 #13
0
ファイル: gprs.c プロジェクト: utopiaprince/esn
static void gprs_task(void *p)
{
	esn_msg_t esn_msg;
	osel_memset(&esn_msg, 0, sizeof(esn_msg_t));
	while (1)
	{
		xQueueReceive(gprs_queue,        //*< the handle of received queue
					  &esn_msg,          //*< pointer to data received
					  portMAX_DELAY);   //*< time out
		
		switch (esn_msg.event)
		{
		case GPRS_EVENT:
			{
				gprs_switch();
			}
			break;
		default:
			break;
		}
	}
}
コード例 #14
0
ファイル: gprs.c プロジェクト: fuosck/gprs-of-sim928a
void gprs_flush_receive_buf(void)
{
    osel_memset(gprs_cmd_recv_array, 0x00, sizeof(gprs_cmd_recv_array));
    gprs_cmd_recv_pos = 0;
}