/*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 }
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); //返回队列长度 } }
static void gprs_sent_timeout_cb(TimerHandle_t timer) { xTimerStop(timer, 0); osel_memset(recv.buf, 0 , SIZE); recv.offset = 0; xSemaphoreGive(gprs_mutex); }
/*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); } } }
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)); }
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; }
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); } }
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; }
/** * @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; }
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; }
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); } }
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; }
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; } } }
void gprs_flush_receive_buf(void) { osel_memset(gprs_cmd_recv_array, 0x00, sizeof(gprs_cmd_recv_array)); gprs_cmd_recv_pos = 0; }