From d96af74f38c3d6c7a4f4ad545f422d58cd1f886a Mon Sep 17 00:00:00 2001 From: Marty Kraimer Date: Thu, 28 May 1998 19:51:50 +0000 Subject: [PATCH] major changes for new makwBaseApp --- src/makeBaseApp/Makefile.Host | 50 +- src/makeBaseApp/makeBaseApp.pl | 460 +++++++++++------- src/makeBaseApp/top/App/README | 1 + src/makeBaseApp/top/config/RELEASE | 3 +- src/makeBaseApp/top/config/RULES.Db | 93 +++- src/makeBaseApp/top/config/RULES.ioc | 9 +- src/makeBaseApp/top/config/RULES.iocBoot | 7 +- src/makeBaseApp/top/config/makeIoccdcmds.pl | 19 + src/makeBaseApp/top/exampleApp/Db/Makefile | 4 + .../top/exampleApp/Db/dbExample.db | 52 ++ .../top/{App => exampleApp}/Makefile | 0 src/makeBaseApp/top/exampleApp/src/Makefile | 3 + .../top/exampleApp/src/Makefile.Host | 19 + .../top/exampleApp/src/Makefile.Vx | 28 ++ src/makeBaseApp/top/exampleApp/src/base.dbd | 241 +++++++++ .../top/exampleApp/src/baseLIBOBJS | 216 ++++++++ .../top/exampleApp/src/caExample.c | 26 + .../top/exampleApp/src/devXxxSoft.c | 55 +++ .../top/exampleApp/src/exampleInclude.dbd | 3 + .../top/exampleApp/src/sncExample.st | 28 ++ .../top/exampleApp/src/xxxRecord.c | 268 ++++++++++ .../top/exampleApp/src/xxxRecord.dbd | 117 +++++ .../top/{iocBoot => exampleBoot}/Makefile | 0 src/makeBaseApp/top/exampleBoot/ioc/Makefile | 4 + src/makeBaseApp/top/exampleBoot/ioc/st.cmd | 17 + .../top/{iocBoot => exampleBoot}/nfsCommands | 0 src/makeBaseApp/top/iocBoot/README | 1 + src/makeBaseApp/top/simpleApp/Db/Makefile | 4 + src/makeBaseApp/top/simpleApp/Makefile | 6 + src/makeBaseApp/top/simpleApp/src/Makefile | 3 + .../top/simpleApp/src/Makefile.Host | 18 + src/makeBaseApp/top/simpleApp/src/Makefile.Vx | 13 + src/makeBaseApp/top/simpleBoot/Makefile | 4 + src/makeBaseApp/top/simpleBoot/ioc/Makefile | 4 + src/makeBaseApp/top/simpleBoot/ioc/st.cmd | 16 + src/makeBaseApp/top/simpleBoot/nfsCommands | 28 ++ 36 files changed, 1609 insertions(+), 211 deletions(-) create mode 100644 src/makeBaseApp/top/App/README create mode 100644 src/makeBaseApp/top/config/makeIoccdcmds.pl create mode 100644 src/makeBaseApp/top/exampleApp/Db/Makefile create mode 100644 src/makeBaseApp/top/exampleApp/Db/dbExample.db rename src/makeBaseApp/top/{App => exampleApp}/Makefile (100%) create mode 100644 src/makeBaseApp/top/exampleApp/src/Makefile create mode 100644 src/makeBaseApp/top/exampleApp/src/Makefile.Host create mode 100644 src/makeBaseApp/top/exampleApp/src/Makefile.Vx create mode 100644 src/makeBaseApp/top/exampleApp/src/base.dbd create mode 100644 src/makeBaseApp/top/exampleApp/src/baseLIBOBJS create mode 100644 src/makeBaseApp/top/exampleApp/src/caExample.c create mode 100644 src/makeBaseApp/top/exampleApp/src/devXxxSoft.c create mode 100644 src/makeBaseApp/top/exampleApp/src/exampleInclude.dbd create mode 100644 src/makeBaseApp/top/exampleApp/src/sncExample.st create mode 100644 src/makeBaseApp/top/exampleApp/src/xxxRecord.c create mode 100644 src/makeBaseApp/top/exampleApp/src/xxxRecord.dbd rename src/makeBaseApp/top/{iocBoot => exampleBoot}/Makefile (100%) create mode 100644 src/makeBaseApp/top/exampleBoot/ioc/Makefile create mode 100644 src/makeBaseApp/top/exampleBoot/ioc/st.cmd rename src/makeBaseApp/top/{iocBoot => exampleBoot}/nfsCommands (100%) create mode 100644 src/makeBaseApp/top/iocBoot/README create mode 100644 src/makeBaseApp/top/simpleApp/Db/Makefile create mode 100644 src/makeBaseApp/top/simpleApp/Makefile create mode 100644 src/makeBaseApp/top/simpleApp/src/Makefile create mode 100644 src/makeBaseApp/top/simpleApp/src/Makefile.Host create mode 100644 src/makeBaseApp/top/simpleApp/src/Makefile.Vx create mode 100644 src/makeBaseApp/top/simpleBoot/Makefile create mode 100644 src/makeBaseApp/top/simpleBoot/ioc/Makefile create mode 100644 src/makeBaseApp/top/simpleBoot/ioc/st.cmd create mode 100644 src/makeBaseApp/top/simpleBoot/nfsCommands diff --git a/src/makeBaseApp/Makefile.Host b/src/makeBaseApp/Makefile.Host index adc9dea9e..527f29326 100644 --- a/src/makeBaseApp/Makefile.Host +++ b/src/makeBaseApp/Makefile.Host @@ -15,27 +15,39 @@ TEMPLATES += top/config/RULES_ARCHS TEMPLATES += top/config/RULES_DIRS TEMPLATES += top/config/RULES_TOP TEMPLATES += top/config/makeSoftLinks +TEMPLATES += top/config/makeNfsCommands.pl +TEMPLATES += top/config/makeIoccdcmds.pl -TEMPLATES += top/App/Makefile -TEMPLATES += top/App/Db/Makefile -TEMPLATES += top/App/Db/dbExample.db -TEMPLATES += top/App/src/Makefile -TEMPLATES += top/App/src/Makefile.Host -TEMPLATES += top/App/src/Makefile.Vx -TEMPLATES += top/App/src/MakefileExample.Host -TEMPLATES += top/App/src/MakefileExample.Vx -TEMPLATES += top/App/src/caExample.c -TEMPLATES += top/App/src/devXxxSoft.c -TEMPLATES += top/App/src/exampleInclude.dbd -TEMPLATES += top/App/src/sncExample.st -TEMPLATES += top/App/src/xxxRecord.c -TEMPLATES += top/App/src/xxxRecord.dbd +TEMPLATES += top/exampleApp/Makefile +TEMPLATES += top/exampleApp/Db/Makefile +TEMPLATES += top/exampleApp/Db/dbExample.db +TEMPLATES += top/exampleApp/src/Makefile +TEMPLATES += top/exampleApp/src/Makefile.Host +TEMPLATES += top/exampleApp/src/Makefile.Vx +TEMPLATES += top/exampleApp/src/caExample.c +TEMPLATES += top/exampleApp/src/devXxxSoft.c +TEMPLATES += top/exampleApp/src/exampleInclude.dbd +TEMPLATES += top/exampleApp/src/sncExample.st +TEMPLATES += top/exampleApp/src/xxxRecord.c +TEMPLATES += top/exampleApp/src/xxxRecord.dbd +TEMPLATES += top/exampleApp/src/base.dbd +TEMPLATES += top/exampleApp/src/baseLIBOBJS -TEMPLATES += top/iocBoot/Makefile -TEMPLATES += top/iocBoot/nfsCommands -TEMPLATES += top/iocBoot/ioc/Makefile -TEMPLATES += top/iocBoot/ioc/st.cmd -TEMPLATES += top/iocBoot/ioc/st.cmdExample +TEMPLATES += top/simpleApp/Makefile +TEMPLATES += top/simpleApp/Db/Makefile +TEMPLATES += top/simpleApp/src/Makefile +TEMPLATES += top/simpleApp/src/Makefile.Host +TEMPLATES += top/simpleApp/src/Makefile.Vx + +TEMPLATES += top/simpleBoot/Makefile +TEMPLATES += top/simpleBoot/nfsCommands +TEMPLATES += top/simpleBoot/ioc/Makefile +TEMPLATES += top/simpleBoot/ioc/st.cmd + +TEMPLATES += top/exampleBoot/Makefile +TEMPLATES += top/exampleBoot/nfsCommands +TEMPLATES += top/exampleBoot/ioc/Makefile +TEMPLATES += top/exampleBoot/ioc/st.cmd SCRIPTS += makeBaseApp.pl diff --git a/src/makeBaseApp/makeBaseApp.pl b/src/makeBaseApp/makeBaseApp.pl index 47c3cf8b6..bd8712591 100755 --- a/src/makeBaseApp/makeBaseApp.pl +++ b/src/makeBaseApp/makeBaseApp.pl @@ -1,228 +1,322 @@ -#!/usr/bin/perl -#makeBaseApp +eval 'exec perl -S $0 ${1+"$@"}' # -*- Mode: perl -*- + if $running_under_some_shell; # makeBaseApp + +# Authors: Ralph Lange and Marty Kraimer use Cwd; use Getopt::Std; use File::Copy; +use File::Find; +use File::Path; -$user=GetUser(); +$user = GetUser(); +$cwd = cwd(); +$eAPPTYPE = $ENV{EPICS_MBA_DEF_APP_TYPE}; +$eTOP = $ENV{EPICS_MBA_TEMPLATE_TOP}; -#get options and check for valid combinations -unless($len = @ARGV) { Cleanup(1);} -unless(getopts('eib:a:')) {Cleanup(1,"Illegal option");} -if($opt_e) { - if($len = @ARGV) { Cleanup(1,"no arguments allowed with -e");} - @ARGV = ("example"); -} -if(!("opt_i" || "opt_e") && "opt_a") { - Cleanup(1,"-a not valid when generating xxxApp only"); -} +&get_commandline_opts; # Read and check options -#locate epics_base -if($opt_b) { #first choice is -b base - $epics_base = $opt_b; -} elsif(-r "config/RELEASE") { #second choice is config/RELEASE - open(IN,"config/RELEASE") or die "Cannot open config/RELEASE"; - while ($line = ) { - chomp($line); - if($line =~ /EPICS_BASE/) { - $line =~ s/EPICS_BASE=//; - $epics_base = $line; - break; - } +# +# Declare two default callback routines for file copy +# These may be overriden within $top/$apptypename/Replace.pl +# +# ReplaceFilename +# called with the source (template) file or directory name, returns +# the "real" name (which gets the target after $top is removed) +# Empty string: Don't copy this file +sub ReplaceFilename { # (filename) + my($file) = $_[0]; + $file =~ s|.*/CVS/?.*||; # template might be kept under CVS + if($opt_i) { + $file =~ s|/$apptypename|/iocBoot|; } - close IN; -} else { #assume script was called with full path to base - $epics_base = $0; - $epics_base =~ s:(/.*)/bin/.*makeBaseApp.*:$1:; -} -unless("$epics_base") {Cleanup (1,"Cannot find EPICS base");} - -$top = $epics_base . "/templates/makeBaseApp/top"; - -#copy /Makefile and config files if not present -unless (-f 'Makefile') -{ - copy("${top}/Makefile","Makefile") or die "$! Copying ${top}/Makefile"; -} -unless (-d 'config') -{ - mkdir('config', 0777) or die "Cannot create config directory"; - foreach $fullname (glob("${top}/config/*")) { - $name = GetFilename($fullname); - if($name eq "RELEASE") {#must substitute for epics_base - open(IN,$fullname) or die "Cannot open $fullname"; - open OUT, ">config/RELEASE" or die "Cannot create RELEASE"; - while ($line =) { - $line =~ s/\${epics_base}/$epics_base/; - print OUT $line; - } - close OUT; - close IN; - } else { - copy("$fullname","config/$name") or die "$! Copying $fullname"; - } + if ($ioc) { # iocBoot/ioc template has dynamic name + $file =~ s|/iocBoot/ioc|/iocBoot/$ioc|; + $file =~ s|_IOC_|$ioc|; + } else { + $file =~ s|.*/iocBoot/ioc/?.*||; } + if ($app) { # apptypenameApp itself is dynamic, too + $file =~ s|/$apptypename|/$appdir|; + $file =~ s|/$appdir/config|/config/$apptype|; + } + $file =~ s|_APPNAME_|$appname|; + $file =~ s|_APPTYPE_|$apptype|; + # We don't want the Replace overrides + $file =~ s|.*/$app/Replace.pl$||; + return $file; } -if($opt_i || $opt_e) { #Create ioc directories - unless(-d "iocBoot") { - mkdir("iocBoot", 0777) or die "Cannot create iocBoot directory"; - $fromDir = "$top/iocBoot"; $toDir = "iocBoot"; - foreach $file ("Makefile","nfsCommands") { - copy("$fromDir/$file","$toDir/$file") - or die "$! Copying $fromDir/$file"; - } +# ReplaceLine +# called with one line of a file, returns the line after replacing +# this and that +sub ReplaceLine { # (line) + my($line) = $_[0]; + $line =~ s/_USER_/$user/; + $line =~ s/_EPICS_BASE_/$epics_base/; + $line =~ s/_ARCH_/$arch/; + $line =~ s/_APPNAME_/$appname/; + $line =~ s/_APPTYPE_/$apptype/; + $line =~ s/_TEMPLATE_TOP_/$top/; + if ($ioc) { + $line =~ s/_IOC_/$ioc/; } - @IOC = @ARGV; - foreach $ioc ( @IOC ) { - $ioc =~ s/^ioc//; - $ioc = "ioc" . $ioc; + return $line; +} + +# Source replace overrides for file copy +if (-r "$top/$apptypename/Replace.pl") { + require "$top/$apptypename/Replace.pl"; +} + +# +# Copy /Makefile and config files if not present +# +CopyFile("$top/Makefile") unless (-f 'Makefile'); +find(\&FCopyTree, "$top/config") unless (-d 'config'); + +# +# Create ioc directories +# +if ($opt_i) { + find(\&FCopyTree, "$top/$apptypename") unless (-d "iocBoot"); + + foreach $ioc ( @ARGV ) { + ($ioc =~ /^ioc/) or $ioc = "ioc" . $ioc; if (-d "iocBoot/$ioc") { print "ioc iocBoot/$ioc is already there!\n"; next; } - mkdir("iocBoot/$ioc", 0777) or die "Cannot create dir iocBoot/$ioc"; - $fromDir = "$top/iocBoot/ioc"; $toDir = "iocBoot/$ioc"; - if($opt_a) { + find(\&FCopyTree, "$top/$apptypename/ioc"); + } + exit 0; # finished here for -i (no xxxApps) +} + +# +# Create app directories (if any names given) +# +foreach $app ( @ARGV ) { + ($appname = $app) =~ s/App$//; + $appdir = $appname . "App"; + if (-d "$appdir") { + print "Application $appname is already there!\n"; + next; + } + print "Creating template structure " + . "for $appname (of type $apptypename)\n" if $Debug; + find(\&FCopyTree, "$top/$apptypename"); +} + +exit 0; # END OF SCRIPT + + +# +# Get commandline options and check for validity +# +sub get_commandline_opts { #no args + ($len = @ARGV) and getopts('ldit:T:b:a:') or Cleanup(1); + +# Debug option + $Debug = 1 if $opt_d; + +# Locate epics_base + if ($opt_b) { # first choice is -b base + $epics_base = $opt_b; + } elsif (-r "config/RELEASE") { # second choice is config/RELEASE + open(IN, "config/RELEASE") or die "Cannot open config/RELEASE"; + while () { + chomp; + s/EPICS_BASE\s*=\s*// and $epics_base = $_, break; + } + close IN; + } elsif ($0 =~ /\/bin\//) { # assume script was called with full path to base + $epics_base = $0; + $epics_base =~ s:(/.*)/bin/.*makeBaseApp.*:$1:; + } + "$epics_base" or Cleanup(1, "Cannot find EPICS base"); + +# Locate template top directory + if ($opt_T) { # first choice is -T templ-top + $top = $opt_T; + } elsif (-r "config/RELEASE") { # second choice is config/RELEASE + open(IN, "config/RELEASE") or die "Cannot open config/RELEASE"; + while () { + chomp; + s/TEMPLATE_TOP\s*=\s*// and $top = $_, break; + } + close IN; + } + if("$top" eq "") { + if ($eTOP) { # third choice is $ENV{EPICS_MBA_TEMPL_TOP} + $top = $eTOP; + } else { # use templates from EPICS base + $top = $epics_base . "/templates/makeBaseApp/top"; + } + } + "$top" or Cleanup(1, "Cannot find template top directory"); + +# Print application type list? + if ($opt_l) { + &ListAppTypes; + exit 0; # finished for -l command + } + +# iocBoot and architecture stuff + if ($opt_i) { + if ($opt_a) { $arch = $opt_a; } else { print "What architecture do you want to use for your IOC,"; print "e.g. pc486, mv167 ? "; - $arch=; + $arch = ; chomp($arch); } - open(IN,"${fromDir}/Makefile") or die "Cannot open ${fromDir}/Makefile"; - open OUT, ">${toDir}/Makefile" or die "Cannot create ${toDir}/Makefile"; - while ($line = ) { - $line =~ s/\${arch}/${arch}/; - print OUT $line; - } - close OUT; - close IN; - if($opt_e) { - open(IN,"${fromDir}/st.cmdExample") - or die "Cannot open ${fromDir}/st.cmdExample"; - open OUT, ">${toDir}/st.cmd" - or die "Cannot create ${toDir}/st.cmd"; - while ($line = ) { - $line =~ s/\${user}/${user}/; - print OUT $line; - } - close OUT; - close IN; - } else { - copy("$fromDir/st.cmd","$toDir/st.cmd") - or die "$! Copying $fromDir/st.cmd"; - } } - if($opt_i) {exit 0;} #If -i was specified dont generate any xxxApps + +# Application template type + if ($opt_t) { # first choice is -t type + $apptype = $opt_t; + } elsif ($eAPPTYPE) { # second choice is $ENV{EPICS_DEFAULT_APP_TYPE} + $apptype = $eAPPTYPE; + } elsif (-r "$top/defaultApp") {# third choice is (a link) in the $top dir + $apptype = "default"; + } + $apptype =~ s/App$//; + $apptype =~ s/Boot$//; + "$apptype" or Cleanup(1, "Cannot find default application type"); + if ($opt_i) { # fixed name when doing ioc dirs + $apptypename = $apptype . "Boot"; + } else { + $apptypename = $apptype . "App"; + } + +# Valid $apptypename? + while (-l "$top/$apptypename") { + ($apptypename = readlink "$top/$apptypename") =~ s/^$top//; + } + unless (-r "$top/$apptypename") { + print "Application type does not exist. "; + &ListAppTypes; + exit 1; + } + + print "\nCommand line / environment options validated:\n" + . " Templ-Top: $top\n" + . "Templ-Type: $apptype\n" + . "Templ-Name: $apptypename\n" + . " opt_i: $opt_i\n" + . " arch: $arch\n" + . "EPICS-Base: $epics_base\n\n" if $Debug; } -# Generate app dirs (if any names given) -foreach $app ( @ARGV) { - $appname = $app . "App"; - if (-d "$appname") { - print "App $appname is already there!\n"; - next; - } - mkdir("$appname", 0777) or die "Cannot create dir $appname"; - copy("$top/App/Makefile","$appname/Makefile") - or die "$! Copying $top/App/Makefile"; - mkdir("${appname}/src", 0777) or die "Cannot create dir ${appname}/src"; - $fromDir = "$epics_base/dbd"; $toDir = "${appname}/src"; - foreach $file ("base.dbd","baseLIBOBJS") { - copy("$fromDir/$file","$toDir/$file") - or die "$! Copying $fromDir/$file"; - } - $fromDir = "$top/App/src"; $toDir = "${appname}/src"; - copy("$fromDir/Makefile","$toDir/Makefile") - or die "$! Copying $fromDir/Makefile"; - if($opt_e) {$example = "Example";} else {$example = "";} - foreach $ext ("Host","Vx") { - copy("$fromDir/Makefile${example}.$ext","${toDir}/Makefile.$ext") - or die "$! Copying $fromDir/Makefile${example}.$extension"; - } - if($opt_e) { - @filelist = (glob("${fromDir}/*.c")); - @filelist = (@filelist,glob("${fromDir}/*.dbd")); - @filelist = (@filelist,glob("${fromDir}/*.st")); - foreach $fullname (@filelist) { - $name = GetFilename($fullname); - if($name eq "sncExample.st") { - open(IN,"${fromDir}/sncExample.st") - or die "Cannot open ${fromDir}/sncExample.st"; - open(OUT, ">${toDir}/sncExample.st") - or die "Cannot open ${toDir}/sncExample.st"; - while ($line =) { - $line =~ s/\${user}/${user}/; - print OUT $line; - } - close OUT; - close IN; - } else { - copy("${fromDir}/${name}","${toDir}/${name}") - or die "$! \nCopying ${fromDir}/${name}\n"; - } - } - } - mkdir("${appname}/Db", 0777) or die "Cannot create dir ${appname}/Db"; - $fromDir = "$top/App/Db"; $toDir = "${appname}/Db"; - copy("${fromDir}/Makefile","${toDir}/Makefile") - or die "$! Copying ${fromDir}/Makefile"; - if ($opt_e) { - copy("${fromDir}/dbExample.db","${toDir}/dbExample.db") - or die "$! Copying ${fromDir}/dbExample.db"; +# +# List application types +# +sub ListAppTypes { # no args + print "Valid application types are:\n"; + find(\&Fapp_types, "$top/"); + for $type (keys %Types) { + printf "%-15s %-15s\n", $TypeNameA{$type}, $TypeNameE{$type}; } } +sub Fapp_types { + ! /$topn/ && ! /defaultApp$/ && /App$/ && + ($File::Find::prune = 1) && s/App$// && + (($type = $_) =~ s/^example_//, 1) && + ($t = /^example_.*/?TypeNameE:TypeNameA, + s/^example_.*/(including example: use \'-e\' option)/, 1) && + (eval "\$$t\{\$type\} = \$_", 1) && + ($Types{$type} = 1); +} -# Cleanup (return-code [ messsage-line1, line 2, ... ]) -sub Cleanup -{ +# +# Copy a file with replacements +# +sub CopyFile { # (source) + $source = $_[0]; + $target = &ReplaceFilename($source); + + if ($target) { + $target =~ s|$top/||; + open(INP, "<$source") and open(OUT, ">$target") + or die "$! Copying $source -> $target"; + + print "Copying file $source -> $target\n" if $Debug; + while () { + print OUT &ReplaceLine($_); + } + close INP; close OUT; + } +} + +# +# Find callback for file or structure copy +# +sub FCopyTree { + chdir $cwd; # Sigh + if (-d $File::Find::name + and ($dir = &ReplaceFilename($File::Find::name))) { + $dir =~ s|$top/||; + print "Creating directory $dir\n" if $Debug; + &mkpath($dir); + } else { + &CopyFile($File::Find::name); + } + chdir $File::Find::dir; +} + +# +# Cleanup and exit +# +sub Cleanup { # (return-code [ messsage-line1, line 2, ... ]) my ($rtncode, @message) = @_; - foreach $line ( @message ) - { + foreach $line ( @message ) { print "$line\n"; } - print "\nUsage:\n\n", - "$0 -e\n", - " or create ioc directories\n", - "$0 -i [-b base] [-a arch] ioc ...\n", - " or create App directories\n", - "$0 [-b base] app ...\n", - "\n", - "where\n\n", - "-e Create an example app. No other arguments can be given\n", - "-i Create ioc directories only. Each argument is an iocname\n", - " If -i is not specified App directories are created\n", - "-b The location of epics base (full path name).\n", - " If not specified and config exists it is found in config/RELEASE\n", - " If config does not exist it is taken from command\n", - "-a The architecture, e.g. mv167.\n", - " If not given you will be prompted\n"; + print <"; diff --git a/src/makeBaseApp/top/App/README b/src/makeBaseApp/top/App/README new file mode 100644 index 000000000..eb61db7b2 --- /dev/null +++ b/src/makeBaseApp/top/App/README @@ -0,0 +1 @@ +This is obsolete. Entiry directory will be removed soon diff --git a/src/makeBaseApp/top/config/RELEASE b/src/makeBaseApp/top/config/RELEASE index 829c26d71..790a5c321 100644 --- a/src/makeBaseApp/top/config/RELEASE +++ b/src/makeBaseApp/top/config/RELEASE @@ -1,5 +1,6 @@ #RELEASE Location of external products -EPICS_BASE=${epics_base} +EPICS_BASE=_EPICS_BASE_ +TEMPLATE_TOP=_TEMPLATE_TOP_ #SHARE= #HIDEOS= #EPICSHIDEOS= diff --git a/src/makeBaseApp/top/config/RULES.Db b/src/makeBaseApp/top/config/RULES.Db index 8ae8418bc..737b29845 100644 --- a/src/makeBaseApp/top/config/RULES.Db +++ b/src/makeBaseApp/top/config/RULES.Db @@ -1,2 +1,93 @@ #RULES.Db -include $(EPICS_BASE)/config/RULES.Db +SUBTOOL = $(EPICS_BASE_HOST_BIN)/subtool +PREFIX=$(shell echo $* | sed -e 's-[0-9]--g' | sed -e 's-\.db--g') +ARCHS += $(BUILD_ARCHS) host cross +ACTIONS += clean inc depends buildInstall build +actionArchTargets = $(foreach action, $(ACTIONS) install,\ + $(foreach arch, $(ARCHS), \ + $(action)$(DIVIDER)$(arch))) + +all install :: inc buildInstall + +buildInstall: .DEPENDS dbd $(DBFROMSCH) $(DBFROMTEMPLATE) $(INDDBFROMTEMPLATE) $(PROD) + +inc build depends: + +$(TOP)/dbd: + $(MKDIR) $(TOP)/dbd + +dbd: $(TOP)/dbd +ifndef WIN32 + ln -s $(TOP)/dbd dbd +endif + +#### The following section is added to +#### allow optimized databases to be built +#### from capfast schematics +#optimization macro +ifeq '$(DB_OPT)' 'YES' +define DB_OPTIMIZE +@echo "Optimizing database $@" +$(RM) $@.tmp +$(DBST) $(INSTALL_DBD)/$(DBDNAME) $@ -d > $@.tmp +$(RM) $@ +$(MV) $@.tmp $@ +endef +else +define DB_OPTIMIZE +endef +endif + + + +#Creates database in current directory from capfast schematics +$(DBFROMSCH):%.db: %.db.opt + @echo "Installing database $@" + @$(MV) $< $(<:%.opt=%) + +%.db.opt: %.edf + $(E2DB) $(E2DB_SYSFLAGS) $(E2DB_FLAGS) -n $@ $< + $(DB_OPTIMIZE) + -@(echo '1,$$g/VAR(/s/VAR(/$$(/g';echo 'w';echo 'q') | ed $@ + +%.edf: ./%.sch $(DEPSCHS) + @if [ ! -f cad.rc -a -r ../cad.rc ] ; then ln -s ../cad.rc ; fi + $(SCH2EDIF) $(SCH2EDIF_SYSFLAGS) $(SCH2EDIF_FLAGS) $< + +######end section added for captast schematics + +$(DBFROMTEMPLATE):%.db: %.template %.substitutions + $(RM) $@ + $(SUBTOOL) $*.template $*.substitutions > $@ + + +$(INDDBFROMTEMPLATE):%.db: %.substitutions + $(RM) $@ +ifndef WIN32 + $(SUBTOOL) $(PREFIX).template $*.substitutions > $@ +endif + +.DEPENDS: Makefile + @$(RM) $@ +ifndef WIN32 + @for NAME in $(INDDBFROMTEMPLATE) garbage_marty ; do \ + if [ $$NAME != garbage_marty ] ; then \ + PREFIX="`echo $$NAME | sed -e 's-[0-9]--g' | sed -e 's-\.db--g'`";\ + echo "$$NAME: $$PREFIX.template" >> $@;\ + fi ; \ + done +endif + +clean:: + @$(RM) dbd $(DBFROMTEMPLATE) $(DBFROMSCH) $(INDDBFROMTEMPLATE) .DEPENDS $(PROD) + +$(actionArchTargets) :%: + $(MAKE) $(word 1, $(subst $(DIVIDER), ,$@)) + +$(ARCHS):%: install + +.PHONY :: $(ARCHS) $(ACTIONS) +.PHONY :: $(actionArchTargets) + +-include .DEPENDS + diff --git a/src/makeBaseApp/top/config/RULES.ioc b/src/makeBaseApp/top/config/RULES.ioc index f25a20f17..af7295d14 100644 --- a/src/makeBaseApp/top/config/RULES.ioc +++ b/src/makeBaseApp/top/config/RULES.ioc @@ -1,2 +1,9 @@ #RULES.ioc -include $(EPICS_BASE)/config/RULES.ioc +include $(EPICS_BASE)/config/RULES_DIRS +buildInstall:: cdcmds + +cdcmds: Makefile + $(PERL) $(TOP)/config/makeIoccdcmds.pl $(ARCH) + +clean:: + @$(RM) cdcmds diff --git a/src/makeBaseApp/top/config/RULES.iocBoot b/src/makeBaseApp/top/config/RULES.iocBoot index 138b1181e..8f6807248 100644 --- a/src/makeBaseApp/top/config/RULES.iocBoot +++ b/src/makeBaseApp/top/config/RULES.iocBoot @@ -2,15 +2,10 @@ DIRS += $(wildcard ioc*) DIRS += $(wildcard as*) include $(EPICS_BASE)/config/RULES_DIRS -ifeq ($(findstring nfsCommands,$(wildcard *)),nfsCommands) buildInstall:: nfs.cmd nfs.cmd: nfsCommands - @echo "Creating $@" - @$(RM) $@ - @cat $< >> $@ - @echo cd \"`\pwd`\" >> $@ + $(PERL) $(TOP)/config/makeNfsCommands.pl clean:: @$(RM) nfs.cmd -endif diff --git a/src/makeBaseApp/top/config/makeIoccdcmds.pl b/src/makeBaseApp/top/config/makeIoccdcmds.pl new file mode 100644 index 000000000..75ee0bf7d --- /dev/null +++ b/src/makeBaseApp/top/config/makeIoccdcmds.pl @@ -0,0 +1,19 @@ +eval 'exec perl -S $0 ${1+"$@"}' # -*- Mode: perl -*- + if $running_under_some_shell; # makeIoccdcmds.pl + +use Cwd; + +$cwd = cwd(); +#hack for sun4 +$cwd =~ s|/tmp_mnt||; +$arch = $ARGV[0]; +print "arch $arch"; + +unlink("cdcmds"); +open(OUT,">cdcmds") or die "$! opening cdcmds"; +print OUT "startup = \"$cwd\"\n"; +$appbin = $cwd; +$appbin =~ s/iocBoot.*//; +$appbin = $appbin . "/bin/${arch}"; +print OUT "appbin = \"$appbin\"\n"; +close OUT; diff --git a/src/makeBaseApp/top/exampleApp/Db/Makefile b/src/makeBaseApp/top/exampleApp/Db/Makefile new file mode 100644 index 000000000..9f0d2a6d3 --- /dev/null +++ b/src/makeBaseApp/top/exampleApp/Db/Makefile @@ -0,0 +1,4 @@ +TOP = ../.. +include $(TOP)/config/CONFIG_APP + +include $(TOP)/config/RULES.Db diff --git a/src/makeBaseApp/top/exampleApp/Db/dbExample.db b/src/makeBaseApp/top/exampleApp/Db/dbExample.db new file mode 100644 index 000000000..3e7a0e916 --- /dev/null +++ b/src/makeBaseApp/top/exampleApp/Db/dbExample.db @@ -0,0 +1,52 @@ +record(ai, "$(user):aiExample") +{ + field(DESC, "Analog input") + field(INP, "$(user):calcExample.VAL NPP NMS") + field(EGUF, "10") + field(EGU, "Counts") + field(HOPR, "10") + field(LOPR, "0") + field(HIHI, "8") + field(HIGH, "6") + field(LOW, "4") + field(LOLO, "2") + field(HHSV, "MAJOR") + field(HSV, "MINOR") + field(LSV, "MINOR") + field(LLSV, "MAJOR") +} +record(calc, "$(user):calcExample") +{ + field(DESC, "Counter") + field(SCAN,"1 second") + field(FLNK, "$(user):aiExample") + field(CALC, "(A3kB) +# +include $(TOP)/config/RULES.Vx +#---------------------------------------- +# ADD RULES AFTER THIS LINE diff --git a/src/makeBaseApp/top/exampleApp/src/base.dbd b/src/makeBaseApp/top/exampleApp/src/base.dbd new file mode 100644 index 000000000..8e6e1caab --- /dev/null +++ b/src/makeBaseApp/top/exampleApp/src/base.dbd @@ -0,0 +1,241 @@ +include "menuGlobal.dbd" +include "menuConvert.dbd" +include "aiRecord.dbd" +#include "aaiRecord.dbd" +include "aoRecord.dbd" +#include "aaoRecord.dbd" +include "biRecord.dbd" +include "boRecord.dbd" +include "calcRecord.dbd" +include "calcoutRecord.dbd" +include "compressRecord.dbd" +include "dfanoutRecord.dbd" +#include "egRecord.dbd" +#include "egeventRecord.dbd" +#include "erRecord.dbd" +#include "ereventRecord.dbd" +include "eventRecord.dbd" +include "fanoutRecord.dbd" +#include "histogramRecord.dbd" +include "longinRecord.dbd" +include "longoutRecord.dbd" +include "mbbiRecord.dbd" +include "mbbiDirectRecord.dbd" +include "mbboRecord.dbd" +include "mbboDirectRecord.dbd" +include "permissiveRecord.dbd" +include "pidRecord.dbd" +#include "pulseCounterRecord.dbd" +#include "pulseDelayRecord.dbd" +#include "pulseTrainRecord.dbd" +#include "scanRecord.dbd" +include "selRecord.dbd" +include "seqRecord.dbd" +include "stateRecord.dbd" +#include "steppermotorRecord.dbd" +include "stringinRecord.dbd" +include "stringoutRecord.dbd" +include "subRecord.dbd" +#include "gsubRecord.dbd" +#include "palRecord.dbd" +include "subArrayRecord.dbd" +#include "timerRecord.dbd" +#include "waitRecord.dbd" +include "waveformRecord.dbd" +device(ai,CONSTANT,devAiSoft,"Soft Channel") +device(ai,CONSTANT,devAiSoftRaw,"Raw Soft Channel") +#device(ai,VME_IO,devAiXy566Se,"XYCOM-566 SE Scanned") +#device(ai,VME_IO,devAiXy566Di,"XYCOM-566 Dif Scanned") +#device(ai,VME_IO,devAiXy566DiL,"XYCOM-566 Dif Latched") +#device(ai,VME_IO,devAiDvx2502,"DVX-2502") +#device(ai,CONSTANT,devAiTestAsyn,"Test Asyn") +#device(ai,AB_IO,devAiAb1771Il,"AB-1771IL-Analog In") +#device(ai,AB_IO,devAiAb1771Ife,"AB-1771IFE") +#device(ai,AB_IO,devAiAb1771Ixe,"AB-1771IXE-Millivolt In") +#device(ai,AB_IO,devAiAb1771IfeSe,"AB-1771IFE-SE") +#device(ai,AB_IO,devAiAb1771IfeMa,"AB-1771IFE-4to20MA") +#device(ai,AB_IO,devAiAb1771Ife0to5V,"AB-1771IFE-0to5Volt") +#device(ai,AB_IO,devAiAb1771IrPlatinum,"AB-1771RTD-Platinum") +#device(ai,AB_IO,devAiAb1771IrCopper,"AB-1771RTD-Copper") +#device(ai,CAMAC_IO,devAiCamac,"Camac") +#device(ai,VME_IO,devAiAt5Vxi,"VXI-AT5-AI") +#device(ai,GPIB_IO,devAiK486Gpib,"Keithley-486") +#device(ai,VME_IO,devAiKscV215,"KSC-V215") +#device(ai,INST_IO,devAiVXStats,"VX stats") +#device(aai,CAMAC_IO,devAaiCamac,"Camac") +device(ao,CONSTANT,devAoSoft,"Soft Channel") +device(ao,CONSTANT,devAoSoftRaw,"Raw Soft Channel") +#device(ao,VME_IO,devAoVmiVme4100,"VMIVME-4100") +#device(ao,CONSTANT,devAoTestAsyn,"Test Asyn") +#device(ao,AB_IO,devAoAb1771Ofe,"AB-1771OFE") +#device(ao,CAMAC_IO,devAoCamac,"Camac") +#device(ao,VME_IO,devAoAt5Vxi,"VXI-AT5-AO") +#device(ao,INST_IO,devAoVXStats,"VX stats") +device(bi,CONSTANT,devBiSoft,"Soft Channel") +device(bi,CONSTANT,devBiSoftRaw,"Raw Soft Channel") +#device(bi,VME_IO,devBiMpv910,"MPV-910") +#device(bi,VME_IO,devBiXVme210,"XVME-210") +#device(bi,CONSTANT,devBiTestAsyn,"Test Asyn") +#device(bi,AB_IO,devBiAb,"AB-Binary Input") +#device(bi,AB_IO,devBiAb16,"AB-16 bit BI") +#device(bi,AB_IO,devBiAb32,"AB-32 bit BI") +#device(bi,CAMAC_IO,devBiCamac,"Camac") +#device(bi,VME_IO,devBiAt5Vxi,"VXI-AT5-BI") +#device(bi,VME_IO,devBiXy240,"XYCOM-240") +#device(bi,VME_IO,devBiHpe1368a,"VXI-HPE1368-VS") +#device(bi,VME_IO,devBiAt8Fp,"AT8-FP10S") +#device(bi,VME_IO,devBiAvme9440,"AVME9440 I") +device(bo,CONSTANT,devBoSoft,"Soft Channel") +device(bo,CONSTANT,devBoSoftRaw,"Raw Soft Channel") +#device(bo,VME_IO,devBoMpv902,"MPV-902") +#device(bo,VME_IO,devBoXVme220,"XVME-220") +#device(bo,CONSTANT,devBoTestAsyn,"Test Asyn") +#device(bo,AB_IO,devBoAb,"AB-Binary Output") +#device(bo,AB_IO,devBoAb16,"AB-16 bit BO") +#device(bo,AB_IO,devBoAb32,"AB-32 bit BO") +#device(bo,CAMAC_IO,devBoCamac,"Camac") +#device(bo,VME_IO,devBoAt5Vxi,"VXI-AT5-BO") +#device(bo,GPIB_IO,devBoK486Gpib,"Keithley-486") +#device(bo,VME_IO,devBoXy240,"XYCOM-240") +#device(bo,VME_IO,devBoHpe1368a,"VXI-HPE1368-VS") +#device(bo,VME_IO,devBoAt8Fp,"AT8-FP10S") +#device(bo,VME_IO,devBoAvme9440,"AVME9440 O") +device(event,CONSTANT,devEventSoft,"Soft Channel") +#device(event,VME_IO,devEventMz8310,"Mizar-8310") +#device(event,CONSTANT,devEventTestIoEvent,"Test IoEvent") +#device(event,VME_IO,devErEpicsEvent,"APS event receiver") +#device(histogram,CONSTANT,devHistogramSoft,"Soft Channel") +#device(histogram,CONSTANT,devHistogramTestAsyn,"Test Asyn") +device(longin,CONSTANT,devLiSoft,"Soft Channel") +#device(longin,CAMAC_IO,devLiCamac,"Camac") +device(longout,CONSTANT,devLoSoft,"Soft Channel") +#device(longout,CAMAC_IO,devLoCamac,"Camac") +device(mbbi,CONSTANT,devMbbiSoft,"Soft Channel") +device(mbbi,CONSTANT,devMbbiSoftRaw,"Raw Soft Channel") +#device(mbbi,VME_IO,devMbbiMpv910,"MPV-910") +#device(mbbi,VME_IO,devMbbiXVme210,"XVME-210") +#device(mbbi,CONSTANT,devMbbiTestAsyn,"Test Asyn") +#device(mbbi,AB_IO,devMbbiAb,"AB-Binary Input") +#device(mbbi,AB_IO,devMbbiAb16,"AB-16 bit BI") +#device(mbbi,AB_IO,devMbbiAb32,"AB-32 bit BI") +#device(mbbi,AB_IO,devMbbiAbAdapterStat,"AB-Adapter Status") +#device(mbbi,AB_IO,devMbbiAbCardStat,"AB-Card Status") +#device(mbbi,CAMAC_IO,devMbbiCamac,"Camac") +#device(mbbi,VME_IO,devMbbiAt5Vxi,"VXI-AT5-BI") +#device(mbbi,VME_IO,devMbbiXy240,"XYCOM-240") +#device(mbbi,VME_IO,devMbbiHpe1368a,"VXI-HPE1368-VS") +#device(mbbi,VME_IO,devMbbiAt8Fp,"AT8-FP10S") +#device(mbbi,VME_IO,devMbbiAvme9440,"AVME9440 I") +device(mbbiDirect,CONSTANT,devMbbiDirectSoft,"Soft Channel") +device(mbbiDirect,CONSTANT,devMbbiDirectSoftRaw,"Raw Soft Channel") +#device(mbbiDirect,VME_IO,devMbbiDirectMpv910,"MPV-910") +#device(mbbiDirect,VME_IO,devMbbiDirectXVme210,"XVME-210") +#device(mbbiDirect,AB_IO,devMbbiDirectAb,"AB-Binary Input") +#device(mbbiDirect,AB_IO,devMbbiDirectAb16,"AB-16 bit BI") +#device(mbbiDirect,AB_IO,devMbbiDirectAb32,"AB-32 bit BI") +#device(mbbiDirect,CAMAC_IO,devMbbiDirectCamac,"Camac") +#device(mbbiDirect,VME_IO,devMbbiDirectAt5Vxi,"VXI-AT5-BI") +device(mbbo,CONSTANT,devMbboSoft,"Soft Channel") +device(mbbo,CONSTANT,devMbboSoftRaw,"Raw Soft Channel") +#device(mbbo,VME_IO,devMbboMpv902,"MPV-902") +#device(mbbo,VME_IO,devMbboXVme220,"XVME-220") +#device(mbbo,CONSTANT,devMbboTestAsyn,"Test Asyn") +#device(mbbo,AB_IO,devMbboAb,"AB-Binary Output") +#device(mbbo,AB_IO,devMbboAb16,"AB-16 bit BO") +#device(mbbo,AB_IO,devMbboAb32,"AB-32 bit BO") +#device(mbbo,VME_IO,devMbboAt5Vxi,"VXI-AT5-BO") +#device(mbbo,GPIB_IO,devMbboK486Gpib,"Keithley-486") +#device(mbbo,VME_IO,devMbboXy240,"XYCOM-240") +#device(mbbo,VME_IO,devMbboHpe1368a,"VXI-HPE1368-VS") +#device(mbbo,VME_IO,devMbboAt8Fp,"AT8-FP10S") +#device(mbbo,VME_IO,devMbboAvme9440,"AVME9440 O") +device(mbboDirect,CONSTANT,devMbboDirectSoft,"Soft Channel") +device(mbboDirect,CONSTANT,devMbboDirectSoftRaw,"Raw Soft Channel") +#device(mbboDirect,VME_IO,devMbboDirectMpv902,"MPV-902") +#device(mbboDirect,VME_IO,devMbboDirectXVme220,"XVME-220") +#device(mbboDirect,AB_IO,devMbboDirectAb,"AB-Binary Output") +#device(mbboDirect,AB_IO,devMbboDirectAb16,"AB-16 bit BO") +#device(mbboDirect,AB_IO,devMbboDirectAb32,"AB-32 bit BO") +#device(mbboDirect,CAMAC_IO,devMbboDirectCamac,"Camac") +#device(mbboDirect,VME_IO,devMbboDirectAt5Vxi,"VXI-AT5-BO") +#device(pulseCounter,VME_IO,devPcMz8310,"Mizar-8310") +#device(pulseDelay,VME_IO,devPdMz8310,"Mizar-8310") +#device(pulseTrain,CONSTANT,devPtSoft,"Soft Channel") +#device(pulseTrain,VME_IO,devPtMz8310,"Mizar-8310") +#device(steppermotor,VME_IO,devSmCompumotor1830,"Compumotor 1830") +#device(steppermotor,VME_IO,devSmOms6Axis,"OMS 6-Axis") +#device(steppermotor,AB_IO,devSmAB1746Hstp1,"Allen Bradley 1746-HTSP1") +device(stringin,CONSTANT,devSiSoft,"Soft Channel") +#device(stringin,CONSTANT,devSiTestAsyn,"Test Asyn") +device(stringout,CONSTANT,devSoSoft,"Soft Channel") +#device(stringout,CONSTANT,devSoTestAsyn,"Test Asyn") +device(subArray,CONSTANT,devSASoft,"Soft Channel") +#device(timer,VME_IO,devTmMizar8310,"Mizar-8310") +#device(timer,VME_IO,devTmDg535,"DG 535") +#device(timer,VME_IO,devTmAt5Vxi,"VXI-AT5-TIME") +device(waveform,CONSTANT,devWfSoft,"Soft Channel") +#device(waveform,VME_IO,devWfXy566Sc,"XYCOM-566 Single Channel") +#device(waveform,VME_IO,devWfComet,"Comet Digitizer") +#device(waveform,VME_IO,devWfJoergerVtr1,"Joerger Digitizer") +#device(waveform,CONSTANT,devWfTestAsyn,"Test Asyn") +#device(waveform,VME_IO,devWfDvx2502,"DVX-2502") +#device(waveform,VME_IO,devWfPentek4261,"Pentek 4261") +#device(waveform,CAMAC_IO,devWfCamac,"Camac") +#device(waveform,VME_IO,devWfJoergerVtr1,"Joerger-VTR1") +#device(waveform,VME_IO,devWfComet,"Omnibyte-COMET") +#device(eg,VME_IO,devEg,"APS event generator G") +#device(egevent,VME_IO,devEgEvent,"APS event generator E") +#device(er,VME_IO,devEr,"APS event receiver") +#device(erevent,VME_IO,devErevent,"APS event receiver") +#device(wait,CONSTANT,devWaitIoEvent,"Soft Channel") +#device(ai,INST_IO,devAiCan,"CANbus") +#device(ao,INST_IO,devAoCan,"CANbus") +#device(bi,INST_IO,devBiCan,"CANbus") +#device(bo,INST_IO,devBoCan,"CANbus") +#device(mbbi,INST_IO,devMbbiCan,"CANbus") +#device(mbbo,INST_IO,devMbboCan,"CANbus") +#device(mbbiDirect,INST_IO,devMbbiDirectCan,"CANbus") +#device(mbboDirect,INST_IO,devMbboDirectCan,"CANbus") +#device(bi,VME_IO,devBiVmic2534,"Vmic2534") +#device(bo,VME_IO,devBoVmic2534,"Vmic2534") +#device(mbbi,VME_IO,devMbbiVmic2534,"Vmic2534") +#device(mbbo,VME_IO,devMbboVmic2534,"Vmic2534") + +include "symb.dbd" + +#device(ai,AB_IO,devAiAbSlcDcm,"AB-SLC500DCM") +#device(ai,AB_IO,devAiAbSlcDcmSigned,"AB-SLC500DCM-Signed") +#device(ao,AB_IO,devAoAbSlcDcm,"AB-SLC500DCM") +#device(longin,AB_IO,devLiAbSlcDcm,"AB-SLC500DCM") +#device(longout,AB_IO,devLoAbSlcDcm,"AB-SLC500DCM") + +#driver(drvXy010) +#driver(drvVxi) +#driver(drvGpib) +#driver(drvBitBus) +#driver(drvBb910) +#driver(drvXy210) +#driver(drvBb902) +#driver(drvXy220) +#driver(drvXy566) +#driver(drvDvx) +#driver(drvVmi4100) +#driver(drvAb) +#driver(drvAt5Vxi) +#driver(drvCompuSm) +#driver(drvOms) +#driver(drvMz8310) +#driver(drvHpe1368a) +#driver(drvXy240) +#driver(drvKscV215) +#driver(drvComet) +#driver(drvJgvtr1) +#driver(drvFp) +#driver(drvFpm) +#driver(drvIpac) +#driver(drvTip810) +#driver(drvVmi2534) +#include "bptTypeJdegC.dbd" +#include "bptTypeJdegF.dbd" +#include "bptTypeKdegC.dbd" +#include "bptTypeKdegF.dbd" diff --git a/src/makeBaseApp/top/exampleApp/src/baseLIBOBJS b/src/makeBaseApp/top/exampleApp/src/baseLIBOBJS new file mode 100644 index 000000000..6a53c8bcd --- /dev/null +++ b/src/makeBaseApp/top/exampleApp/src/baseLIBOBJS @@ -0,0 +1,216 @@ +#LIBOBJS += $(EPICS_BASE_BIN)/aaiRecord.o +#LIBOBJS += $(EPICS_BASE_BIN)/aaoRecord.o +LIBOBJS += $(EPICS_BASE_BIN)/aiRecord.o +LIBOBJS += $(EPICS_BASE_BIN)/aoRecord.o +LIBOBJS += $(EPICS_BASE_BIN)/biRecord.o +LIBOBJS += $(EPICS_BASE_BIN)/boRecord.o +LIBOBJS += $(EPICS_BASE_BIN)/calcRecord.o +LIBOBJS += $(EPICS_BASE_BIN)/calcoutRecord.o +LIBOBJS += $(EPICS_BASE_BIN)/compressRecord.o +LIBOBJS += $(EPICS_BASE_BIN)/dfanoutRecord.o +#LIBOBJS += $(EPICS_BASE_BIN)/egRecord.o +#LIBOBJS += $(EPICS_BASE_BIN)/egeventRecord.o +#LIBOBJS += $(EPICS_BASE_BIN)/erRecord.o +#LIBOBJS += $(EPICS_BASE_BIN)/ereventRecord.o +LIBOBJS += $(EPICS_BASE_BIN)/eventRecord.o +LIBOBJS += $(EPICS_BASE_BIN)/fanoutRecord.o +#LIBOBJS += $(EPICS_BASE_BIN)/gsubRecord.o +#LIBOBJS += $(EPICS_BASE_BIN)/histogramRecord.o +LIBOBJS += $(EPICS_BASE_BIN)/longinRecord.o +LIBOBJS += $(EPICS_BASE_BIN)/longoutRecord.o +LIBOBJS += $(EPICS_BASE_BIN)/mbbiRecord.o +LIBOBJS += $(EPICS_BASE_BIN)/mbbiDirectRecord.o +LIBOBJS += $(EPICS_BASE_BIN)/mbboRecord.o +LIBOBJS += $(EPICS_BASE_BIN)/mbboDirectRecord.o +#LIBOBJS += $(EPICS_BASE_BIN)/palRecord.o +LIBOBJS += $(EPICS_BASE_BIN)/permissiveRecord.o +LIBOBJS += $(EPICS_BASE_BIN)/pidRecord.o +#LIBOBJS += $(EPICS_BASE_BIN)/pulseCounterRecord.o +#LIBOBJS += $(EPICS_BASE_BIN)/pulseDelayRecord.o +#LIBOBJS += $(EPICS_BASE_BIN)/pulseTrainRecord.o +#LIBOBJS += $(EPICS_BASE_BIN)/scanRecord.o +#LIBOBJS += $(EPICS_BASE_BIN)/recWaitCa.o +#LIBOBJS += $(EPICS_BASE_BIN)/recDynLink.o +#LIBOBJS += $(EPICS_BASE_BIN)/recDynLinkTest.o +LIBOBJS += $(EPICS_BASE_BIN)/selRecord.o +LIBOBJS += $(EPICS_BASE_BIN)/seqRecord.o +LIBOBJS += $(EPICS_BASE_BIN)/stateRecord.o +#LIBOBJS += $(EPICS_BASE_BIN)/steppermotorRecord.o +LIBOBJS += $(EPICS_BASE_BIN)/stringinRecord.o +LIBOBJS += $(EPICS_BASE_BIN)/stringoutRecord.o +LIBOBJS += $(EPICS_BASE_BIN)/subRecord.o +LIBOBJS += $(EPICS_BASE_BIN)/subArrayRecord.o +#LIBOBJS += $(EPICS_BASE_BIN)/timerRecord.o +#LIBOBJS += $(EPICS_BASE_BIN)/waitRecord.o +LIBOBJS += $(EPICS_BASE_BIN)/waveformRecord.o +# +# Device Support +# +#LIBOBJS += $(EPICS_BASE_BIN)/devAaiCamac.o +#LIBOBJS += $(EPICS_BASE_BIN)/devAiCamac.o +#LIBOBJS += $(EPICS_BASE_BIN)/devAiDvx2502.o +#LIBOBJS += $(EPICS_BASE_BIN)/devAiKscV215.o +LIBOBJS += $(EPICS_BASE_BIN)/devAiSoft.o +LIBOBJS += $(EPICS_BASE_BIN)/devAiSoftRaw.o +#LIBOBJS += $(EPICS_BASE_BIN)/devVXStats.o +LIBOBJS += $(EPICS_BASE_BIN)/devAiTestAsyn.o +#LIBOBJS += $(EPICS_BASE_BIN)/devAiXy566Di.o +#LIBOBJS += $(EPICS_BASE_BIN)/devAiXy566DiL.o +#LIBOBJS += $(EPICS_BASE_BIN)/devAiXy566Se.o +#LIBOBJS += $(EPICS_BASE_BIN)/devAaoCamac.o +#LIBOBJS += $(EPICS_BASE_BIN)/devAoCamac.o +LIBOBJS += $(EPICS_BASE_BIN)/devAoSoft.o +LIBOBJS += $(EPICS_BASE_BIN)/devAoSoftRaw.o +LIBOBJS += $(EPICS_BASE_BIN)/devAoTestAsyn.o +#LIBOBJS += $(EPICS_BASE_BIN)/devAoVmiVme4100.o +#LIBOBJS += $(EPICS_BASE_BIN)/devApsEg.o +#LIBOBJS += $(EPICS_BASE_BIN)/devApsEr.o +#LIBOBJS += $(EPICS_BASE_BIN)/devAt5Vxi.o +#LIBOBJS += $(EPICS_BASE_BIN)/devAt8Fp.o +#LIBOBJS += $(EPICS_BASE_BIN)/devAvme9440.o +#LIBOBJS += $(EPICS_BASE_BIN)/devBiCamac.o +#LIBOBJS += $(EPICS_BASE_BIN)/devBiMpv910.o +LIBOBJS += $(EPICS_BASE_BIN)/devBiSoft.o +LIBOBJS += $(EPICS_BASE_BIN)/devBiSoftRaw.o +LIBOBJS += $(EPICS_BASE_BIN)/devBiTestAsyn.o +#LIBOBJS += $(EPICS_BASE_BIN)/devBiXVme210.o +#LIBOBJS += $(EPICS_BASE_BIN)/devBoCamac.o +#LIBOBJS += $(EPICS_BASE_BIN)/devBoMpv902.o +LIBOBJS += $(EPICS_BASE_BIN)/devBoSoft.o +LIBOBJS += $(EPICS_BASE_BIN)/devBoSoftRaw.o +LIBOBJS += $(EPICS_BASE_BIN)/devBoTestAsyn.o +#LIBOBJS += $(EPICS_BASE_BIN)/devBoXVme220.o +#LIBOBJS += $(EPICS_BASE_BIN)/devCommonGpib.o +LIBOBJS += $(EPICS_BASE_BIN)/devEventSoft.o +LIBOBJS += $(EPICS_BASE_BIN)/devEventTestIoEvent.o +LIBOBJS += $(EPICS_BASE_BIN)/devHistogramSoft.o +LIBOBJS += $(EPICS_BASE_BIN)/devHistogramTestAsyn.o +#LIBOBJS += $(EPICS_BASE_BIN)/devHpe1368a.o +#LIBOBJS += $(EPICS_BASE_BIN)/devLiCamac.o +LIBOBJS += $(EPICS_BASE_BIN)/devLiSoft.o +#LIBOBJS += $(EPICS_BASE_BIN)/devLoCamac.o +LIBOBJS += $(EPICS_BASE_BIN)/devLoSoft.o +#LIBOBJS += $(EPICS_BASE_BIN)/devMbbiCamac.o +#LIBOBJS += $(EPICS_BASE_BIN)/devMbbiDirectCamac.o +#LIBOBJS += $(EPICS_BASE_BIN)/devMbbiDirectMpv910.o +LIBOBJS += $(EPICS_BASE_BIN)/devMbbiDirectSoft.o +LIBOBJS += $(EPICS_BASE_BIN)/devMbbiDirectSoftRaw.o +#LIBOBJS += $(EPICS_BASE_BIN)/devMbbiDirectXVme210.o +#LIBOBJS += $(EPICS_BASE_BIN)/devMbbiMpv910.o +LIBOBJS += $(EPICS_BASE_BIN)/devMbbiSoft.o +LIBOBJS += $(EPICS_BASE_BIN)/devMbbiSoftRaw.o +LIBOBJS += $(EPICS_BASE_BIN)/devMbbiTestAsyn.o +#LIBOBJS += $(EPICS_BASE_BIN)/devMbbiXVme210.o +#LIBOBJS += $(EPICS_BASE_BIN)/devMbboCamac.o +#LIBOBJS += $(EPICS_BASE_BIN)/devMbboDirectCamac.o +#LIBOBJS += $(EPICS_BASE_BIN)/devMbboDirectMpv902.o +LIBOBJS += $(EPICS_BASE_BIN)/devMbboDirectSoft.o +LIBOBJS += $(EPICS_BASE_BIN)/devMbboDirectSoftRaw.o +#LIBOBJS += $(EPICS_BASE_BIN)/devMbboDirectXVme220.o +#LIBOBJS += $(EPICS_BASE_BIN)/devMbboMpv902.o +LIBOBJS += $(EPICS_BASE_BIN)/devMbboSoft.o +LIBOBJS += $(EPICS_BASE_BIN)/devMbboSoftRaw.o +LIBOBJS += $(EPICS_BASE_BIN)/devMbboTestAsyn.o +#LIBOBJS += $(EPICS_BASE_BIN)/devMbboXVme220.o +#LIBOBJS += $(EPICS_BASE_BIN)/devMz8310.o +LIBOBJS += $(EPICS_BASE_BIN)/devPtSoft.o +LIBOBJS += $(EPICS_BASE_BIN)/devSASoft.o +LIBOBJS += $(EPICS_BASE_BIN)/devSiSoft.o +LIBOBJS += $(EPICS_BASE_BIN)/devSiTestAsyn.o +#LIBOBJS += $(EPICS_BASE_BIN)/devSmCompumotor1830.o +#LIBOBJS += $(EPICS_BASE_BIN)/devSmOms6Axis.o +LIBOBJS += $(EPICS_BASE_BIN)/devSoSoft.o +LIBOBJS += $(EPICS_BASE_BIN)/devSoTestAsyn.o +#LIBOBJS += $(EPICS_BASE_BIN)/devTimerMz8310.o +#LIBOBJS += $(EPICS_BASE_BIN)/devWfCamac.o +#LIBOBJS += $(EPICS_BASE_BIN)/devWfComet.o +#LIBOBJS += $(EPICS_BASE_BIN)/devWfDvx2502.o +#LIBOBJS += $(EPICS_BASE_BIN)/devWfJoergerVtr1.o +LIBOBJS += $(EPICS_BASE_BIN)/devWfSoft.o +LIBOBJS += $(EPICS_BASE_BIN)/devWfTestAsyn.o +#LIBOBJS += $(EPICS_BASE_BIN)/devWfXy566Sc.o +#LIBOBJS += $(EPICS_BASE_BIN)/devWfPentek4261.o +#LIBOBJS += $(EPICS_BASE_BIN)/devXy240.o + +#LIBOBJS += $(EPICS_BASE_BIN)/devAB1771IFE.o +#LIBOBJS += $(EPICS_BASE_BIN)/devAB1771IL.o +#LIBOBJS += $(EPICS_BASE_BIN)/devAB1771IR.o +#LIBOBJS += $(EPICS_BASE_BIN)/devAB1771IXE.o +#LIBOBJS += $(EPICS_BASE_BIN)/devAB1771OFE.o +#LIBOBJS += $(EPICS_BASE_BIN)/devABSLCDCM.o +#LIBOBJS += $(EPICS_BASE_BIN)/devABBINARY.o +#LIBOBJS += $(EPICS_BASE_BIN)/devABStatus.o + +#LIBOBJS += $(EPICS_BASE_BIN)/devAiCan.o +#LIBOBJS += $(EPICS_BASE_BIN)/devAoCan.o +#LIBOBJS += $(EPICS_BASE_BIN)/devBiCan.o +#LIBOBJS += $(EPICS_BASE_BIN)/devBoCan.o +#LIBOBJS += $(EPICS_BASE_BIN)/devMbbiCan.o +#LIBOBJS += $(EPICS_BASE_BIN)/devMbboCan.o +#LIBOBJS += $(EPICS_BASE_BIN)/devMbbiDirectCan.o +#LIBOBJS += $(EPICS_BASE_BIN)/devMbboDirectCan.o +#LIBOBJS += $(EPICS_BASE_BIN)/devVmic2534.o + +LIBOBJS += $(EPICS_BASE_BIN)/symb + +# +# Driver support ANSI +# +#LIBOBJS += $(EPICS_BASE_BIN)/drvAb.o +#LIBOBJS += $(EPICS_BASE_BIN)/drvAt5Vxi.o +LIBOBJS += $(EPICS_BASE_BIN)/drvEpvxi.o +LIBOBJS += $(EPICS_BASE_BIN)/drvEpvxiMsg.o +LIBOBJS += $(EPICS_BASE_BIN)/drvHp1404a.o +#LIBOBJS += $(EPICS_BASE_BIN)/drvHpe1368a.o +#LIBOBJS += $(EPICS_BASE_BIN)/drvHpe1445a.o +#LIBOBJS += $(EPICS_BASE_BIN)/drvKscV215.o +#LIBOBJS += $(EPICS_BASE_BIN)/drvMz8310.o +#LIBOBJS += $(EPICS_BASE_BIN)/drvStc.o +#LIBOBJS += $(EPICS_BASE_BIN)/drvTime.o +#LIBOBJS += $(EPICS_BASE_BIN)/drvCaenV265.o + +#LIBOBJS += $(EPICS_BASE_BIN)/drvVipc310.o +#LIBOBJS += $(EPICS_BASE_BIN)/drvVipc610.o +#LIBOBJS += $(EPICS_BASE_BIN)/drvIpMv162.o +#LIBOBJS += $(EPICS_BASE_BIN)/drvIpac.o +#LIBOBJS += $(EPICS_BASE_BIN)/drvTip810.o +# +# Driver support NON ANSI +# +#LIBOBJS += $(EPICS_BASE_BIN)/module_types.o +#LIBOBJS += $(EPICS_BASE_BIN)/drvBB232.o +#LIBOBJS += $(EPICS_BASE_BIN)/drvBb902.o +#LIBOBJS += $(EPICS_BASE_BIN)/drvBb910.o +#LIBOBJS += $(EPICS_BASE_BIN)/drvBitBus.o +#LIBOBJS += $(EPICS_BASE_BIN)/drvComet.o +#LIBOBJS += $(EPICS_BASE_BIN)/drvCompuSm.o +#LIBOBJS += $(EPICS_BASE_BIN)/drvDvx.o +#LIBOBJS += $(EPICS_BASE_BIN)/drvFp.o +#LIBOBJS += $(EPICS_BASE_BIN)/drvFpm.o +#LIBOBJS += $(EPICS_BASE_BIN)/drvGpib.o +#LIBOBJS += $(EPICS_BASE_BIN)/drvJgvtr1.o +#LIBOBJS += $(EPICS_BASE_BIN)/drvMsg.o +#LIBOBJS += $(EPICS_BASE_BIN)/drvOms.o +#LIBOBJS += $(EPICS_BASE_BIN)/drvTranServ.o +#LIBOBJS += $(EPICS_BASE_BIN)/drvVmi4100.o +#LIBOBJS += $(EPICS_BASE_BIN)/drvXy010.o +#LIBOBJS += $(EPICS_BASE_BIN)/drvXy210.o +#LIBOBJS += $(EPICS_BASE_BIN)/drvXy220.o +#LIBOBJS += $(EPICS_BASE_BIN)/drvXy240.o +#LIBOBJS += $(EPICS_BASE_BIN)/drvXy566.o +#LIBOBJS += $(EPICS_BASE_BIN)/drvVmic2534.o +# +#from src/devOpt +# +#LIBOBJS += $(EPICS_BASE_BIN)/devAnalytekGpib.o +#LIBOBJS += $(EPICS_BASE_BIN)/devBBInteract.o +#LIBOBJS += $(EPICS_BASE_BIN)/devGpibInteract.o +#LIBOBJS += $(EPICS_BASE_BIN)/devK486Gpib.o +#LIBOBJS += $(EPICS_BASE_BIN)/devLibOpt.o +#LIBOBJS += $(EPICS_BASE_BIN)/devXxDc5009Gpib.o +#LIBOBJS += $(EPICS_BASE_BIN)/devXxDg535Gpib.o +#LIBOBJS += $(EPICS_BASE_BIN)/devXxK196Gpib.o +#LIBOBJS += $(EPICS_BASE_BIN)/devXxK263Gpib.o +#LIBOBJS += $(EPICS_BASE_BIN)/devXxSkeletonGpib.o +#LIBOBJS += $(EPICS_BASE_BIN)/devXxSr620Gpib.o + diff --git a/src/makeBaseApp/top/exampleApp/src/caExample.c b/src/makeBaseApp/top/exampleApp/src/caExample.c new file mode 100644 index 000000000..35a023f43 --- /dev/null +++ b/src/makeBaseApp/top/exampleApp/src/caExample.c @@ -0,0 +1,26 @@ +/*caExample.c*/ +#include +#include +#include +#include + +#include "cadef.h" + +main(int argc,char **argv) +{ + double data; + int status; + chid mychid; + + if(argc != 2) { + fprintf(stderr,"usage: caExample pvname\n"); + exit(1); + } + SEVCHK(ca_task_initialize(),"ca_task_initialize"); + SEVCHK(ca_search(argv[1],&mychid),"ca_search failure"); + SEVCHK(ca_pend_io(5.0),"ca_pend_io failure"); + SEVCHK(ca_get(DBR_DOUBLE,mychid,(void *)&data),"ca_get failure"); + SEVCHK(ca_pend_io(5.0),"ca_pend_io failure"); + printf("%s %f\n",argv[1],data); + return(0); +} diff --git a/src/makeBaseApp/top/exampleApp/src/devXxxSoft.c b/src/makeBaseApp/top/exampleApp/src/devXxxSoft.c new file mode 100644 index 000000000..393613a31 --- /dev/null +++ b/src/makeBaseApp/top/exampleApp/src/devXxxSoft.c @@ -0,0 +1,55 @@ +/* devXxxSoft.c */ +/* Example device support module */ + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +/*Create the dset for devXxxSoft */ +static long init_record(); +static long read_xxx(); +struct { + long number; + DEVSUPFUN report; + DEVSUPFUN init; + DEVSUPFUN init_record; + DEVSUPFUN get_ioint_info; + DEVSUPFUN read_xxx; +}devXxxSoft={ + 5, + NULL, + NULL, + init_record, + NULL, + read_xxx, +}; + + +static long init_record(pxxx) + struct xxxRecord *pxxx; +{ + if(recGblInitConstantLink(&pxxx->inp,DBF_DOUBLE,&pxxx->val)) + pxxx->udf = FALSE; + return(0); +} + +static long read_xxx(pxxx) + struct xxxRecord *pxxx; +{ + long status; + + status = dbGetLink(&(pxxx->inp),DBF_DOUBLE, &(pxxx->val),0,0); + /*If return was succesful then set undefined false*/ + if(!status) pxxx->udf = FALSE; + return(0); +} diff --git a/src/makeBaseApp/top/exampleApp/src/exampleInclude.dbd b/src/makeBaseApp/top/exampleApp/src/exampleInclude.dbd new file mode 100644 index 000000000..44558d7ac --- /dev/null +++ b/src/makeBaseApp/top/exampleApp/src/exampleInclude.dbd @@ -0,0 +1,3 @@ +include "base.dbd" +include "xxxRecord.dbd" +device(xxx,CONSTANT,devXxxSoft,"SoftChannel") diff --git a/src/makeBaseApp/top/exampleApp/src/sncExample.st b/src/makeBaseApp/top/exampleApp/src/sncExample.st new file mode 100644 index 000000000..68c46485a --- /dev/null +++ b/src/makeBaseApp/top/exampleApp/src/sncExample.st @@ -0,0 +1,28 @@ +program snctest +float v; +assign v to "_USER_:xxxExample"; +monitor v; + +ss ss1 +{ + state low + { + when(v>5.0) + { + printf("changing to high\n"); + } state high + when(delay(.1)) + { + } state low + } + state high + { + when(v<=5.0) + { + printf("changing to low\n"); + } state low + when(delay(.1)) + { + } state high + } +} diff --git a/src/makeBaseApp/top/exampleApp/src/xxxRecord.c b/src/makeBaseApp/top/exampleApp/src/xxxRecord.c new file mode 100644 index 000000000..cecf12d7b --- /dev/null +++ b/src/makeBaseApp/top/exampleApp/src/xxxRecord.c @@ -0,0 +1,268 @@ +/* xxxRecord.c */ +/* Example record support module */ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#define GEN_SIZE_OFFSET +#include +#undef GEN_SIZE_OFFSET + +/* Create RSET - Record Support Entry Table */ +#define report NULL +#define initialize NULL +static long init_record(); +static long process(); +#define special NULL +#define get_value NULL +#define cvt_dbaddr NULL +#define get_array_info NULL +#define put_array_info NULL +static long get_units(); +static long get_precision(); +#define get_enum_str NULL +#define get_enum_strs NULL +#define put_enum_str NULL +static long get_graphic_double(); +static long get_control_double(); +static long get_alarm_double(); + +struct rset xxxRSET={ + RSETNUMBER, + report, + initialize, + init_record, + process, + special, + get_value, + cvt_dbaddr, + get_array_info, + put_array_info, + get_units, + get_precision, + get_enum_str, + get_enum_strs, + put_enum_str, + get_graphic_double, + get_control_double, + get_alarm_double}; + +typedef struct xxxset { /* xxx input dset */ + long number; + DEVSUPFUN dev_report; + DEVSUPFUN init; + DEVSUPFUN init_record; /*returns: (-1,0)=>(failure,success)*/ + DEVSUPFUN get_ioint_info; + DEVSUPFUN read_xxx; +}xxxdset; + +static void alarm(xxxRecord *pxxx); +static void monitor(xxxRecord *pxxx); + +static long init_record(void *precord,int pass) +{ + xxxRecord *pxxx = (xxxRecord *)precord; + xxxdset *pdset; + long status; + + if (pass==0) return(0); + + if(!(pdset = (xxxdset *)(pxxx->dset))) { + recGblRecordError(S_dev_noDSET,(void *)pxxx,"xxx: init_record"); + return(S_dev_noDSET); + } + /* must have read_xxx function defined */ + if( (pdset->number < 5) || (pdset->read_xxx == NULL) ) { + recGblRecordError(S_dev_missingSup,(void *)pxxx,"xxx: init_record"); + return(S_dev_missingSup); + } + + if( pdset->init_record ) { + if((status=(*pdset->init_record)(pxxx))) return(status); + } + return(0); +} + +static long process(void *precord) +{ + xxxRecord *pxxx = (xxxRecord *)precord; + xxxdset *pdset = (xxxdset *)(pxxx->dset); + long status; + unsigned char pact=pxxx->pact; + + if( (pdset==NULL) || (pdset->read_xxx==NULL) ) { + pxxx->pact=TRUE; + recGblRecordError(S_dev_missingSup,(void *)pxxx,"read_xxx"); + return(S_dev_missingSup); + } + + /* pact must not be set until after calling device support */ + status=(*pdset->read_xxx)(pxxx); + /* check if device support set pact */ + if ( !pact && pxxx->pact ) return(0); + pxxx->pact = TRUE; + + recGblGetTimeStamp(pxxx); + /* check for alarms */ + alarm(pxxx); + /* check event list */ + monitor(pxxx); + /* process the forward scan link record */ + recGblFwdLink(pxxx); + + pxxx->pact=FALSE; + return(status); +} + +static long get_units(DBADDR *paddr, char *units) +{ + xxxRecord *pxxx=(xxxRecord *)paddr->precord; + + strncpy(units,pxxx->egu,DB_UNITS_SIZE); + return(0); +} + +static long get_precision(DBADDR *paddr, long *precision) +{ + xxxRecord *pxxx=(xxxRecord *)paddr->precord; + + *precision = pxxx->prec; + if(paddr->pfield == (void *)&pxxx->val) return(0); + recGblGetPrec(paddr,precision); + return(0); +} + +static long get_graphic_double(DBADDR *paddr,struct dbr_grDouble *pgd) +{ + xxxRecord *pxxx=(xxxRecord *)paddr->precord; + int fieldIndex = dbGetFieldIndex(paddr); + + if(fieldIndex == xxxRecordVAL + || fieldIndex == xxxRecordHIHI + || fieldIndex == xxxRecordHIGH + || fieldIndex == xxxRecordLOW + || fieldIndex == xxxRecordLOLO + || fieldIndex == xxxRecordHOPR + || fieldIndex == xxxRecordLOPR) { + pgd->upper_disp_limit = pxxx->hopr; + pgd->lower_disp_limit = pxxx->lopr; + } else recGblGetGraphicDouble(paddr,pgd); + return(0); +} + +static long get_control_double(DBADDR *paddr,struct dbr_ctrlDouble *pcd) +{ + xxxRecord *pxxx=(xxxRecord *)paddr->precord; + int fieldIndex = dbGetFieldIndex(paddr); + + if(fieldIndex == xxxRecordVAL + || fieldIndex == xxxRecordHIHI + || fieldIndex == xxxRecordHIGH + || fieldIndex == xxxRecordLOW + || fieldIndex == xxxRecordLOLO) { + pcd->upper_ctrl_limit = pxxx->hopr; + pcd->lower_ctrl_limit = pxxx->lopr; + } else recGblGetControlDouble(paddr,pcd); + return(0); +} + +static long get_alarm_double(DBADDR *paddr,struct dbr_alDouble *pad) +{ + xxxRecord *pxxx=(xxxRecord *)paddr->precord; + int fieldIndex = dbGetFieldIndex(paddr); + + if(fieldIndex == xxxRecordVAL) { + pad->upper_alarm_limit = pxxx->hihi; + pad->upper_warning_limit = pxxx->high; + pad->lower_warning_limit = pxxx->low; + pad->lower_alarm_limit = pxxx->lolo; + } else recGblGetAlarmDouble(paddr,pad); + return(0); +} + +static void alarm(xxxRecord *pxxx) +{ + double val; + float hyst, lalm, hihi, high, low, lolo; + unsigned short hhsv, llsv, hsv, lsv; + + if(pxxx->udf == TRUE ){ + recGblSetSevr(pxxx,UDF_ALARM,INVALID_ALARM); + return; + } + hihi = pxxx->hihi; lolo = pxxx->lolo; high = pxxx->high; low = pxxx->low; + hhsv = pxxx->hhsv; llsv = pxxx->llsv; hsv = pxxx->hsv; lsv = pxxx->lsv; + val = pxxx->val; hyst = pxxx->hyst; lalm = pxxx->lalm; + + /* alarm condition hihi */ + if (hhsv && (val >= hihi || ((lalm==hihi) && (val >= hihi-hyst)))){ + if (recGblSetSevr(pxxx,HIHI_ALARM,pxxx->hhsv)) pxxx->lalm = hihi; + return; + } + + /* alarm condition lolo */ + if (llsv && (val <= lolo || ((lalm==lolo) && (val <= lolo+hyst)))){ + if (recGblSetSevr(pxxx,LOLO_ALARM,pxxx->llsv)) pxxx->lalm = lolo; + return; + } + + /* alarm condition high */ + if (hsv && (val >= high || ((lalm==high) && (val >= high-hyst)))){ + if (recGblSetSevr(pxxx,HIGH_ALARM,pxxx->hsv)) pxxx->lalm = high; + return; + } + + /* alarm condition low */ + if (lsv && (val <= low || ((lalm==low) && (val <= low+hyst)))){ + if (recGblSetSevr(pxxx,LOW_ALARM,pxxx->lsv)) pxxx->lalm = low; + return; + } + + /* we get here only if val is out of alarm by at least hyst */ + pxxx->lalm = val; + return; +} + +static void monitor(xxxRecord *pxxx) +{ + unsigned short monitor_mask; + double delta; + + monitor_mask = recGblResetAlarms(pxxx); + /* check for value change */ + delta = pxxx->mlst - pxxx->val; + if(delta<0.0) delta = -delta; + if (delta > pxxx->mdel) { + /* post events for value change */ + monitor_mask |= DBE_VALUE; + /* update last value monitored */ + pxxx->mlst = pxxx->val; + } + + /* check for archive change */ + delta = pxxx->alst - pxxx->val; + if(delta<0.0) delta = -delta; + if (delta > pxxx->adel) { + /* post events on value field for archive change */ + monitor_mask |= DBE_LOG; + /* update last archive value monitored */ + pxxx->alst = pxxx->val; + } + + /* send out monitors connected to the value field */ + if (monitor_mask){ + db_post_events(pxxx,&pxxx->val,monitor_mask); + } + return; +} diff --git a/src/makeBaseApp/top/exampleApp/src/xxxRecord.dbd b/src/makeBaseApp/top/exampleApp/src/xxxRecord.dbd new file mode 100644 index 000000000..4a71c5409 --- /dev/null +++ b/src/makeBaseApp/top/exampleApp/src/xxxRecord.dbd @@ -0,0 +1,117 @@ +recordtype(xxx) { + include "dbCommon.dbd" + field(VAL,DBF_DOUBLE) { + prompt("Current EGU Value") + asl(ASL0) + pp(TRUE) + } + field(INP,DBF_INLINK) { + prompt("Input Specification") + promptgroup(GUI_INPUTS) + special(SPC_NOMOD) + interest(1) + } + field(PREC,DBF_SHORT) { + prompt("Display Precision") + promptgroup(GUI_DISPLAY) + interest(1) + } + field(EGU,DBF_STRING) { + prompt("Engineering Units") + promptgroup(GUI_DISPLAY) + interest(1) + size(16) + } + field(HOPR,DBF_FLOAT) { + prompt("High Operating Range") + promptgroup(GUI_DISPLAY) + interest(1) + } + field(LOPR,DBF_FLOAT) { + prompt("Low Operating Range") + promptgroup(GUI_DISPLAY) + interest(1) + } + field(HIHI,DBF_FLOAT) { + prompt("Hihi Alarm Limit") + promptgroup(GUI_ALARMS) + pp(TRUE) + interest(1) + } + field(LOLO,DBF_FLOAT) { + prompt("Lolo Alarm Limit") + promptgroup(GUI_ALARMS) + pp(TRUE) + interest(1) + } + field(HIGH,DBF_FLOAT) { + prompt("High Alarm Limit") + promptgroup(GUI_ALARMS) + pp(TRUE) + interest(1) + } + field(LOW,DBF_FLOAT) { + prompt("Low Alarm Limit") + promptgroup(GUI_ALARMS) + pp(TRUE) + interest(1) + } + field(HHSV,DBF_MENU) { + prompt("Hihi Severity") + promptgroup(GUI_ALARMS) + pp(TRUE) + interest(1) + menu(menuAlarmSevr) + } + field(LLSV,DBF_MENU) { + prompt("Lolo Severity") + promptgroup(GUI_ALARMS) + pp(TRUE) + interest(1) + menu(menuAlarmSevr) + } + field(HSV,DBF_MENU) { + prompt("High Severity") + promptgroup(GUI_ALARMS) + pp(TRUE) + interest(1) + menu(menuAlarmSevr) + } + field(LSV,DBF_MENU) { + prompt("Low Severity") + promptgroup(GUI_ALARMS) + pp(TRUE) + interest(1) + menu(menuAlarmSevr) + } + field(HYST,DBF_DOUBLE) { + prompt("Alarm Deadband") + promptgroup(GUI_ALARMS) + interest(1) + } + field(ADEL,DBF_DOUBLE) { + prompt("Archive Deadband") + promptgroup(GUI_DISPLAY) + interest(1) + } + field(MDEL,DBF_DOUBLE) { + prompt("Monitor Deadband") + promptgroup(GUI_DISPLAY) + interest(1) + } + field(LALM,DBF_DOUBLE) { + prompt("Last Value Alarmed") + special(SPC_NOMOD) + interest(3) + } + field(ALST,DBF_DOUBLE) { + prompt("Last Value Archived") + special(SPC_NOMOD) + interest(3) + } + field(MLST,DBF_DOUBLE) { + prompt("Last Val Monitored") + special(SPC_NOMOD) + interest(3) + } +} diff --git a/src/makeBaseApp/top/iocBoot/Makefile b/src/makeBaseApp/top/exampleBoot/Makefile similarity index 100% rename from src/makeBaseApp/top/iocBoot/Makefile rename to src/makeBaseApp/top/exampleBoot/Makefile diff --git a/src/makeBaseApp/top/exampleBoot/ioc/Makefile b/src/makeBaseApp/top/exampleBoot/ioc/Makefile new file mode 100644 index 000000000..9b94f08d1 --- /dev/null +++ b/src/makeBaseApp/top/exampleBoot/ioc/Makefile @@ -0,0 +1,4 @@ +TOP = ../.. +include $(TOP)/config/CONFIG_APP +ARCH = _ARCH_ +include $(TOP)/config/RULES.ioc diff --git a/src/makeBaseApp/top/exampleBoot/ioc/st.cmd b/src/makeBaseApp/top/exampleBoot/ioc/st.cmd new file mode 100644 index 000000000..091d966fd --- /dev/null +++ b/src/makeBaseApp/top/exampleBoot/ioc/st.cmd @@ -0,0 +1,17 @@ +# Example vxWorks startup file + +# Following must be added for many board support packages +#cd + +< cdcmds + +cd appbin +ld < iocCore +ld < seq +ld < exampleLib + +cd startup +dbLoadDatabase("../../dbd/exampleApp.dbd") +dbLoadRecords("../../exampleApp/Db/dbExample.db","user=_USER_") +iocInit +seq &snctest diff --git a/src/makeBaseApp/top/iocBoot/nfsCommands b/src/makeBaseApp/top/exampleBoot/nfsCommands similarity index 100% rename from src/makeBaseApp/top/iocBoot/nfsCommands rename to src/makeBaseApp/top/exampleBoot/nfsCommands diff --git a/src/makeBaseApp/top/iocBoot/README b/src/makeBaseApp/top/iocBoot/README new file mode 100644 index 000000000..86065da02 --- /dev/null +++ b/src/makeBaseApp/top/iocBoot/README @@ -0,0 +1 @@ +This directory tree is obsolete diff --git a/src/makeBaseApp/top/simpleApp/Db/Makefile b/src/makeBaseApp/top/simpleApp/Db/Makefile new file mode 100644 index 000000000..9f0d2a6d3 --- /dev/null +++ b/src/makeBaseApp/top/simpleApp/Db/Makefile @@ -0,0 +1,4 @@ +TOP = ../.. +include $(TOP)/config/CONFIG_APP + +include $(TOP)/config/RULES.Db diff --git a/src/makeBaseApp/top/simpleApp/Makefile b/src/makeBaseApp/top/simpleApp/Makefile new file mode 100644 index 000000000..a146d299f --- /dev/null +++ b/src/makeBaseApp/top/simpleApp/Makefile @@ -0,0 +1,6 @@ +TOP = .. +include $(TOP)/config/CONFIG_APP +DIRS += $(wildcard *src*) +DIRS += $(wildcard *Src*) +DIRS += $(wildcard *Db*) +include $(TOP)/config/RULES_DIRS diff --git a/src/makeBaseApp/top/simpleApp/src/Makefile b/src/makeBaseApp/top/simpleApp/src/Makefile new file mode 100644 index 000000000..0380f4bf8 --- /dev/null +++ b/src/makeBaseApp/top/simpleApp/src/Makefile @@ -0,0 +1,3 @@ +TOP=../.. +include $(TOP)/config/CONFIG_APP +include $(TOP)/config/RULES_ARCHS diff --git a/src/makeBaseApp/top/simpleApp/src/Makefile.Host b/src/makeBaseApp/top/simpleApp/src/Makefile.Host new file mode 100644 index 000000000..5e3de7084 --- /dev/null +++ b/src/makeBaseApp/top/simpleApp/src/Makefile.Host @@ -0,0 +1,18 @@ +# Makefile.Host +TOP = ../../.. +include $(TOP)/config/CONFIG_APP +#---------------------------------------- +# ADD MACRO DEFINITIONS AFTER THIS LINE + +#USR_CFLAGS += +PROD_LIBS += ca +PROD_LIBS += Db +PROD_LIBS += Com +ca_DIR = $(EPICS_BASE_LIB) +Db_DIR = $(EPICS_BASE_LIB) +Com_DIR = $(EPICS_BASE_LIB) + + +include $(TOP)/config/RULES.Host +#---------------------------------------- +# ADD RULES AFTER THIS LINE diff --git a/src/makeBaseApp/top/simpleApp/src/Makefile.Vx b/src/makeBaseApp/top/simpleApp/src/Makefile.Vx new file mode 100644 index 000000000..47b379665 --- /dev/null +++ b/src/makeBaseApp/top/simpleApp/src/Makefile.Vx @@ -0,0 +1,13 @@ +# Makefile.Vx +TOP = ../../.. +include $(TOP)/config/CONFIG_APP +#---------------------------------------- +# ADD MACRO DEFINITIONS AFTER THIS LINE + + +#Note that the command line that builds the +#library $(LIBNAME) may be HUGE (>3kB) +# +include $(TOP)/config/RULES.Vx +#---------------------------------------- +# ADD RULES AFTER THIS LINE diff --git a/src/makeBaseApp/top/simpleBoot/Makefile b/src/makeBaseApp/top/simpleBoot/Makefile new file mode 100644 index 000000000..d64511f37 --- /dev/null +++ b/src/makeBaseApp/top/simpleBoot/Makefile @@ -0,0 +1,4 @@ +TOP = .. +include $(TOP)/config/CONFIG_APP +DIRS += $(wildcard *ioc*) +include $(TOP)/config/RULES.iocBoot diff --git a/src/makeBaseApp/top/simpleBoot/ioc/Makefile b/src/makeBaseApp/top/simpleBoot/ioc/Makefile new file mode 100644 index 000000000..9b94f08d1 --- /dev/null +++ b/src/makeBaseApp/top/simpleBoot/ioc/Makefile @@ -0,0 +1,4 @@ +TOP = ../.. +include $(TOP)/config/CONFIG_APP +ARCH = _ARCH_ +include $(TOP)/config/RULES.ioc diff --git a/src/makeBaseApp/top/simpleBoot/ioc/st.cmd b/src/makeBaseApp/top/simpleBoot/ioc/st.cmd new file mode 100644 index 000000000..e36627039 --- /dev/null +++ b/src/makeBaseApp/top/simpleBoot/ioc/st.cmd @@ -0,0 +1,16 @@ +# Example vxWorks startup file +#Following must be added for many board support packages +#cd + +< cdcmds + +cd appbin +ld < iocCore +ld < seq +#ld < Lib + +cd startup +#dbLoadDatabase("../../dbd/App.dbd") +#dbLoadRecords("../../App/Db/dbExample.db") +iocInit +#seq & diff --git a/src/makeBaseApp/top/simpleBoot/nfsCommands b/src/makeBaseApp/top/simpleBoot/nfsCommands new file mode 100644 index 000000000..acafd577a --- /dev/null +++ b/src/makeBaseApp/top/simpleBoot/nfsCommands @@ -0,0 +1,28 @@ +#Instructions for creating and using a real nfsCommands file +# +# in order to use nfs do the following: +# 1) Create hostAdd and nfsMountAll commands for each nfs server +# 2) In each st.cmd file add the following two commands BEFORE any load commands +# ../nfs.cmd +# cd " +# +# The hostAdd and nfsMountAll commands have the form: +# hostAdd("","xxx.xxx.xxx.xxx") +# nfsMountAll("") +# +# You can also mount subdirectories as follows: +# nfsMount("", "/xxx/xxx/xxx", "/xxx") +# +# For example assume +# +# host is mercury with inet address 155.77.2.56 +# You want to mount the directory (which is a file system of mercury) +# /home/mercury5/iocinfo +# as +# /iocinfo +# +# The commands would be +# +# hostAdd("mercury","155.77.2.56") +# nfsMountAll("mercury") +# nfsMount("mercury","/home/mercury5/iocinfo","/iocinfo")