示例#1
0
文件: user_main.c 项目: karlnet/mico
/* user main function, called by AppFramework.
 */
OSStatus user_main( app_context_t * const app_context )
{
  user_log_trace();
  OSStatus err = kUnknownErr;
  
  user_log("User main task start...");
  
  
  
  err = user_uartInit();
  require_noerr_action( err, exit, user_log("ERROR: user_uartInit err = %d.", err) );
 
  
  
  user_log("start photo...");
  unsigned char* image="hello world";
  user_uartSend( image,strlen(image));
  char aa[200];
  
  memset(aa, '\0', 200);
  
  mico_thread_sleep(5);
  
  int len=user_uartRecv((unsigned char *)aa, 200);
  user_log("uart_data_recv: [%d][%.*s]", len,  len,(unsigned char*)aa);
  user_log("end...");
  
  
 
#if (MICO_CLOUD_TYPE != CLOUD_DISABLED)
  /* start fogcloud msg handle task */
  err = start_fog_msg_handler(app_context);
  require_noerr_action( err, exit, user_log("ERROR: start_fog_msg_handler err = %d.", err) );

  /* start properties notify task(upload data) */
  err = mico_start_properties_notify(app_context, service_table, 
                                     MICO_PROPERTIES_NOTIFY_INTERVAL_MS, 
                                     STACK_SIZE_NOTIFY_THREAD);
  require_noerr_action( err, exit, user_log("ERROR: mico_start_properties_notify err = %d.", err) );
#endif
  
  /* main loop for user display */
  while(1){
    // check every 1 seconds
    mico_thread_sleep(1);
    
    // system work state show on OLED
    system_state_display(app_context, &g_user_context);
  }
  
exit:
  user_log("ERROR: user_main exit with err=%d", err);
  return err;
}
示例#2
0
// get function: recv uart data
int uart_data_recv(struct mico_prop_t *prop, void *arg, void *val, uint32_t *val_len)
{
  int ret = 0;  
  uint32_t recv_len = 0;
  char string_display_on_oled[MAX_USER_UART_BUF_SIZE+1] = {'\0'};
  
  if((NULL == val) || (NULL == val_len) || (NULL == prop) || (NULL == arg)){
    return -1;
  }
  
  user_context_t *uct = (user_context_t*)arg;
  
  // recv data from uart
  memset(val, '\0', prop->maxStringLen);
  recv_len = user_uartRecv((unsigned char*)val, prop->maxStringLen);
  if(recv_len > 0){
    *val_len = recv_len;
    ret = 0;
    properties_user_log("uart_data_recv: [%d][%*.s]", *val_len, *val_len, (char*)val);
    
    // display string on OLED (max_len=32bytes)
    properties_user_log("Show uart recv msg on OLED: [%d][%*.s]", *val_len, *val_len, (char*)val);
    OLED_ShowString(OLED_DISPLAY_COLUMN_START, OLED_DISPLAY_ROW_2, (uint8_t*)"To Cloud:       ");
    memset(string_display_on_oled, ' ', MAX_USER_UART_BUF_SIZE);  // clean display char
    memcpy(string_display_on_oled, (uint8_t*)val, *val_len);
    string_display_on_oled[MAX_USER_UART_BUF_SIZE] = '\0';  // display end
    OLED_ShowString(OLED_DISPLAY_COLUMN_START, OLED_DISPLAY_ROW_3, (uint8_t*)string_display_on_oled);
    ret = 0;  // set always ok
    uct->status.oled_keep_s = 3;   // display 3s  
  }
  else{
    *val_len = 0;
    ret = -1;
  }
  
  return ret;
}
/* user main function, called by AppFramework after system init done && wifi
 * station on in user_main thread.
 */
OSStatus user_main( app_context_t * const app_context )
{
  user_log_trace();
  OSStatus err = kUnknownErr;
  unsigned char rdata[64];
  unsigned char sdata[64];
  uint16_t datalen;

  require(app_context, exit);

  // platform initialize
  AaSysComInit();
  AaSysLogInit();

  // application initialize
  ControllerBusInit();
  OuterTriggerInit(NULL);
  TemperatureInit();  // will be support in release 2
  BatteryInit();

  // reset f411 and wait until it startup
  ResetF411();

#if 1
  MOInit();
#endif

  err = SntpInit(app_context);
  if(kNoErr != err) {
    AaSysLogPrint(LOGLEVEL_ERR, "SntpInit finished with err code %d", err);
  }
  else {
    AaSysLogPrint(LOGLEVEL_INF, "SntpInit success");
  }

#if 1
  DeviceInit(app_context);
  HealthInit(app_context);
  LightsInit(app_context);
  MusicInit(app_context);

  // start the downstream thread to handle user command
  err = mico_rtos_create_thread(&user_downstrem_thread_handle, MICO_APPLICATION_PRIORITY, "user_downstream", 
                                user_downstream_thread, STACK_SIZE_USER_DOWNSTREAM_THREAD, 
                                app_context );
  require_noerr_action( err, exit, user_log("ERROR: create user_downstream thread failed!") );
#endif


  user_log("[DBG]net_main: Appilcation Initialize success @"SOFTWAREVERSION);

  // user_main loop, update oled display every 1s
  while(1){

#if 1
    mico_thread_sleep(MICO_WAIT_FOREVER);
#else

    mico_thread_sleep(5);

    datalen = user_uartRecv(rdata, 5);
    if(datalen) {
      user_log("[DBG]user_main: Usart recevice datalen %d", datalen);
      user_log("[DBG]user_main: receive %.*s", datalen, rdata);
    }
    else {
      user_log("[DBG]user_main: Usart didn't recevice data");
    }

    mico_thread_sleep(2);

    sprintf(sdata, "hello, world!\r\n");
    user_uartSend(sdata, strlen(sdata));
#endif

  }

exit:
  if(kNoErr != err){
    user_log("[ERR]user_main: user_main thread exit with err=%d", err);
  }
  mico_rtos_delete_thread(NULL);  // delete current thread
  return err;
}
/****************************************************************************
* Function	: uartRecv_thread
* Description	: uart Recv Thread	uart 接收线程
* Input Para	:
* Output Para	:
* Return Value:
****************************************************************************/
void uartRecv_thread(void *inContext)
{
    user_uart_log_trace();
    //mico_Context_t *Context = inContext;
    int recvlen;
    tsSL_Message  sMessage;
    //OSStatus err = kUnknownErr;
    uint8_t *inDataBuffer = malloc(USER_UART_ONE_PACKAGE_LENGTH);	//接收数据缓冲
    require(inDataBuffer, exit);
    static uint8_t cmdIndex=0,msgQueIndex=0;
    memset(zcbReceivedMessageQueue,0x00,ZCB_MAX_MESSAGE_QUEUES * sizeof(tsSL_Message));

    while(1)
    {
        mico_thread_msleep(10);	//延时10ms

        memset(inDataBuffer,0x0,USER_UART_ONE_PACKAGE_LENGTH);		//清空接收数据缓冲

        recvlen = user_uartRecv(inDataBuffer, USER_UART_ONE_PACKAGE_LENGTH);//user uart 接收数据
        if (recvlen <= 0)
            continue;

        recv_buff_parser((char*)inDataBuffer);	//解析接收到的数据,把完整的数据包存储在 cmd 数组中
        msgQueIndex = 0;
        for(cmdIndex = 0; cmdIndex < cmdnum; cmdIndex++)	//逐条处理 cmd
        {
            /* Initialise buffer */
            sMessage.u16Type = 0x00;
            /* Initialise length to large value so CRC is skipped if end received */
            sMessage.u16Length = 0xFFFF;
            //1.get the date from ControlBridge
            if (eSL_ReadMessage(&sMessage.u16Type, &sMessage.u16Length, SL_MAX_MESSAGE_LENGTH, sMessage.au8Message,(unsigned char*)cmdbuff[cmdIndex],strlen(cmdbuff[cmdIndex])) == E_SL_OK)
            {
                user_uart_log("msg get,type:%d,length:%d",sMessage.u16Type,sMessage.u16Length);	//消息类型

                //if(0x8046 == sMessage.u16Type)
                //{
                ////    user_uart_log("%d",msgQueIndex);
                //}
                //if(0x4D == sMessage.u16Type)
                //{
                //    user_uart_log("%d",msgQueIndex);
                //}
                for(; msgQueIndex< ZCB_MAX_MESSAGE_QUEUES ; msgQueIndex++)
                {
                    if(0 == zcbReceivedMessageQueue[msgQueIndex].u16Type)
                    {
                        //user_uart_log("%d saved at %d",sMessage.u16Type,msgQueIndex);
                        zcbReceivedMessageQueue[msgQueIndex].u16Type = sMessage.u16Type;
                        zcbReceivedMessageQueue[msgQueIndex].u16Length = sMessage.u16Length;
                        memcpy(zcbReceivedMessageQueue[msgQueIndex].au8Message,sMessage.au8Message,sMessage.u16Length);
                        break;
                    }
                    else
                    {
                        continue;
                    }
                }
                if(msgQueIndex == ZCB_MAX_MESSAGE_QUEUES)
                    user_uart_log("no space for Msg");
            }
            else
            {
                user_uart_log("msg not correct");
                for(cmdIndex=0; cmdbuff[cmdnum][cmdIndex]!=0x0; cmdIndex++)
                {
                    printf("%x ",cmdbuff[cmdnum][cmdIndex]);
                }
                printf("\r\n");

            }
        }
        memset(cmdbuff[0], 0x0, sizeof(cmdbuff[0])* cmdnum);
        cmdnum = 0;
    }

exit:
    if(inDataBuffer) free(inDataBuffer);
}
static void ControllerBusProtocolHandler(void* arg)
{
    // avoid compiling warning
    arg = arg;
    uint16_t received_len;

    AaSysLogPrint(LOGLEVEL_INF, "create controllerbus thread success");

    while(1) {
        received_len = user_uartRecv(recv_buffer, sizeof(SCBusHeader));
        if(received_len == 0) {
            AaSysLogPrint(LOGLEVEL_WRN, "do not received any header");
            continue;
        }

        AaSysLogPrint(LOGLEVEL_DBG, "receive header length %d", received_len);
        print_serial_data(recv_buffer, received_len);

        if(received_len != sizeof(SCBusHeader)) {
            AaSysLogPrint(LOGLEVEL_WRN, "received header length do not match");
            continue;
        }

        SCBusHeader* header = (SCBusHeader*)recv_buffer;

        // parse the header, get the data length and checksum
        if(header->magic != CONTROLLERBUS_MAGIC || header->tail != CONTROLLERBUS_TAIL) {
            AaSysLogPrint(LOGLEVEL_WRN, "magic 0x%02x or tail 0x%02x do not match",
                    header->magic, header->tail);
            continue;
        }
        
        uint16_t datalen = header->datalen;
        uint8_t checksum = header->checksum;

        AaSysLogPrint(LOGLEVEL_DBG, "get datalen %d checksum 0x%02x", datalen, checksum);

        if(datalen == 0) {
            AaSysLogPrint(LOGLEVEL_WRN, "there is no data");
            continue;
        }
        else if(datalen >= (CONTROLLERBUS_RECV_BUFFER_LENGTH - sizeof(SCBusHeader))) {
            AaSysLogPrint(LOGLEVEL_WRN, "there is too much data and receive buffer %d is overflow", 
                    CONTROLLERBUS_RECV_BUFFER_LENGTH);
            continue;
        }

        // start to receive data
        uint8_t* payload = recv_buffer + sizeof(SCBusHeader);

        received_len = user_uartRecv(payload, datalen);
        if(received_len == 0) {
            AaSysLogPrint(LOGLEVEL_WRN, "do not received any data");
            continue;
        }
        
        AaSysLogPrint(LOGLEVEL_DBG, "receive data length %d", received_len);
        print_serial_data(payload, received_len);

        if(received_len != datalen) {
            AaSysLogPrint(LOGLEVEL_WRN, "received data length do not match");
            continue;
        }

#if 1
        // check if data available
        uint8_t data_checksum = 0;
        data_checksum += header->magic;
        data_checksum += header->cmd;
        data_checksum += header->datalen >> 8;
        data_checksum += header->datalen & 0x00ff;
        data_checksum += header->tail;
        for(uint16_t idx = 0; idx < datalen; idx++) {
            data_checksum += *(payload + idx);
        }
        if(data_checksum != checksum) {
            AaSysLogPrint(LOGLEVEL_WRN, "data checksum 0x%02x do not match received checksum 0x%02x, dropping", 
                    data_checksum, checksum);
            continue;
        }
#endif

        ParseControllerBus(header, payload);

        AaSysLogPrint(LOGLEVEL_DBG, "parse package complete");
    }

    // normally should not access
    AaSysLogPrint(LOGLEVEL_ERR, "some fatal error occur, thread dead");
    mico_rtos_delete_thread(NULL);  // delete current thread
}