Skip to content
Snippets Groups Projects
Commit 5ea69d8f authored by Whitney Armstrong's avatar Whitney Armstrong
Browse files

new file: make_pydevsup_ioc

	new file:   templates/counters.db
	new file:   templates/user.substitutions
parent bd0585f2
Branches
No related tags found
No related merge requests found
#!/bin/bash
set -o nounset
set -o errexit
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
echo $DIR
function print_the_help {
echo "USAGE: make_scpi_ioc -n NAME "
echo " OPTIONS: "
echo " -n,--name NAME IOC name (must begin with letter)"
exit
}
function yes_or_no {
while true; do
read -p "$* [y/n]: " yn
case $yn in
[Yy]*) return 0 ;;
[Nn]*) echo "No entered" ; return 1 ;;
esac
done
}
NAME=
#if [[ $# -eq 0 ]] ; then
# print_the_help
# exit
#fi
POSITIONAL=()
while [[ $# -gt 0 ]]
do
key="$1"
case $key in
-h|--help)
shift # past argument
print_the_help
;;
-n|--name)
NAME="$2"
shift # past argument
shift # past value
;;
#-a|--all)
# LOG_ALL_PLOTS=1
# shift # past argument
# #shift # past value
# ;;
#-o|--online-only)
# ONLINE_ONLY=1
# shift # past argument
# #shift # past value
# ;;
*) # unknown option
#POSITIONAL+=("$1") # save it in an array for later
echo "unknown option $1"
print_the_help
shift # past argument
;;
esac
done
set -- "${POSITIONAL[@]}" # restore positional parameters
if [[ -z "${NAME}" ]] ; then
echo "Error: ioc NAME must be supplied"
print_the_help
exit
fi
if [ -d "${NAME}" ]
then
echo "Directory ${NAME} exists."
echo "Error: cannot overrite ${NAME}"
else
echo "Making directory ${NAME}"
mkdir "${NAME}"
fi
cd "${NAME}"
#makeSupport.pl -t streamSCPI ${NAME}
#rm -r configure
makeBaseApp.pl -t ioc ${NAME}
makeBaseApp.pl -i -t ioc ${NAME}
sed -i '29iPYDEVSUP = /opt/epics/extensions' configure/RELEASE
sed -i '43iPY_VER ?= 2.7' configure/CONFIG_SITE
sed -i '7iinclude $(PYDEVSUP)/configure/CONFIG_PY' ${NAME}App/src/Makefile
sed -i '18iPY += counter3.py' ${NAME}App/src/Makefile
sed -i '18iPY += counter2.py' ${NAME}App/src/Makefile
sed -i '18iPY += counter1.py' ${NAME}App/src/Makefile
sed -i "24i${NAME}_DBD += pyDevSup.dbd" ${NAME}App/src/Makefile
sed -i "28i${NAME}_LIBS += pyDevSup\$(PY_LD_VER)" ${NAME}App/src/Makefile
sed -i '48iinclude $(PYDEVSUP)/configure/RULES_PY' ${NAME}App/src/Makefile
sed -i '24iPYTHON ?= python' configure/CONFIG_SITE
sed -i '11iDB += user.substitutions' ${NAME}App/Db/Makefile
sed -i '11iDB += counters.db' ${NAME}App/Db/Makefile
sed -i '16idbLoadTemplate "db/user.substitutions"' iocBoot/ioc${NAME}/st.cmd
chmod +x iocBoot/ioc${NAME}/st.cmd
#sed -i '29iSTREAM = /opt/epics/synApps/support/stream' configure/RELEASE
#sed -i '29iASYN = /opt/epics/synApps/support/asyn' configure/RELEASE
#
## fix the install ...
#sed -i '6d' ${NAME}Sup/Makefile
#sed -i "6iDB_INSTALLS += \$\(TOP\)/${NAME}Sup/dev${NAME}.db" ${NAME}Sup/Makefile
#
#sed -i "17i${NAME}test_DBD += drvVxi11.dbd" ${NAME}testApp/src/Makefile
#sed -i "17i${NAME}test_DBD += calc.dbd" ${NAME}testApp/src/Makefile
#sed -i "17i${NAME}test_DBD += stream.dbd" ${NAME}testApp/src/Makefile
##sed -i "17i${NAME}test_DBD += stream.dbd" ${NAME}testApp/src/Makefile
#
#sed -i "39i${NAME}test_LIBS += stream asyn calc" ${NAME}testApp/src/Makefile
#
cat > ${NAME}App/src/counter1.py << EOF
import time
#import piplates.DAQCplate as DAQC
#import RPi.GPIO as GPIO
from threading import Thread
from time import sleep
stop_threads = False
total_count = 0
#https://pi-plates.com/daqc-users-guide/
def buttonINT(channel):
global total_count
#time.sleep(.01) #debounce button before clearing interrupt
#DAQC.getINTflags(0) #clear the interrupt
total_count = total_count +1
def do_counting(stop):
#GPIO.setup(27, GPIO.IN)
#GPIO.add_event_detect(27, GPIO.RISING, callback=buttonINT)
#GPIO.setup(22, GPIO.IN, pull_up_down=GPIO.PUD_UP)
#GPIO.add_event_detect(22, GPIO.FALLING, callback=buttonINT)
#DAQC.enableSWint(0) # switch interrupt DAQC.intEnable(0)
#DAQC.intEnable(0)
try:
while(1): #Cycle the LEDs on in the foreground
for i in range(0,7):
#DAQC.setDOUTbit(0,i) #turn on a single LED
time.sleep(.1) #wait for 100msec
#DAQC.clrDOUTbit(0,i) #turn off the LED and go to the next one
#wait for it...
if stop():
break
except KeyboardInterrupt:
#GPIO.cleanup() # clean up GPIO on CTRL+C exit
print('cleanup')
class MySupport:
def __init__(self, rec, link):
self.count = 0
self.count_thread = Thread(target = do_counting, args =(lambda : stop_threads, ))
self.count_thread.start()
def do_count(self,channel):
#DAQC.getINTflags(0) #clear the interrupt
self.count = self.count + 1
def detach(self, rec):
global stop_threads
stop_threads=True
self.count_thread.join()
print("thread finished...exiting")
def process(self, rec, reason):
global total_count
#buttonINT(0)
#self.count = self.count + 1
rec.VAL = int(total_count)
total_count = 0
build = MySupport
EOF
cp ${NAME}App/src/counter1.py ${NAME}App/src/counter2.py
cp ${NAME}App/src/counter1.py ${NAME}App/src/counter3.py
cp ${DIR}/templates/counters.db ${NAME}App/Db/.
cp ${DIR}/templates/user.substitutions ${NAME}App/Db/.
#cat > iocBoot/ioc${NAME}/st.cmd << EOF
##!../../bin/linux-x86_64/${NAME}test
#
##- You may have to change ${NAME}test to something else
##- everywhere it appears in this file
#
#< envPaths
#epicsEnvSet ("STREAM_PROTOCOL_PATH", ".:\$(TOP)/db:../protocols")
#
## Allow PV name prefixes and serial port name to be set from the environment
#epicsEnvSet "P" "\$(P=${NAME})"
#epicsEnvSet "R" "\$(R=test)"
##epicsEnvSet "TTY" "\$(TTY=/dev/tty.PL2303-000013FA)"
#
#cd "\${TOP}"
#
### Register all support components
#dbLoadDatabase "dbd/${NAME}test.dbd"
#${NAME}test_registerRecordDeviceDriver pdbbase
#
#vxi11Configure ("L0","10.10.241.61",1,1000,"inst0",0)
#
### Load record instances
#dbLoadRecords("db/dev${NAME}.db","P=\$(P),R=\$(R),PORT=L0,A=0")
#
#cd "\${TOP}/iocBoot/\${IOC}"
#iocInit
#
### Start any sequence programs
##seq sncxxx,"user=you"
#EOF
record(longin, "$(dev):c$(num):Count") {
field(DTYP, "Python Device")
field(INP , "@counter$(num)")
field(SCAN, "2 second")
#field(FLNK, "$(dev):c$(num):TotalCount")
}
record(calc, "$(dev):c$(num):TotalCount") {
#field(SCAN,"Passive")
field(SCAN, "2 second")
#field(VAL, "0")
field(INPA, "$(dev):c$(num):Count PP")
field(INPB, "$(dev):c$(num):TotalCount.VAL PP")
field(CALC, "A")
field(PREC, "9")
}
record(longin, "$(dev):c$(num):IsCounting") {
field(DESC, "counter is counting")
field(DTYP, "Soft Channel")
field(SCAN, "Passive")
field(VAL, "1")
}
record(longin, "$(dev):c$(num):TimeInterval") {
field(DESC, "time interval seconds")
field(DTYP, "Soft Channel")
field(SCAN, "Passive")
field(VAL, "60")
}
record(calc, "$(dev):c$(num):TotalTime") {
field(SCAN,"2 second")
field(INPA, "$(dev):c$(num):IsCounting PP")
field(INPB, "$(dev):c$(num):TotalTime.VAL PP")
field(CALC, "(A>0) ? (2.0 + B) : B")
field(PREC, "9")
}
record(calc, "$(dev):c$(num):TotalRate") {
field(SCAN,"2 second")
field(INPA, "$(dev):c$(num):TotalTime PP")
field(INPB, "$(dev):c$(num):TotalCount PP")
field(CALC, "B/A")
field(PREC, "4")
}
record(longin, "$(dev):c$(num):Reset") {
field(DESC, "Initiate counter reset")
field(DTYP, "Soft Channel")
field(SCAN, "Passive")
field(VAL, "0")
}
record(calcout, "$(dev):c$(num):DoReset") {
field(OOPT, "On Change")
field(DOPT, "Use OCAL") # to set OUT
field(OUT, "$(dev):c$(num):Reset CA")
field(INPA, "$(dev):c$(num):Reset CP")
field(CALC, "A")
field(OCAL, "0")
field(PREC, "4")
field(FLNK, "$(dev):c$(num):ResetTotalTime")
}
record(calcout, "$(dev):c$(num):ResetTotalTime") {
field(OOPT, "Every Time")
field(OUT, "$(dev):c$(num):TotalTime CA")
field(INPA, "$(dev):c$(num):TotalTime PP")
field(CALC, "0.000001")
}
# Example substitutions file
#file "db/counters.db" {
# { user = "whit" }
#}
#
#file "db/dbExample1.db" {
# { user = "whit" }
#}
file db/counters.db {
pattern { dev, num, scan }
{ "daq", 1, "1 second" }
{ "daq", 2, "2 second" }
{ "daq", 3, "5 second" }
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment