manager.c
来自「CNC 的开放码,EMC2 V2.2.8版」· C语言 代码 · 共 306 行
C
306 行
/* Classic Ladder Project *//* Copyright (C) 2001 Marc Le Douarain *//* mavati@club-internet.fr *//* http://www.multimania.com/mavati/classicladder *//* August 2002 *//* ---------------------------- *//* Sections fonctions utilities *//* ---------------------------- *//* This library is free software; you can redistribute it and/or *//* modify it under the terms of the GNU Lesser General Public *//* License as published by the Free Software Foundation; either *//* version 2.1 of the License, or (at your option) any later version. *//* This library is distributed in the hope that it will be useful, *//* but WITHOUT ANY WARRANTY; without even the implied warranty of *//* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *//* Lesser General Public License for more details. *//* You should have received a copy of the GNU Lesser General Public *//* License along with this library; if not, write to the Free Software *//* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */#ifdef HAL_SUPPORT#include "rtapi.h"#include "rtapi_string.h"#else#include <string.h>#endif#include "classicladder.h"#include "global.h"#include "edit.h"#include "manager.h"void InitSections( void ){ StrSection * pSection; int NumSec; for ( NumSec=0; NumSec<NBR_SECTIONS; NumSec++ ) { pSection = &SectionArray[ NumSec ]; pSection->Used = FALSE; strcpy( pSection->Name, "" ); pSection->Language = SECTION_IN_LADDER; pSection->SubRoutineNumber = -1; pSection->FirstRung = 0; pSection->LastRung = 0; pSection->SequentialPage = 0; } // we directly create one section in ladder... // at least for compatibility with our old progs ! pSection = &SectionArray[ 0 ]; pSection->Used = TRUE; strcpy( pSection->Name, "Prog1" ); pSection->Language = SECTION_IN_LADDER; pSection->SubRoutineNumber = -1; pSection->FirstRung = 0; pSection->LastRung = 0; pSection->SequentialPage = 0;}int SearchSubRoutineWithItsNumber( int SubRoutineNbrToFind ){ StrSection * pSection; int NumSec; int Found = FALSE; NumSec = 0; do { pSection = &SectionArray[ NumSec ]; if ( pSection->Used ) { if ( pSection->SubRoutineNumber==SubRoutineNbrToFind ) Found = TRUE; else NumSec++; } else { NumSec++; } } while( NumSec<NBR_SECTIONS && !Found ); if ( Found ) return NumSec; else return -1;}/* All the following stuff is not used for real-time working and embedded version... */#if !defined( __RTL__ ) && defined( GTK_INTERFACE )int SearchSectionWithName( char * SectionNameToFind ){ StrSection * pSection; int NumSec; int Found = FALSE; NumSec = 0; do { pSection = &SectionArray[ NumSec ]; if ( pSection->Used ) { if ( strcmp( pSection->Name, SectionNameToFind )==0 ) Found = TRUE; else NumSec++; } else { NumSec++; } } while( NumSec<NBR_SECTIONS && !Found ); if ( Found ) return NumSec; else return -1;}void SectionSelected( char * SectionName ){ StrSection * pSection; int NumSec = SearchSectionWithName( SectionName ); if ( NumSec>=0 ) { pSection = &SectionArray[ NumSec ]; InfosGene->FirstRung = pSection->FirstRung; InfosGene->LastRung = pSection->LastRung; InfosGene->CurrentRung = InfosGene->FirstRung; InfosGene->CurrentSection = NumSec; }}int AddSection( char * NewSectionName, int TypeLanguageSection, int SubRoutineNbr ){ StrSection * pSection; int NumSec; int FreeFound = FALSE; // Search a free available section NumSec = 0; do { pSection = &SectionArray[ NumSec ]; if ( !pSection->Used ) FreeFound = TRUE; else NumSec++; } while( NumSec<NBR_SECTIONS && !FreeFound ); if ( FreeFound ) { int NumFreeRung; strcpy( pSection->Name, NewSectionName ); pSection->Language = TypeLanguageSection; pSection->FirstRung = 0; pSection->LastRung = 0; pSection->SequentialPage = 0; if ( TypeLanguageSection==SECTION_IN_LADDER ) { pSection->SubRoutineNumber = SubRoutineNbr; NumFreeRung = FindFreeRung( ); if ( NumFreeRung>=0 ) { pSection->Used = TRUE; pSection->FirstRung = NumFreeRung; pSection->LastRung = NumFreeRung; InitBufferRungEdited( &RungArray[ NumFreeRung ] ); } else { FreeFound = FALSE; } }#ifdef SEQUENTIAL_SUPPORT if ( TypeLanguageSection==SECTION_IN_SEQUENTIAL ) { int NumFreePage; NumFreePage = FindFreeSequentialPage( ); if ( NumFreePage>=0 ) { pSection->Used = TRUE; pSection->SequentialPage = NumFreePage; } else { FreeFound = FALSE; } }#endif } return FreeFound;}int NbrSectionsDefined( void ){ StrSection * pSection; int NumSec; int NbrSectionsDefined = 0; for ( NumSec=0; NumSec<NBR_SECTIONS; NumSec++ ) { pSection = &SectionArray[ NumSec ]; if ( pSection->Used ) NbrSectionsDefined++; } return NbrSectionsDefined;}int VerifyIfSectionNameAlreadyExist( char * Name ){ int NumSec; if ( Name[0]=='\0' ) return TRUE; NumSec = SearchSectionWithName( Name ); return( NumSec>=0?TRUE:FALSE );}int VerifyIfSubRoutineNumberExist( int SubRoutineNbr ){ int NumSec; NumSec = SearchSubRoutineWithItsNumber( SubRoutineNbr ); return( NumSec>=0?TRUE:FALSE );}void DelSection( char * SectionNameToErase ){ StrSection * pSection; int NumSec; NumSec = SearchSectionWithName( SectionNameToErase ); if ( NumSec>=0 ) { pSection = &SectionArray[ NumSec ]; pSection->Used = FALSE; // free the rungs used in this section if ( pSection->Language==SECTION_IN_LADDER ) { int ScanRung = InfosGene->FirstRung; while ( ScanRung!=InfosGene->LastRung ) { RungArray[ ScanRung ].Used = FALSE; ScanRung = RungArray[ ScanRung ].NextRung; } RungArray[ InfosGene->LastRung ].Used = FALSE; } }}void SwapSections( char * SectionName1, char * SectionName2 ){ StrSection * pSection1; StrSection * pSection2; StrSection SectionTemp; StrSection * pSectionTemp = &SectionTemp; int NumSec1; int NumSec2; NumSec1 = SearchSectionWithName( SectionName1 ); NumSec2 = SearchSectionWithName( SectionName2 ); if ( NumSec1>=0 && NumSec2>=0 ) { pSection1 = &SectionArray[ NumSec1 ]; pSection2 = &SectionArray[ NumSec2 ]; memcpy( pSectionTemp, pSection1, sizeof(StrSection) ); memcpy( pSection1, pSection2, sizeof(StrSection) ); memcpy( pSection2, pSectionTemp, sizeof(StrSection) ); }}#ifdef SEQUENTIAL_SUPPORTint FindFreeSequentialPage( void ){ int FreePage = -1; // to mark the pages used char PageUsed[ NBR_SEQUENTIAL_PAGES ]; int ScanPage; int ScanSection; StrSection * pSection; for ( ScanPage=0; ScanPage<NBR_SEQUENTIAL_PAGES; ScanPage++ ) PageUsed[ ScanPage ] = FALSE; // scan each section and mark the pages used for ( ScanSection=0; ScanSection<NBR_SECTIONS; ScanSection++ ) { pSection = &SectionArray[ ScanSection ]; if ( pSection->Used ) { if ( pSection->Language==SECTION_IN_SEQUENTIAL ) PageUsed[ pSection->SequentialPage ] = TRUE; } } // find the first free page ScanPage = 0; do { if ( !PageUsed[ ScanPage ] ) FreePage = ScanPage; ScanPage++; } while( ScanPage<NBR_SEQUENTIAL_PAGES && FreePage==-1 ); return FreePage;}#endif#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?