查看完整版本: uuprog开发教程:芯片支持库加载2-加载函数

liyf 发表于 2014-12-12 06:28:20

uuprog开发教程:芯片支持库加载2-加载函数

前一节我们已经说道支持库的结构体,这是构建该文件的基本,通过结构体我们可以很方便的加载文件信息到内存,而且不用处理就可以用。
这部分的处理相当复杂,读取的顺序,结构大小,芯片的数量等等必须非常清楚,不然读出的数据100%错的,而且这里基本肯定要用调试功能,每修改一次必须过一次调试跟踪,切记。

这个函数可以说在整个软件设计中花时最多的,十几天的功夫基本都是耗在这上面,光修改和调试都超多10天,可想而知。对于那些说三道四,软件设计怎么怎么不值钱之类的人整改让他折腾下这个,设计软件的艰辛在哪。
这个函数的主要功能就是解析支持库,然后分类加载到内存中的变量中,因此必须要定义一些全局变量
public:
      void GetUpdate();
      CString GetMacAddress();
      CString GetCpuID();
      CString GetGuid();
      CString GetOSName();
      int VerCompare(CString ver1,CString ver2);
      DWORD m_dDeviceSize;
      CArray<TypeStruct,TypeStruct> m_arTypeList;
      CArray<TypeStruct,TypeStruct> m_arOperationList;
      CArray<TypeStruct,TypeStruct> m_arSizeList;
      CArray<TypeStruct,TypeStruct> m_arPinList;
      CArray<TypeStruct,TypeStruct> m_arDataWidthList;
      CArray<TypeStruct,TypeStruct> m_arPackageList;
      CArray<TypeStruct1,TypeStruct1> m_arVCCList;
      CArray<TypeStruct1,TypeStruct1> m_arVPPList;
      CArray<TypeStruct,TypeStruct> m_arAdapterList;

      CArray<DeviceListFileStruct,DeviceListFileStruct>m_arDeviceList;
      DeviceListFileStruct m_stDFile;
      DeviceListFileHeadStruct m_stDFileHead;
      ProjectFileHeadStruct m_stPFileHead;
      ProjectFileStruct m_stPFile;
      BYTE* pProgBuff;
      CString m_sAppPath;
      CString m_sAppVer;

/*      CString m_sDeviceNote;
      int m_iDevicePinCount;
      int m_iDeviceDataWidth;
      DWORD m_dDeviceID;
      float m_fDeviceVPP;
      DWORD m_dDeviceCheckCRC;
      CString m_sDevicePackage;
      float m_fDeviceVCC;
      int m_iDeviceSize;
      DWORD m_dDeviceManuID;
      CString m_sDeviceAdapter;
      CString m_sDeviceName;
*/
      DWORD      m_dBuffCheckCRC;
      DWORD      m_dProjectFileCRC;
      CString m_sFilename;
而且必须在程序启动时就要初始化
CUUProgDlg::CUUProgDlg(CWnd* pParent /*=NULL*/)
      : CDialog(CUUProgDlg::IDD, pParent)
{
      //{{AFX_DATA_INIT(CUUProgDlg)
      m_AppLog = _T("");
      m_sDeviceAdapter = _T("");
      m_sDeviceCheckCRC = _T("");
      m_sDeviceID = _T("");
      m_sDeviceManuID = _T("");
      m_sDeviceName = _T("");
      m_sDeviceNote = _T("");
      m_sDevicePackage = _T("");
      m_sDeviceSize = _T("");
      m_sDeviceType = _T("");
      m_sDeviceVCC = _T("");
      m_sDeviceVPP = _T("");
      m_sDeviceDatasheet = _T("");
      m_sLoadFileName = _T("");
      //}}AFX_DATA_INIT
      // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
      m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
      m_bProgLink = false;
      m_bOneKeyMode = true;
      m_iAppLogLine = 0;
      m_dBuffCheckCRC = 0;
      m_dProjectFileCRC = 0;
      m_dDeviceSize = 0;
      m_sAppPath = "";
      m_sUUProgSN = "------";
      m_sUUProgHWVer = "----";
      m_sUUProgFWVer = "----";
      m_sUUProgFWDate = "--------";
      m_sUUProgType = "------";
      ZeroMemory(&m_stPFile, sizeof(ProjectFileStruct));
      ZeroMemory(&m_stPFileHead, sizeof(ProjectFileHeadStruct));
      ZeroMemory(&m_stDFile, sizeof(DeviceListFileStruct));
      ZeroMemory(&m_stDFileHead, sizeof(DeviceListFileHeadStruct));
//      pProgBuff=(BYTE*)GlobalAlloc(GMEM_FIXED,0x10000);//½¨Á¢»º³å1
//      memset(pProgBuff,0xff,0x10000);
}然后就是指定函数什么时候加载了,这里我们用到了定时器,其实这个的处理比较蛋疼的,想要实现加载信息实时显示,用多线程该是最好的方案,但是我们这里只用到了定时器延时启动,避免程序启动时就一闪而过,看不到加载的效果。
void CUUProgDlg::OnTimer(UINT nIDEvent)
{
    // TODO: Add your message handler code here and/or call default
    SetAppLog("欢迎使用UUProg编程器应用程序");
    SetAppLog("设计开发:Liyf");
    SetAppLog("支持网站:http://www.diybcq.com");
//    SetAppLog("          http://kitebee.gnway.net");
    SetAppLog("QQ群:41210778");
    SetAppLog("<----------------------------------------------");
    SetAppLog("");
    //初始化程序
    SetAppLog("程序初始化...");
    GetAppVer();
    GetAppPath();
    SetAppLog("加载配置...");
    LoadConfig();
    SetAppLog("设置计数器...");
    SetCount();
    SetAppLog("加载芯片列表...");
    LoadDeviceList();
    SetAppLog("加载最近编程芯片...");
    if(!m_sDeviceName.IsEmpty())//加载最近编程芯片
    {
                        CString temp;
                  for (int i=0; i<m_arDeviceList.GetSize(); i++)
                  {
                        temp = m_arDeviceList.GetAt(i).DeviceName;
                        if(m_sDeviceName == temp)
                        {
                            SetDeviceInfo(i);
                            break;
                           
                        }
                  }
    }
       SetAppLog("初始化完成!");
    SetAppLog("<----------------------------------------------");
    SetAppLog("");
       SetAppLog("操作系统:"+GetOSName());
       SetAppLog("CID:"+GetCpuID()+"-"+GetMacAddress());
       SetAppLog("UID:"+GetGuid());
    SetAppLog("<----------------------------------------------");
    SetAppLog("");
    m_bProgLink = FindUUProg();
    SetAppLog("<----------------------------------------------");
    SetAppLog("");
    SetAppLog("检测是否有软件更新...");
    GetUpdate();
    SetAppLog("<----------------------------------------------");

    KillTimer(1);   
   
    CDialog::OnTimer(nIDEvent);
}

下面就是LoadDeviceList()函数了,非常复杂的,慢慢看
void CUUProgDlg::LoadDeviceList()
{
      CFile ldfile;
      if(ldfile.Open(m_sAppPath+"device.pdl",CFile::shareCompat|CFile::modeRead,NULL))
      {
                int      BufSize=ldfile.GetLength();
                int StartAddr;
                BYTE* fileBuf=new BYTE;
                ldfile.Read(fileBuf,BufSize);
                memcpy(&m_stDFileHead,fileBuf,sizeof(DeviceListFileHeadStruct));
                int result = VerCompare(m_sAppVer,m_stDFileHead.DeviceListFileVer);
                if(result != 0)
                {
                AfxMessageBox("芯片支持库版本不匹配,请从新安装软件!");
                GlobalFree(fileBuf);
                ldfile.Close();
                }
                //Type List
                StartAddr = sizeof(DeviceListFileHeadStruct);
                TypeStruct* pType=(TypeStruct*)&fileBuf;
                for(int n=0;n<=m_stDFileHead.TypeListCount-1;n++)
                {
                        m_arTypeList.Add(pType);
                }
                //Operation List
                StartAddr += m_stDFileHead.TypeListCount*sizeof(TypeStruct);
                pType=(TypeStruct*)&fileBuf;
                for(n=0;n<=m_stDFileHead.OperationListCount-1;n++)
                {
                        m_arOperationList.Add(pType);
                }
                //Size List
                StartAddr += m_stDFileHead.OperationListCount*sizeof(TypeStruct);
                pType=(TypeStruct*)&fileBuf;
                for(n=0;n<=m_stDFileHead.SizeListCount-1;n++)
                {
                        m_arSizeList.Add(pType);
                }
                //Pin List
                StartAddr += m_stDFileHead.SizeListCount*sizeof(TypeStruct);
                pType=(TypeStruct*)&fileBuf;
                for(n=0;n<=m_stDFileHead.PinListCount-1;n++)
                {
                        m_arPinList.Add(pType);
                }
                //DataWidth List
                StartAddr += m_stDFileHead.PinListCount*sizeof(TypeStruct);
                pType=(TypeStruct*)&fileBuf;
                for(n=0;n<=m_stDFileHead.DataWidthListCount-1;n++)
                {
                        m_arDataWidthList.Add(pType);
                }
                //Package List
                StartAddr += m_stDFileHead.DataWidthListCount*sizeof(TypeStruct);
                pType=(TypeStruct*)&fileBuf;
                for(n=0;n<=m_stDFileHead.PackageListCount-1;n++)
                {
                        m_arPackageList.Add(pType);
                }
                //VCC List
                StartAddr += m_stDFileHead.PackageListCount*sizeof(TypeStruct);
                TypeStruct1* pType1=(TypeStruct1*)&fileBuf;
                for(n=0;n<=m_stDFileHead.VCCListCount-1;n++)
                {
                        m_arVCCList.Add(pType1);
                }
                //VPP List
                StartAddr += m_stDFileHead.VCCListCount*sizeof(TypeStruct1);
                pType1=(TypeStruct1*)&fileBuf;
                for(n=0;n<=m_stDFileHead.VPPListCount-1;n++)
                {
                        m_arVPPList.Add(pType1);
                }
                //Adapter List
                StartAddr += m_stDFileHead.VPPListCount*sizeof(TypeStruct1);
                pType=(TypeStruct*)&fileBuf;
                for(n=0;n<=m_stDFileHead.AdapterListCount-1;n++)
                {
                        m_arAdapterList.Add(pType);
                }

                //Device List
//                memcpy(&m_stDFileHead,fileBuf,sizeof(DeviceListFileHeadStruct));
                StartAddr += m_stDFileHead.AdapterListCount*sizeof(TypeStruct);
                DeviceListFileStruct* pDevice=(DeviceListFileStruct*)&fileBuf;
                for(n=0;n<=m_stDFileHead.DeviceCount-1;n++)
                {
                        m_arDeviceList.Add(pDevice);
                }
                GlobalFree(fileBuf);
                ldfile.Close();
      }
      else
      {
      TypeStruct stType;
      TypeStruct1 stType1;

      ZeroMemory(&stType, sizeof(TypeStruct));
      ZeroMemory(&stType1, sizeof(TypeStruct1));
      strcpy(stType.TypeName,"EPROM");
      stType.TypeVal = 1;
      m_arTypeList.Add(stType);
      strcpy(stType.TypeName,"MPU");
      stType.TypeVal = 2;
      m_arTypeList.Add(stType);
      strcpy(stType.TypeName,"PLD");
      stType.TypeVal = 3;
      m_arTypeList.Add(stType);
      strcpy(stType.TypeName,"PROM");
      stType.TypeVal = 4;
      m_arTypeList.Add(stType);

      strcpy(stType.TypeName,"AT24(AT24xxx)");
      stType.TypeVal = 1;
      m_arOperationList.Add(stType);
      strcpy(stType.TypeName,"AT51(AT89x5x)");
      stType.TypeVal = 2;
      m_arOperationList.Add(stType);
      strcpy(stType.TypeName,"AT93(AT93xxx)");
      stType.TypeVal = 3;
      m_arOperationList.Add(stType);
      strcpy(stType.TypeName,"EN25(EN25xxx)");
      stType.TypeVal = 4;
      m_arOperationList.Add(stType);

      strcpy(stType.TypeName,"1k");
      stType.TypeVal = 1024;
      m_arSizeList.Add(stType);
      strcpy(stType.TypeName,"2k");
      stType.TypeVal = 2048;
      m_arSizeList.Add(stType);
      strcpy(stType.TypeName,"4k");
      stType.TypeVal = 4096;
      m_arSizeList.Add(stType);
      strcpy(stType.TypeName,"8k");
      stType.TypeVal = 8192;
      m_arSizeList.Add(stType);

      strcpy(stType.TypeName,"8 Pin");
      stType.TypeVal = 8;
      m_arPinList.Add(stType);
      strcpy(stType.TypeName,"16 Pin");
      stType.TypeVal = 16;
      m_arPinList.Add(stType);
      strcpy(stType.TypeName,"28 Pin");
      stType.TypeVal = 28;
      m_arPinList.Add(stType);
      strcpy(stType.TypeName,"32 Pin");
      stType.TypeVal = 32;
      m_arPinList.Add(stType);
      strcpy(stType.TypeName,"40 Pin");
      stType.TypeVal = 40;
      m_arPinList.Add(stType);

      strcpy(stType.TypeName,"8 bit");
      stType.TypeVal = 8;
      m_arDataWidthList.Add(stType);
      strcpy(stType.TypeName,"16 bit");
      stType.TypeVal = 16;
      m_arDataWidthList.Add(stType);
      strcpy(stType.TypeName,"32 bit");
      stType.TypeVal = 32;
      m_arDataWidthList.Add(stType);

      strcpy(stType.TypeName,"DIP");
      stType.TypeVal = 1;
      m_arPackageList.Add(stType);
      strcpy(stType.TypeName,"SOP");
      stType.TypeVal = 2;
      m_arPackageList.Add(stType);
      strcpy(stType.TypeName,"SSOP");
      stType.TypeVal = 3;
      m_arPackageList.Add(stType);
      strcpy(stType.TypeName,"TSSOP");
      stType.TypeVal = 4;
      m_arPackageList.Add(stType);

      strcpy(stType1.TypeName,"5.00V");
      stType1.TypeVal = 5.00;
      m_arVCCList.Add(stType1);
      strcpy(stType1.TypeName,"3.30V");
      stType1.TypeVal = 3.30;
      m_arVCCList.Add(stType1);

      strcpy(stType1.TypeName,"0.00V");
      stType1.TypeVal = 0.00;
      m_arVPPList.Add(stType1);
      strcpy(stType1.TypeName,"12.00V");
      stType1.TypeVal = 12.00;
      m_arVPPList.Add(stType1);
      strcpy(stType1.TypeName,"14.00V");
      stType1.TypeVal = 14.00;
      m_arVPPList.Add(stType1);

      strcpy(stType.TypeName,"NONE");
      stType.TypeVal = 1;
      m_arAdapterList.Add(stType);
      strcpy(stType.TypeName,"SOP8toDIP8");
      stType.TypeVal = 2;
      m_arAdapterList.Add(stType);
      strcpy(stType.TypeName,"SOP16toDIP8");
      stType.TypeVal = 3;
      m_arAdapterList.Add(stType);
      strcpy(stType.TypeName,"TSSOP14toDIP8");
      stType.TypeVal = 4;
      m_arAdapterList.Add(stType);
      }

}
今天先到这里,又得忙了,欢迎有兴趣的加入,详细的请下载源代码,篇幅有限不一定讲解清楚。下节更精彩。




页: [1]
查看完整版本: uuprog开发教程:芯片支持库加载2-加载函数