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

📄 st3000.c

📁 嵌入式开发 嵌入式开发 嵌入式开发
💻 C
📖 第 1 页 / 共 2 页
字号:
    if( !((Edition3K.YtzMachID==1) || (Edition3K.YtzMachID==2)) )
    {   Edition3K.YtzMachID=1;}
    fseek(DataFile, 0, SEEK_SET);
    fread(unit, sizeof(Units)*MAXCNL_3K, 1, DataFile);
    fread(&SysSet, sizeof(SystemSettings), 1, DataFile);
    fread(&Str6xtcs, sizeof(Str6xt), 1, DataFile);
    /*
    开始检验参数
    */
    if( SysSet.CofBanA>25000 || SysSet.CofBanA<2500 )
    {   SysSet.CofBanA=10000;}
    if( SysSet.CofBanB>25000 || SysSet.CofBanB<2500 )
    {   SysSet.CofBanB=10000;}
    if( SysSet.ASignTangle<20 || SysSet.ASignTangle>45 )
    {   SysSet.ASignTangle=45;}
    if( SysSet.BSignTangle<20 || SysSet.BSignTangle>45 )
    {   SysSet.BSignTangle=45;}
    SysSet.ColorWidthA=2000;
    SysSet.ColorWidthB=2000;
    if( SysSet.VCoef<1 || SysSet.VCoef>500 )
    {   SysSet.VCoef=100;}
    if( SysSet.HCoef<1 || SysSet.HCoef>500 )
    {   SysSet.HCoef=100;}
    if( SysSet.bitTurns.TurnofLabsA<1 || SysSet.bitTurns.TurnofLabsA>5 )
    {   SysSet.bitTurns.TurnofLabsA=1;}
    if( SysSet.bitTurns.TurnofLabsB<1 || SysSet.bitTurns.TurnofLabsB>5 )
    {   SysSet.bitTurns.TurnofLabsB=1;}
    if( SysSet.bitShape.ShapeA>6 ) {   SysSet.bitShape.ShapeA=0;}
    if( SysSet.bitShape.ShapeB>6 ) {   SysSet.bitShape.ShapeB=0;}
    /*
    设置状态记录的默认值
    */
    memset(&EntireStatus, 0, sizeof(tagEntireStatus));
    VarST3000.UnitCounts=MAXCNL_3K;
    for(t=0; t<MAXCNL_3K; t++)
    {
        // 手动电机关闭
        unit[t].submenu6.VMotorControls=0;
        unit[t].submenu6.HMotorControls=0;
        // 纵/横向维持手动
        unit[t].submenu1.bitfield.hand_auto=0;
        unit[t].submenu1.bitfield.h_motorruning=0;
        unit[t].submenu1.bitfield.secondprint=0;
        unit[t].submenu1.bitfield.autowork=0;
        if( unit[t].submenu1.unitworksnum.i==1 )
        {   bSingleShape=SysSet.bitShape.ShapeA;}
        else if( unit[t].submenu1.unitworksnum.i==2 )
        {   bSingleShape=SysSet.bitShape.ShapeB;}
        else
        {   bSingleShape=4;}
        if( (bSingleShape==4 && unit[t].submenu1.bitfield.hcontrol) )
        {   unit[t].submenu1.bitfield.hcontrol=0;}
        //___Confirm addressofwav Legality.
        if( unit[t].submenu1.addressofwav<0 || unit[t].submenu1.addressofwav>1999 )
        {   unit[t].submenu1.addressofwav=0;}
        //___Confirm ValueWidth Legality.
        if( unit[t].submenu2.ValueWidth<5 || unit[t].submenu2.ValueWidth>20 )
        {   unit[t].submenu2.ValueWidth=14;}
        //___Confirm DofRoll Legality.
        if( unit[t].submenu6.DofRoll<80 || unit[t].submenu6.DofRoll>160 )
        {   unit[t].submenu6.DofRoll=128;}
        //___Confirm v_alarm Legality.
        if( unit[t].submenu1.v_alarm<1 || unit[t].submenu1.v_alarm>100 )
        {   unit[t].submenu1.v_alarm=30;}
        //___Confirm h_alarm Legality.
        if( unit[t].submenu1.h_alarm<1 || unit[t].submenu1.h_alarm>100 )
        {   unit[t].submenu1.h_alarm=30;}
        if( unit[t].submenu1.bitTurns.turnsoflabsA<1||unit[t].submenu1.bitTurns.turnsoflabsA>5)
        {   unit[t].submenu1.bitTurns.turnsoflabsA=1;}
        if( unit[t].submenu1.bitTurns.turnsoflabsB<1||unit[t].submenu1.bitTurns.turnsoflabsB>5)
        {   unit[t].submenu1.bitTurns.turnsoflabsB=1;}
        	
    }
    for(t=0; t<MAXCNL_3K; t++)
    {   checkbuffer[t].unitnumber=0;}
    /*
    发送0#询问命令
    */
    for(t=0; t<MAXCNL_3K; t++)
    {
        smsg1.id=((int)t<<6);
        smsg1.rtr=0;
        smsg1.dlen=0;
        CAN_SendMsg(smsg1);
    }
    #ifndef ST3000_TMODE
    VarST3000.UnitActuals=0; // 默认为没有接收到通道
    VarST3000.UnitCounts=0; // 重新累计
    itimeouts=0; // can查询等待超时计数清零
    delay(2000); // 2 seconds delay.
    while( (VarST3000.UnitActuals<MAXCNL_3K) && (itimeouts<100000L) )
    {
        if( CAN_RecvMsg(&rmsg1) )
        {
            if( (rmsg1.id&0x3f)==0 )
            {   // 0#命令
                CtrlUnitIsOld=0; // 假设是个新单元
                CtrlUnitID = (rmsg1.id>>6)&0x0F;
                if(rmsg1.dlen!=3)
                {	continue;}
                if( (CtrlUnitID<1) || (CtrlUnitID>MAXCNL_3K) )
                {   continue;}
                // 在已有列表中查找是否存在这个单元
                for(t=1; t<=VarST3000.UnitActuals; t++)
                {
                    if( rmsg1.data[0]==checkbuffer[t].buffer[4] &&
                        rmsg1.data[1]==checkbuffer[t].buffer[5] &&
                        rmsg1.data[2]==checkbuffer[t].buffer[6] &&
                        CtrlUnitID==checkbuffer[t].unitnumber )
                    {   CtrlUnitIsOld=1; break;}
                }
                if( (!CtrlUnitIsOld) && rmsg1.data[0] )
                {
                    VarST3000.UnitActuals++; // 第一个记录到数组下标1的位置 以此类推
                    checkbuffer[VarST3000.UnitActuals].buffer[3] =CtrlUnitID;
                    checkbuffer[VarST3000.UnitActuals].buffer[4] =rmsg1.data[0];
                    checkbuffer[VarST3000.UnitActuals].buffer[5] =rmsg1.data[1];
                    checkbuffer[VarST3000.UnitActuals].buffer[6] =rmsg1.data[2];
                    checkbuffer[VarST3000.UnitActuals].unitnumber=CtrlUnitID;
                    itimeouts=0L;
                }
            }
        }
        else
        {   itimeouts++;}
    }
    #else
    for(t=1; t<MAXCNL_3K; t++)
    {
        checkbuffer[t].buffer[3]=t;
        checkbuffer[t].buffer[4]=10;
        checkbuffer[t].buffer[5]=11;
        checkbuffer[t].buffer[6]=t;
        checkbuffer[t].unitnumber=t;
    }
    VarST3000.UnitActuals=10;
    #endif
    ReSortCURecv(); // 重新排序 20051010
    VarST3000.UnitCounts=MAXCNL_3K; // 最大机组号显示
    for(t=1; t<=VarST3000.UnitActuals; t++)
    {
        if( checkbuffer[t].buffer[3]!=system1[t].sub1.B4 ||
            checkbuffer[t].buffer[4]!=system1[t].sub2.B1 ||
            checkbuffer[t].buffer[5]!=system1[t].sub2.B2 ||
            checkbuffer[t].buffer[6]!=system1[t].sub2.B3 )
        {   CfgUpdate=1; break;}
    }
    InitialMouse();
    Bar(0, 0, 1023, 767, 192, 192, 192);
    if( VarST3000.Language )
    {
        ShowASCMemX(5, 19, 1, 2, "KESAI COLOR CON", 255, 255, 255);
        ShowASCMemX(6, 20, 1, 2, "KESAI COLOR CON", 128, 128, 128);
    }
    else
    {
        ShowGB2312X(5, 19, 1, 2, "电脑套色", 255, 255, 255);
        ShowGB2312X(6, 20, 1, 2, "电脑套色", 128, 128, 128);
    }
    if( CfgUpdate ) {   SysConfirm();}
    // A系属的命令设置
    GetEntireIntelligent(1);
    GetEntireAuto(1);
    bEntireTurns=GetEntireTurns(1);
    for(t=1; t<VarST3000.UnitCounts; t++)
    {
        if( unit[t].submenu1.unitworksnum.i==1 &&
            unit[t].submenu1.unitworksnum.j )
        {   ReUpdateCmd6(t, EntireStatus.EntireIntelligent_A, EntireStatus.EntireAuto_A, bEntireTurns);}
    }
    // B系属的命令设置
    GetEntireIntelligent(2);
    GetEntireAuto(2);
    bEntireTurns=GetEntireTurns(2);
    for(t=1; t<VarST3000.UnitCounts; t++)
    {
        if( unit[t].submenu1.unitworksnum.i==2 &&
            unit[t].submenu1.unitworksnum.j )
        {   ReUpdateCmd6(t, EntireStatus.EntireIntelligent_B, EntireStatus.EntireAuto_B, bEntireTurns);}
    }
    // 不归A系属和B系属
    for(t=1; t<VarST3000.UnitCounts; t++)
    {
        if( !(unit[t].submenu1.unitworksnum.i && unit[t].submenu1.unitworksnum.j) )
        {   memset(CommandData[t].Cmd6, 0, 7);}
    }
    #ifndef ST3000_TMODE
    for(t=1; t<VarST3000.UnitCounts; t++)
    {   SendCnlData(t, 0x07);} delay(30);
    for(t=1; t<VarST3000.UnitCounts; t++)
    {   SendCnlData(t, 0x08);} delay(30);
    for(t=1; t<VarST3000.UnitCounts; t++)
    {   SendCnlData(t, 0x09);} delay(30);
    for(t=1; t<VarST3000.UnitCounts; t++)
    {   SendCnlData(t, 0x0A);} delay(30);
    for(t=1; t<VarST3000.UnitCounts; t++)
    {   SendCnlData(t, 0x0B);} delay(30);
    for(t=1; t<VarST3000.UnitCounts; t++)
    {   SendCnlData(t, 0x06);}
    #endif
}

/***
 初始化界面扩展内存区
***/
void InitClientXms(void)
{
    DWORD t,dwOffset=0L;
    _fmemset(pdata1, 0xC0, 4096L);
    for(t=0; t<700; t++)
    {
        CopyXMSMem((WORD)0, (DWORD)pdata1, 4096L, hClientXms, dwOffset);
        dwOffset+=4096L;
    }
    _fmemset(pdata1, 0xFF, 4096L);
    for(t=0, dwOffset=0L; t<200; t++)
    {
        CopyXMSMem((WORD)0, (DWORD)pdata1, 4096L, hWaveXms, dwOffset);
        dwOffset+=4096L;
    }
}

/***
 系统主程序
***/
void main(void)
{
    int ti;
    unsigned nLeftXms;
    WORD FreeXms;
    if( (pdata1=(unsigned char far*)farmalloc(4096))==NULL )
    {   printf("Failed allocate memory for 1st signal\n"); return;}
    if( (pdata2=(unsigned char far*)farmalloc(4096))==NULL )
    {   farfree(pdata1);
        printf("Failed allocate memory for 2nd signal\n"); return;}
    #ifndef ST3000_TMODE
    /* 配置AD&CAN板
    D7 1表示A系不报警; 0表示A系报警
    D6 1表示B系不报警; 0表示B系报警
    D5 1表示不采样波形; 0表示采样波形  [/ADE]
    D4 1表示强制SJA1000复位
    D3 1表示强制ADUC812复位
    D2 先置低1ms,然后再置高,表示初始化完成; 1表示数据读完.[/END]
    D1 1表示A系; 0表示B系
    D0 1表示4000脉冲/圈; 0表示2000脉冲/圈.
    */
    OUT7 =0xc0; //old is |=0xc0
    outportb(0x302, OUT7);
    OUT7 =0xd5; //1101 0101
    outportb(0x302, OUT7);
    delay(5);
    OUT7 =0xf5; //1111 0101
    outportb(0x302, OUT7);
    delay(5);
    OUT7 =0xd5;
    outportb(0x302, OUT7);
    delay(1);
    OUT7|=0x10;
    OUT7&=0xfb;
    outportb(0x302, OUT7);
    delay(100);
    OUT7&=0xef;
    OUT7|=0x04;
    outportb(0x302, OUT7);
    if( !CAN_Init(CAN1_IRQ) )
    {   goto across_whilemain;}
    if( !CAN_Config() )
    {   goto across_whilemain;}
    delay(100);
    CAN_Run();
    #endif

    if( InitXMSMem() )
    {
        #ifdef ST3000_SCRXMS
        nLeftXms=GetFreeXMSMem();
        if( nLeftXms<3100 )
        {   printf("XMS not enough!\n"); goto across_whilemain;}
        hClientXms=AllocXMSMem(3100);
        if( !hClientXms )
        {   printf("Failed allocate XMS\n"); goto across_whilemain;}
        nLeftXms=GetFreeXMSMem();
        if( nLeftXms<850 )
        {   printf("XMS not enough!\n"); goto across_whilemain;}
        hWaveXms=AllocXMSMem(850);
        if( !hWaveXms )
        {   printf("Failed allocate XMS\n"); goto across_whilemain;}
        #endif
    }
    else
    {   printf("Failed Install XMS Driver\n"); goto across_whilemain;}
    InitVESA();
    SysInit();
    HideMouse();
    if( (lpImageData=(unsigned char far*)farmalloc(13824))==NULL )
    {   goto across_whilemain;}
    if( (lpImageMask=(unsigned char far*)farmalloc(576))==NULL )
    {   goto across_whilemain;}

    #ifdef ST3000_SCRXMS
    InitClientXms();
/*
    GetImage_xms(2, 70, 1020, 697, hClientXms, 0);
    int v,h;
    for(v=70; v<768; v++)
        for(h=0; h<1024; h++)
            PutPixel(h, v, 192, 192, 192);
    Bar(9, 467, 1015, 670, 255, 255, 255);
    GetImage_xms(9, 467, 1006, 203, hWaveXms, 0);
*/
    #endif
    VarST3000.CtrlMenuStatus=0; // 默认刚进入系统时 工程师控制菜单处于隐藏状态
    ClearhjCNLFlags(); // 清除通道状态记录标志
    ClearBuffers(); // 清除波形记录标志
    // 初始化文件记录标志
    VarST3000.FILE_REC=0x00; // 文件开始没有发生改变
    tmsLastREC=time(NULL); // 记录一个有效的开始时间
    EntireStatus.EntireYtzFlags=0x0000;
    /*
    清除整机工作状态标志
    */
    ClearEntireFlags();
    //___开始进入程序循环
    VarST3000.AppAlive=1;
    VarST3000.SubIDSEL=3;
    VarST3000.MenuIDSEL=VarST3000.MenuIDSELOld=2;
    ShowAllCtrlMenu(); //___Show AllCtrlMenu for User Operate.
    //___resolved can message overflowed.
    // main while loop routine.
    while( VarST3000.AppAlive )
    {
        HideMouse();
        ResetCtrlMenuFocus();
        switch(VarST3000.MenuIDSEL)
        {
        case 1:
            menu1();
            break;
        case 2:
            menu2();
            break;
        case 3:
            menu3();
            break;
        case 4:
            menu4();
            break;
        case 5:
            menu5();
            break;
        case 6:
            menu6();
            break;
        case 7:
            menu7();
            break;
        default:
            break;
        }
    }
across_whilemain:
	
    /*
    关闭报警喇叭
    */
    #ifndef ST3000_TMODE
    OUT7|=0xc0;
    outportb(0x302, OUT7);
    #endif
    for(ti=1; ti<VarST3000.UnitCounts; ti++)
    {
        CommandData[ti].Cmd6[1]&=0xf7; // 脱机工作
        CommandData[ti].Cmd6[2]=0x00; // 本组和整机都是手动
        CommandData[ti].Cmd6[6]&=0xdf; // 横向电机关闭
        SendCnlData(ti, 0x06);
    }
    /*
    正常释放资源数据
    */
    ReleaseMouse();
    farfree(lpImageData);
    farfree(lpImageMask);
    farfree(pdata1);
    farfree(pdata2);
    fclose(fpICO2424);
    fclose(fpICO8840);
    fclose(fpICO3232);
    fclose(fpGB16);
    // 将文件记录完全
    // 存储文件(正常关机后下次访问依据的文件)
    fseek(DataFile, 0, SEEK_SET);
    fwrite(unit, sizeof(Units)*MAXCNL_3K, 1, DataFile);
    fwrite(&SysSet, sizeof(SystemSettings), 1, DataFile);
    fwrite(&Str6xtcs, sizeof(Str6xt), 1, DataFile);
    fclose(DataFile);
    //___存储文件(非正常关机后下次访问依据的文件) 暂时利用DataFile指针指向SysData.bak文件
    DataFile=fopen("SysData.bak", "wb");
    fseek(DataFile, 0, SEEK_SET);
    fwrite(unit, sizeof(Units)*MAXCNL_3K, 1, DataFile);
    fwrite(&SysSet, sizeof(SystemSettings), 1, DataFile);
    fwrite(&Str6xtcs, sizeof(Str6xt), 1, DataFile);
    fclose(DataFile);
    //___存储版本文件 暂时利用DataFile指针指向KS.S文件
    DataFile=fopen("KS.S", "rt+");
    fwrite(&Edition3K, sizeof(tagVER), 1, DataFile);
    fclose(DataFile);
    //___释放为了刷屏而申请的内存区域
    #ifdef ST3000_SCRXMS
    FreeXMSMem(hClientXms);
    hClientXms=0;
    FreeXMSMem(hWaveXms);
    hWaveXms=0;
    #endif
    //___对CAN进行复位
    #ifndef	ST3000_TMODE
    //can0w(0, 1);
    CAN_Exit(CAN1_IRQ);
    #endif
    //___从视频模式退出到文本DOS模式
    EndVESA();
}

⌨️ 快捷键说明

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