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

📄 lcodu_msg.c

📁 卫星接受机控制卫星和LCD显示
💻 C
📖 第 1 页 / 共 4 页
字号:
                //AR4

                break;
               case 0x57:
                //AT3

                break;
              case 0x59:
                //TxRF 2175   				 	 				 		

                break;
              case 0x5B:
                //RxRF 3537.5

                break;
              case 0x60:
                //Tx PA Control

                break;
              case 0x62:
                //RxAGC Control

                break;
              case 0x65:
                //AT4

                break;
#endif
       case 0x55:
         //ODU_MSG_INT_DATA(v_att0)
         break;
       case 0x56:
         //ATT1
         ODU_MSG_INT_DATA(v_att1)
         break;
       case 0x58:
         //tx frequency lo
         ODU_MSG_INT_DATA(v_tx_f_lo)
         break;
       case 0x5a:
          //rx frequency lo
         ODU_MSG_INT_DATA(v_rx_f_lo)
         break;
       case 0x66:
         tx_buf[5]=diplexer_suffix;
         ack=1;
         break;
#if(0)
             case 0xB0:
                //config

                break;
              case 0xB1:
                //config

                break;
              case 0xB2:
                //config

                break;
              case 0xB3:
                //config

                break;
              case 0xB4:
                //config

                break;
              case 0xB5:
                //config

                break;
              case 0xB6:
                //config

                break;
              case 0xB7:
                //config

                break;
              case 0x97:

                break;
              case 0x99:

                break;
              case 0xA7:

                break;
              case 0xA9:

                break;
#endif
#if(0)
             case 0xC0:
                //TxIF 	 Calibrate

                break;
              case 0xC1:
                //TxRF	 Calibrate
         
                break;
              case 0xC2:
                //RxIF	 Calibrate
              
                break;
#endif
              case 0xC3:
                //RSL	 Calibrate
                stempi=(signed int)v_e_rssi_deltar;
                ODU_MSG_INT_DATA(stempi);
                break;
              case 0xC4:
                //ODU options
                report_odu_options();
                ACK_MSG_HEAD(0x04,subject,0);
                load_msg(tx_buf,5);
                return;
       default:
         break;
       }
       len=ack;
     }
     if(len>0)
     {
       ACK_MSG_HEAD(0x04,subject,len); //ACK
     }
     else
       ACK_MSG_HEAD(0x00,subject,len); //NACK
     
     len+=5;
     load_msg(tx_buf,len);
  }
}

/*处理读flash命令*/
//*-----------------------------------------------------------------------------
//* Function Name       : read_memory_pro
//* Object              : handle the read memory command,and give the response
//* autor               : wang ping  
//* Input Parameters    : addr:the beginning address of the content to read in 
//*                       AT91C_IFLASH.
//*                       bytes:the number of bytes to read.
//*                       component:the component ID in commands field
//* Output Parameters   : none
//*-----------------------------------------------------------------------------
void read_memory_pro(unsigned int addr,unsigned int bytes,unsigned char component)
{
   unsigned char buf[50];
   unsigned int i;
   if(bytes>50)  return;
     
     component<<=3;
     component+=0x04;
     at91f_flash_read(addr,bytes,buf);
     ACK_MSG_HEAD(component,0x00,bytes);
     for(i=0;i<bytes;i++)
       tx_buf[i+5]=buf[i];
     i+=5;
    load_msg(tx_buf,i);
   
}

/*命令应答处理*/
//*-----------------------------------------------------------------------------
//* Function Name       : cmd_handle
//* Object              : the entrance of the command handling process.
//* autor               : wang ping  
//* Input Parameters    : none
//* Output Parameters   : none
//*-----------------------------------------------------------------------------
unsigned int cmd_handle()
{
    unsigned char cmdid,component,subject;
    unsigned int i,j,address;
    unsigned char buf[60];

    int k;
    cmdid=infor_msg[1];
    component=infor_msg[2];
    subject=infor_msg[3];
    
    if(cmdid==0x01)
      set_cmd_pro(subject,component);
    else if(cmdid==0x02)
      get_cmd_pro(subject,component);
    else if(cmdid==0x07)//----------------------read memory
    { component>>=3;
      component&=0x03;
      i=(infor_msg[5]<<8)+infor_msg[6];
      if(component==2)   
      {
        address=i+BASE2;
      }
      else if(component==3)
        address=i+BASE3;
      else return 0;
      
      j=infor_msg[7];
      if(j>50) return 0;
      read_memory_pro(address,j,component);
    }
    else if(cmdid==0x08)//--------------------write memory
    {
      component>>=3;
      component&=0x03;
      i=(infor_msg[5]<<8)+infor_msg[6];
      if(infor_msg[4]<2) return 0;
      j=infor_msg[4]-2;
      if(j>50) 
        return 0;
      if(component==2)
      {
        address=i+BASE2;
        for(i=0;i<j;i++) buf[i]=infor_msg[i+7];
        
        k=at91f_flash_write(address,j,buf);
        if(k==false) { v_odu_alarm[1]|=ALARM_EEPROM; alarm_flag=1;}
        else v_odu_alarm[1]&=NORMAL_EEPROM;
      }
      
      else return 0;
      
      ACK_MSG_HEAD(0x14,0x00,0x00);
      load_msg(tx_buf,5);
      //write_memory_pro();
    }
    else return 0;
    return 1;
}

unsigned int unpack();
/*从PDA提取信息帧*/

//*-----------------------------------------------------------------------------
//* Function Name       : recv_msg
//* Object              : Get a frame from the selected receiving DMA buffer.
//*                       revert the escape bytes,and save the frame in tx_buf[]
//* autor               : wang ping  
//* Input Parameters    : none
//* Output Parameters   : flag=0:Did not receive a frame.flag=1:received a frame
//*-----------------------------------------------------------------------------
unsigned char recv_msg(void)
{ 
  
}

/*将从PDA中取到的信息帧去掉头、尾*/
//*-----------------------------------------------------------------------------
//* Function Name       : unpack
//* Object              : take out the two dilimiters from tx_buf[] and then save 
//*                       the information in infor_msg[].
//* autor               : wang ping  
//* Input Parameters    : none
//* Output Parameters   : i:the length of the information in infor_msg[]
//*-----------------------------------------------------------------------------
unsigned int unpack()  //解包程序
{
   //unsigned char *ch;
   unsigned int i,j;
   
   j=0;
   
   for(i=0;(i+j) < (rx_len-2);i++)
   { 
      if(rx_buf[i+j+1]==ESCAPE)
      { 
        j++;
      }
      
      infor_msg[i]=rx_buf[i+j+1];
      
      if(i>255) return 0;
   }
   return i;
}

/*将应用层信息计算校验和,对0xf5、0xf6进行转义处理,产生需要传输的帧*/
//*-----------------------------------------------------------------------------
//* Function Name       : load_msg
//* Object              : add the two dilimiters to the message and calculate the
//*                       checksum,handle the especial bytes,then load the new
//*                       frame to the DMA Tx buffer of both the USART ports.
//* autor               : wang ping  
//* Input Parameters    : msg:the information to be loaded;len:the number of bytes
//* Output Parameters   : snum:the length of the frame loaded in DMA tx buffer
//*-----------------------------------------------------------------------------
unsigned int load_msg(unsigned char *msg,unsigned int len)  //data link layer
{
   unsigned int snum,j;
   unsigned char checksum;
   unsigned char datalink_buf[256];
   checksum=crc_fun(msg,len);
   datalink_buf[0]=DELIMITER;
   j=0;
   msg[len++]=checksum&0x00ff;

   for(snum=0;snum<len;snum++)
   { 
     datalink_buf[snum+j+1]=msg[snum];
     if(msg[snum]==DELIMITER)
     {
       datalink_buf[snum+j+1]=ESCAPE;
       j++;
       datalink_buf[snum+j+1]=DELIMITER;
     }
     else if(msg[snum]==ESCAPE)
     {
       datalink_buf[snum+j+1]=ESCAPE;
       j++;
       datalink_buf[snum+j+1]=ESCAPE;
     }
   }
   snum=snum+j+1;              
   datalink_buf[snum++]=DELIMITER;

 //  send_msg(datalink_buf,snum);
   
   AT91F_disable_interrupt();
   
  /*将发送信息帧写入PDA*/
   for(j=0;j<snum;j++)
  {  if(us_port==0)  //只有选择IDU时才往IDU发命令
     {
         us0_send_dma[tx_wr_pt++]=datalink_buf[j];
         if(tx_wr_pt>=MAX_SEND_BUF) tx_wr_pt=0;
      }
     //else
     {    us1_send_dma[tx1_wr_pt++]=datalink_buf[j];
         if(tx1_wr_pt>=MAX_SEND_BUF) tx1_wr_pt=0;
     }
  }
  AT91F_enable_interrupt();
   
   return (snum);
}

#if(0)
void send_msg(unsigned char *chbuf,unsigned int snum)
{ unsigned int j;

  AT91F_disable_interrupt();
   
  /*将发送信息帧写入PDA*/
   for(j=0;j<snum;j++)
  {  //if(us_port==0)
     {
         us0_send_dma[tx_wr_pt++]=chbuf[j];
         if(tx_wr_pt>=MAX_SEND_BUF) tx_wr_pt=0;
      }
     //else
     {    us1_send_dma[tx1_wr_pt++]=chbuf[j];
         if(tx1_wr_pt>=MAX_SEND_BUF) tx1_wr_pt=0;
     }
  }
  AT91F_enable_interrupt();
}
#endif

//*-----------------------------------------------------------------------------
//* Function Name       : load_msg
//* Object              : loading the receiver buffer to the other USART TX DMA
//*                       buffer.
//* autor               : wang ping  
//* Input Parameters    : none
//* Output Parameters   : none
//*-----------------------------------------------------------------------------
void rx_tx_display()
{
int j;
if(rx_flag){
    rx_flag=0;
   for(j=0;j<rx_index1;j++)
   { 
     if(us_port==0)//连IDU时转发
     {
         us1_send_dma[tx1_wr_pt++]=rx_buf1[j];
         if(tx1_wr_pt>=MAX_SEND_BUF) tx1_wr_pt=0;
      }
     /*
     else //连PC时转发
     {    us0_send_dma[tx_wr_pt++]=rx_buf1[j];
         if(tx_wr_pt>=MAX_SEND_BUF) tx_wr_pt=0;
     }*/
   }
   rx_index1=0;
  }

}

unsigned int recv_msg()
{
}
//*-----------------------------------------------------------------------------
//* Function Name       : odu_to_idu_com
//* Object              : the entrance of the communication process.
//* autor               : wang ping  
//* Input Parameters    : none
//* Output Parameters   : none
//*-----------------------------------------------------------------------------


⌨️ 快捷键说明

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