⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 otap.c

📁 基于MMA7260QR2的跌落检查程序
💻 C
字号:
#include "Otap.h"
#include "../Utilities/UartUtil.h"

#if OTAP_ENABLED == TRUE
otap_request_t gbotap_request;
otap_header_t gbotap_header;
otap_startoft_frame_t gbotap_sof;
otap_error_frame_t gbotap_error;

volatile uint32_t gbDataCounter;
volatile uint32_t index;

volatile uint16_t gbmessages_receiving;
volatile uint16_t last_message_number; 

volatile uint8_t OTAP_STATE; 

bool_t gbOtapExecute;
volatile bool_t ack_received;
volatile bool_t OtapRequest;
volatile bool_t broadcast;
volatile bool_t erase_flash;



crmVRegCntl_t OtapVRegCntl;
nvmType_t OtapNvmType;

message_t OTAP_TX_msg;
message_t *App_RX_msg;
uint8_t TxOtapData[OTAP_TX_SIZE];

void OTAP_Init(message_t * pRxMsg)
{
  gbDataCounter = 0;
  OTAP_STATE = INIT; 
  ack_received = FALSE;
  
  index = 0x00000004;
  last_message_number=0;
  OtapRequest = FALSE;
  broadcast = FALSE;
  erase_flash = TRUE;
  
  gbotap_request.orc[0] = (uint8_t)(OTAP_REQUEST_CODE&0xFF);
  gbotap_request.orc[1] = (uint8_t)(OTAP_REQUEST_CODE>>8&0xFF);
  gbotap_request.orc[2] = (uint8_t)(OTAP_REQUEST_CODE>>16&0xFF);
  gbotap_request.orc[3] = (uint8_t)(OTAP_REQUEST_CODE>>24&0xFF);
  App_RX_msg = pRxMsg;
  MSG_INIT(OTAP_TX_msg, &TxOtapData, NULL);
  OTAP_TX_msg.u8Status.msg_state = MSG_TX_ACTION_COMPLETE_SUCCESS;
  App_RX_msg->u8Status.msg_state = MSG_RX_ACTION_COMPLETE_SUCCESS;
}

void OTAP_execute(void)
{
  switch(OTAP_STATE)
  {
    case INIT:
//      OTAP_NVMSetup();            
      OTAP_STATE = RUN_NORMAL;
      gbOtapExecute = FALSE;
    break;

    case RUN_NORMAL:
      gbOtapExecute = FALSE;
    break;
    
    case WAIT_4_CONFIRM:
    break;
    
    case SEND_DESCRIPTOR:
      send_descriptor();        
    break;
      
    case WAIT_4_SOT:
    break; 
    
    case WAIT_4_DATA:
    break;
    
    case SEND_ACK:
      send_ack();
    break;
/*    
    case SEND_ERROR:
      send_error();
    break;
*/     
    case FLASHING:
      flash_new_app();
    break;
  }
  if(OTAP_RECEIVE_END() && (TRUE == gbOtapExecute))
  {
    App_RX_msg->u8BufSize = OTAP_RX_SIZE;
    MLMERXEnableRequest(App_RX_msg, 0x000F0000);       
  }
}

void send_descriptor(void)
{
  static uint8_t num_ret = 20;
  if(num_ret && !ack_received)
  {
    if(OTAP_TRANSMIT_END())
    {   
      OTAP_TX_msg.pu8Buffer->u8Data[0] = DESCRIPTOR_FRAME;
      OTAP_TX_msg.pu8Buffer->u8Data[1] = gbotap_request.coord_addr[0]; 
      OTAP_TX_msg.pu8Buffer->u8Data[2] = gbotap_request.coord_addr[1];  
      OTAP_TX_msg.pu8Buffer->u8Data[3] = DEVICE_ADDRESS0; 
      OTAP_TX_msg.pu8Buffer->u8Data[4] = DEVICE_ADDRESS1;
      OTAP_TX_msg.pu8Buffer->u8Data[5] = gbotap_header.sequence_number++;
      OTAP_TX_msg.u8BufSize = 6;
      (void)MCPSDataRequest(&OTAP_TX_msg);      
      num_ret--;
    }  
  }
  else
  {
    num_ret = 20;
    ack_received = FALSE;
    OTAP_STATE = WAIT_4_SOT;
    gbOtapExecute = FALSE;
  }
}  

void send_ack(void)
{
  static uint8_t num_ret = 20;
  if(gbotap_header.frame_type == ODATA || gbotap_header.frame_type == START_OF_TRANSMISSION
     || gbotap_header.frame_type == END_OF_TRANSMISSION)
  {
    if(OTAP_TRANSMIT_END())
    {
      OTAP_TX_msg.pu8Buffer->u8Data[0] = OACK;
      OTAP_TX_msg.pu8Buffer->u8Data[1] = gbotap_request.coord_addr[0]; 
      OTAP_TX_msg.pu8Buffer->u8Data[2] = gbotap_request.coord_addr[1];  
      OTAP_TX_msg.pu8Buffer->u8Data[3] = DEVICE_ADDRESS0; 
      OTAP_TX_msg.pu8Buffer->u8Data[4] = DEVICE_ADDRESS1;
      OTAP_TX_msg.pu8Buffer->u8Data[5] = gbotap_header.sequence_number++;
      OTAP_TX_msg.u8BufSize = 6;
      (void)MCPSDataRequest(&OTAP_TX_msg);
      if(gbotap_header.frame_type == END_OF_TRANSMISSION && num_ret)
      {        
        num_ret--;
      }     
    }
    if(gbotap_header.frame_type == ODATA || gbotap_header.frame_type == START_OF_TRANSMISSION)
    {
      OTAP_STATE = WAIT_4_DATA;
      gbOtapExecute = TRUE;
    }
    else if(gbotap_header.frame_type == END_OF_TRANSMISSION && num_ret)
    {
      OTAP_STATE = SEND_ACK;
      gbOtapExecute = TRUE;
    }
    else if(gbotap_header.frame_type == END_OF_TRANSMISSION && !num_ret)
    {
      OTAP_STATE = FLASHING;
      gbOtapExecute = TRUE;
      num_ret = 20;
    }
  }
}

void send_error(void)
{
  if(OTAP_TRANSMIT_END())
  {
    OTAP_TX_msg.pu8Buffer->u8Data[0] = ERROR;
    OTAP_TX_msg.pu8Buffer->u8Data[1] = gbotap_request.coord_addr[0]; 
    OTAP_TX_msg.pu8Buffer->u8Data[2] = gbotap_request.coord_addr[1];  
    OTAP_TX_msg.pu8Buffer->u8Data[3] = DEVICE_ADDRESS0; 
    OTAP_TX_msg.pu8Buffer->u8Data[4] = DEVICE_ADDRESS1;
    OTAP_TX_msg.pu8Buffer->u8Data[5] = gbotap_header.sequence_number++;
    OTAP_TX_msg.pu8Buffer->u8Data[6] = gbotap_error.error_type;
    OTAP_TX_msg.u8BufSize = 7;
    (void)MCPSDataRequest(&OTAP_TX_msg);
    OTAP_STATE = RUN_NORMAL;
  }
}

void flash_new_app(void)
{   
  OTAP_STATE = RUN_NORMAL;
  MLMEPHYSoftReset();
}

void OTAP_NVMSetup(void)
{         
  OtapVRegCntl.vReg = g1P8VReg_c;
  OtapVRegCntl.cntl.vReg1P8VEn = TRUE;
  CRM_VRegCntl(&OtapVRegCntl);
  DelayMs(1);
  NVM_Detect(gNvmInternalInterface_c, &OtapNvmType);  
}

void OTAP_data_indication_execute(void)
{    
  uint16_t message_number;      
  uint8_t success_value[4] = {'O','K','O','K'};
  uint8_t i;  
     
    gbotap_header.frame_type = App_RX_msg->pu8Buffer->u8Data[1];
    gbotap_request.device_addr[0] = App_RX_msg->pu8Buffer->u8Data[4];
    gbotap_request.device_addr[1] = App_RX_msg->pu8Buffer->u8Data[5];   
    
    if(App_RX_msg->pu8Buffer->u8Data[1] == gbotap_request.orc[0] && App_RX_msg->pu8Buffer->u8Data[2] == gbotap_request.orc[1] &&
       App_RX_msg->pu8Buffer->u8Data[3] == gbotap_request.orc[2] && App_RX_msg->pu8Buffer->u8Data[4] == gbotap_request.orc[3] && !OtapRequest)
    {
      gbOtapExecute = TRUE;
      OtapRequest = TRUE;      
      gbotap_request.coord_addr[0] = App_RX_msg->pu8Buffer->u8Data[5];
      gbotap_request.coord_addr[1] = App_RX_msg->pu8Buffer->u8Data[6];
      gbotap_request.device_addr[0] = App_RX_msg->pu8Buffer->u8Data[7];
      gbotap_request.device_addr[1] = App_RX_msg->pu8Buffer->u8Data[8];             
      if(gbotap_request.device_addr[0] == 0xFF && gbotap_request.device_addr[1] == 0xFF)
      {        
        broadcast = TRUE;
        for(i = 0; i < 115; i+=2)
        {
          if(App_RX_msg->pu8Buffer->u8Data[9+i] == DEVICE_ADDRESS0 && 
             App_RX_msg->pu8Buffer->u8Data[10+i] == DEVICE_ADDRESS1)
          {
            break;
          }
          else
          { 
            ;                   
          }
        }
        if(i>114)
        {
          OTAP_STATE = WAIT_4_CONFIRM;
          gbOtapExecute = TRUE;
        }
        else
        {
          OTAP_STATE = RUN_NORMAL;         
          OtapRequest = FALSE;
        }
      }
      else if(gbotap_request.device_addr[0] == DEVICE_ADDRESS0 && 
              gbotap_request.device_addr[1] == DEVICE_ADDRESS1)
      {
        OTAP_STATE = WAIT_4_CONFIRM;
        gbOtapExecute = TRUE;
        broadcast = FALSE;
      }
      else
      {
        OTAP_STATE = RUN_NORMAL;
        broadcast = FALSE;
        OtapRequest = FALSE;
      }
    }
    else if(gbotap_header.frame_type == OTAP_CONFIRM && OtapRequest)
    {      
      if((gbotap_request.device_addr[0] == DEVICE_ADDRESS0 &&
         gbotap_request.device_addr[1] == DEVICE_ADDRESS1) || 
         (gbotap_request.device_addr[0] == 0xFF && gbotap_request.device_addr[1] == 0xFF))
      {
        OTAP_STATE = SEND_DESCRIPTOR;
        gbOtapExecute = TRUE;
      }
      else 
      {
        OTAP_STATE = RUN_NORMAL;
        broadcast = FALSE;
        OtapRequest = FALSE;
      }
    }
    else if(gbotap_header.frame_type == OACK && OtapRequest)
    {
      ack_received = TRUE;
      if((gbotap_request.device_addr[0] == DEVICE_ADDRESS0 &&
         gbotap_request.device_addr[1] == DEVICE_ADDRESS1) || 
         (gbotap_request.device_addr[0] == 0xFF && gbotap_request.device_addr[1] == 0xFF))
      {
        if(broadcast)
        {
          OTAP_STATE = RUN_NORMAL;
          broadcast = FALSE;
          OtapRequest = FALSE;
        }
        else
        {
          OTAP_STATE = WAIT_4_SOT;
          gbOtapExecute = FALSE;
        }
      }      
    }
    else if((gbotap_header.frame_type == START_OF_TRANSMISSION) && (OtapRequest))
    {      
      gbOtapExecute = TRUE;
      gbotap_sof.messages_to_send[0] = App_RX_msg->pu8Buffer->u8Data[8];
      gbotap_sof.messages_to_send[1] = App_RX_msg->pu8Buffer->u8Data[9];
      gbmessages_receiving = gbotap_sof.messages_to_send[0]<<8;
      gbmessages_receiving |= gbotap_sof.messages_to_send[1];
      if(gbotap_request.device_addr[0] == DEVICE_ADDRESS0 &&
         gbotap_request.device_addr[1] == DEVICE_ADDRESS1)
      {       
        OTAP_STATE = SEND_ACK;
        gbOtapExecute = TRUE;
      }
      else
      {
        OTAP_STATE = WAIT_4_DATA;      
        gbOtapExecute = TRUE;
      }
    }
    else if(gbotap_header.frame_type == ODATA && OtapRequest)
    {     
      if(gbotap_request.device_addr[0] == DEVICE_ADDRESS0 &&
         gbotap_request.device_addr[1] == DEVICE_ADDRESS1)
      { 
        message_number = (App_RX_msg->pu8Buffer->u8Data[7]<<8) | App_RX_msg->pu8Buffer->u8Data[8];
                
        if(erase_flash)
        {
          OTAP_NVMSetup();            
          NVM_StartNvmRegulator();
          while(!CRM_VRegIsReady(V_REG_MASK_1P8V));  // Wait for regulator to become active                 
          NVM_Erase(gNvmInternalInterface_c, OtapNvmType, 0x000000FF); 
          NVM_Write(gNvmInternalInterface_c, OtapNvmType, (void *)(&success_value[0]), 0x00000000, 4);             
          NVM_Write(gNvmInternalInterface_c, OtapNvmType, (void *)(&App_RX_msg->pu8Buffer->u8Data[9]), index, 115);
          gbDataCounter = App_RX_msg->pu8Buffer->u8Data[9] | App_RX_msg->pu8Buffer->u8Data[10]<<8 | \
                          App_RX_msg->pu8Buffer->u8Data[11]<<16 | App_RX_msg->pu8Buffer->u8Data[12]<<24;
          index += 115;          
          last_message_number++;                 
          erase_flash = FALSE;
        }
        else
        {         
          if(last_message_number+1 == message_number)
          {            
            NVM_Write(gNvmInternalInterface_c, OtapNvmType, (void *)(&App_RX_msg->pu8Buffer->u8Data[9]), index, 115);                      
            index += 115;  
            last_message_number++;            
          }         
        }
        OTAP_STATE = SEND_ACK;
        gbOtapExecute = TRUE;
      }
    }
    else if(gbotap_header.frame_type == END_OF_TRANSMISSION && OtapRequest)
    {      
      if(gbotap_request.device_addr[0] == DEVICE_ADDRESS0 &&
         gbotap_request.device_addr[1] == DEVICE_ADDRESS1)
      {                         
        OTAP_STATE = SEND_ACK;
        OtapRequest = FALSE;
        broadcast = FALSE;                          
      }
    }
}
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -