forked from epics_driver_modules/motorBase
Merge branch 'master' of github.com:epics-modules/motor
This commit is contained in:
commit
d827ae8a51
83 files changed
+2100
-7
No files matched your search
Executable
+164
@@ -0,0 +1,164 @@
|
||||
#!/bin/sh
|
||||
set -e -x
|
||||
|
||||
SUPPORT=$HOME/.cache/support
|
||||
|
||||
install -d $SUPPORT
|
||||
|
||||
# Conditionally build IPAC
|
||||
if [ -n "$IPAC" ]; then
|
||||
IPAC_PATH=$SUPPORT/ipac
|
||||
else
|
||||
IPAC_PATH=
|
||||
fi
|
||||
|
||||
RELEASE_PATH=$TRAVIS_BUILD_DIR/configure/RELEASE
|
||||
EPICS_BASE=$SUPPORT/epics-base
|
||||
|
||||
cat << EOF > $RELEASE_PATH
|
||||
IPAC=$IPAC_PATH
|
||||
SNCSEQ=$SUPPORT/seq
|
||||
ASYN=$SUPPORT/asyn
|
||||
EPICS_BASE=$SUPPORT/epics-base
|
||||
EOF
|
||||
|
||||
# use default selection for MSI
|
||||
sed -i -e '/MSI/d' configure/CONFIG_SITE
|
||||
|
||||
if [ ! -e "$EPICS_BASE/built" ]
|
||||
then
|
||||
|
||||
git clone --depth 10 --branch $BASE https://github.com/epics-base/epics-base.git $EPICS_BASE
|
||||
|
||||
EPICS_HOST_ARCH=`sh $EPICS_BASE/startup/EpicsHostArch`
|
||||
|
||||
case "$STATIC" in
|
||||
static)
|
||||
cat << EOF >> "$EPICS_BASE/configure/CONFIG_SITE"
|
||||
SHARED_LIBRARIES=NO
|
||||
STATIC_BUILD=YES
|
||||
EOF
|
||||
;;
|
||||
*) ;;
|
||||
esac
|
||||
|
||||
case "$CMPLR" in
|
||||
clang)
|
||||
echo "Host compiler is clang"
|
||||
cat << EOF >> $EPICS_BASE/configure/os/CONFIG_SITE.Common.$EPICS_HOST_ARCH
|
||||
GNU = NO
|
||||
CMPLR_CLASS = clang
|
||||
CC = clang
|
||||
CCC = clang++
|
||||
EOF
|
||||
;;
|
||||
*) echo "Host compiler is default";;
|
||||
esac
|
||||
|
||||
# requires wine and g++-mingw-w64-i686
|
||||
if [ "$WINE" = "32" ]
|
||||
then
|
||||
echo "Cross mingw32"
|
||||
sed -i -e '/CMPLR_PREFIX/d' $EPICS_BASE/configure/os/CONFIG_SITE.linux-x86.win32-x86-mingw
|
||||
cat << EOF >> $EPICS_BASE/configure/os/CONFIG_SITE.linux-x86.win32-x86-mingw
|
||||
CMPLR_PREFIX=i686-w64-mingw32-
|
||||
EOF
|
||||
cat << EOF >> $EPICS_BASE/configure/CONFIG_SITE
|
||||
CROSS_COMPILER_TARGET_ARCHS+=win32-x86-mingw
|
||||
EOF
|
||||
fi
|
||||
|
||||
# set RTEMS to eg. "4.9" or "4.10"
|
||||
if [ -n "$RTEMS" ]
|
||||
then
|
||||
echo "Cross RTEMS${RTEMS} for pc386"
|
||||
install -d /home/travis/.cache
|
||||
curl -L "https://github.com/mdavidsaver/rsb/releases/download/travis-20160306-2/rtems${RTEMS}-i386-trusty-20190306-2.tar.gz" \
|
||||
| tar -C /home/travis/.cache -xj
|
||||
|
||||
sed -i -e '/^RTEMS_VERSION/d' -e '/^RTEMS_BASE/d' $EPICS_BASE/configure/os/CONFIG_SITE.Common.RTEMS
|
||||
cat << EOF >> $EPICS_BASE/configure/os/CONFIG_SITE.Common.RTEMS
|
||||
RTEMS_VERSION=$RTEMS
|
||||
RTEMS_BASE=/home/travis/.cache/rtems${RTEMS}-i386
|
||||
EOF
|
||||
cat << EOF >> $EPICS_BASE/configure/CONFIG_SITE
|
||||
CROSS_COMPILER_TARGET_ARCHS+=RTEMS-pc386
|
||||
EOF
|
||||
|
||||
fi
|
||||
|
||||
make -C "$EPICS_BASE" -j2
|
||||
# get MSI for 3.14
|
||||
case "$BASE" in
|
||||
3.14*)
|
||||
echo "Build MSI"
|
||||
install -d "$HOME/msi/extensions/src"
|
||||
curl https://www.aps.anl.gov/epics/download/extensions/extensionsTop_20120904.tar.gz | tar -C "$HOME/msi" -xvz
|
||||
curl https://www.aps.anl.gov/epics/download/extensions/msi1-7.tar.gz | tar -C "$HOME/msi/extensions/src" -xvz
|
||||
mv "$HOME/msi/extensions/src/msi1-7" "$HOME/msi/extensions/src/msi"
|
||||
|
||||
cat << EOF > "$HOME/msi/extensions/configure/RELEASE"
|
||||
EPICS_BASE=$EPICS_BASE
|
||||
EPICS_EXTENSIONS=\$(TOP)
|
||||
EOF
|
||||
make -C "$HOME/msi/extensions"
|
||||
cp "$HOME/msi/extensions/bin/$EPICS_HOST_ARCH/msi" "$EPICS_BASE/bin/$EPICS_HOST_ARCH/"
|
||||
echo 'MSI:=$(EPICS_BASE)/bin/$(EPICS_HOST_ARCH)/msi' >> "$EPICS_BASE/configure/CONFIG_SITE"
|
||||
|
||||
cat <<EOF >> configure/CONFIG_SITE
|
||||
MSI = \$(EPICS_BASE)/bin/\$(EPICS_HOST_ARCH)/msi
|
||||
EOF
|
||||
|
||||
;;
|
||||
*) echo "Use MSI from Base"
|
||||
;;
|
||||
esac
|
||||
|
||||
touch $EPICS_BASE/built
|
||||
else
|
||||
echo "Using cached epics-base!"
|
||||
fi
|
||||
|
||||
# IPAC
|
||||
if [ -n "$IPAC" ]; then
|
||||
if [ ! -e "$SUPPORT/ipac/built" ]; then
|
||||
echo "Build ipac"
|
||||
install -d $SUPPORT/ipac
|
||||
git clone --depth 10 --branch $IPAC https://github.com/epics-modules/ipac.git $SUPPORT/ipac
|
||||
cat << EOF > $SUPPORT/ipac/configure/RELEASE
|
||||
EPICS_BASE=$SUPPORT/epics-base
|
||||
EOF
|
||||
make -C $SUPPORT/ipac
|
||||
touch $SUPPORT/ipac/built
|
||||
else
|
||||
echo "Using cached ipac"
|
||||
fi
|
||||
else
|
||||
echo "Skipping ipac"
|
||||
fi
|
||||
|
||||
|
||||
# sequencer
|
||||
if [ ! -e "$SUPPORT/seq/built" ]; then
|
||||
echo "Build sequencer"
|
||||
install -d $SUPPORT/seq
|
||||
curl -L "http://www-csr.bessy.de/control/SoftDist/sequencer/releases/seq-${SEQ}.tar.gz" | tar -C $SUPPORT/seq -xvz --strip-components=1
|
||||
cp $RELEASE_PATH $SUPPORT/seq/configure/RELEASE
|
||||
make -C $SUPPORT/seq
|
||||
touch $SUPPORT/seq/built
|
||||
else
|
||||
echo "Using cached seq"
|
||||
fi
|
||||
|
||||
|
||||
# asyn
|
||||
if [ ! -e "$SUPPORT/asyn/built" ]; then
|
||||
echo "Build asyn"
|
||||
install -d $SUPPORT/asyn
|
||||
curl -L "https://www.aps.anl.gov/epics/download/modules/asyn${ASYN}.tar.gz" | tar -C $SUPPORT/asyn -xvz --strip-components=1
|
||||
cp $RELEASE_PATH $SUPPORT/asyn/configure/RELEASE
|
||||
make -C "$SUPPORT/asyn" -j2
|
||||
touch $SUPPORT/asyn/built
|
||||
else
|
||||
echo "Using cached asyn"
|
||||
fi
|
||||
+27
@@ -0,0 +1,27 @@
|
||||
sudo: false
|
||||
dist: trusty
|
||||
language: c
|
||||
compiler:
|
||||
- gcc
|
||||
cache:
|
||||
directories:
|
||||
- $HOME/.cache
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- libreadline6-dev
|
||||
- libncurses5-dev
|
||||
- perl
|
||||
- clang
|
||||
- g++-mingw-w64-i686
|
||||
- re2c
|
||||
env:
|
||||
- BASE=3.14 STATIC=shared SEQ=2.2.4 ASYN=4-31 IPAC=2.14
|
||||
- BASE=3.14 STATIC=static SEQ=2.2.4 ASYN=4-31 IPAC=2.14
|
||||
- BASE=3.15 STATIC=shared SEQ=2.2.4 ASYN=4-31 IPAC=2.14
|
||||
- BASE=3.15 STATIC=static SEQ=2.2.4 ASYN=4-31 IPAC=2.14
|
||||
- BASE=3.16 STATIC=shared RTEMS=4.10 SEQ=2.2.4 ASYN=4-31 IPAC=2.14
|
||||
- BASE=3.16 STATIC=shared CMPLR=clang WINE=32 SEQ=2.2.4 ASYN=4-31 IPAC=
|
||||
- BASE=3.16 STATIC=static WINE=32 SEQ=2.2.4 ASYN=4-31 IPAC=
|
||||
install: ./.ci/travis-prepare.sh
|
||||
script: make
|
||||
@@ -786,7 +786,7 @@ static long postProcess(motorRecord * pmr)
|
||||
double vbase = pmr->vbas / fabs(pmr->mres);
|
||||
double hpos = 0;
|
||||
double hvel = pmr->hvel / fabs(pmr->mres);
|
||||
double acc = (hvel - vbase) / pmr->accl;
|
||||
double acc = (hvel - vbase) > 0 ? ((hvel - vbase)/ pmr->accl): (hvel / pmr->accl);
|
||||
|
||||
motor_cmnd command;
|
||||
|
||||
@@ -858,7 +858,7 @@ static long postProcess(motorRecord * pmr)
|
||||
|
||||
if (pmr->mip & MIP_JOG_STOP)
|
||||
{
|
||||
double acc = (vel - vbase) / pmr->accl;
|
||||
double acc = (vel - vbase) > 0 ? ((vel - vbase)/ pmr->accl) : (vel / pmr->accl);
|
||||
|
||||
if (vel <= vbase)
|
||||
vel = vbase + 1;
|
||||
@@ -875,7 +875,7 @@ static long postProcess(motorRecord * pmr)
|
||||
else
|
||||
{
|
||||
double bvel = pmr->bvel / fabs(pmr->mres);
|
||||
double bacc = (bvel - vbase) / pmr->bacc;
|
||||
double bacc = (bvel - vbase) > 0 ? ((bvel - vbase)/ pmr->bacc) : (bvel / pmr->bacc);
|
||||
|
||||
if (bvel <= vbase)
|
||||
bvel = vbase + 1;
|
||||
@@ -911,7 +911,7 @@ static long postProcess(motorRecord * pmr)
|
||||
/* First part of jog done. Do backlash correction. */
|
||||
double bvel = pmr->bvel / fabs(pmr->mres);
|
||||
double vbase = pmr->vbas / fabs(pmr->mres);
|
||||
double bacc = (bvel - vbase) / pmr->bacc;
|
||||
double bacc = (bvel - vbase) > 0 ? ((bvel - vbase)/ pmr->bacc) : (bvel / pmr->bacc);
|
||||
double bpos = (pmr->dval - pmr->bdst) / pmr->mres;
|
||||
|
||||
/* Use if encoder or ReadbackLink is in use. */
|
||||
@@ -1935,7 +1935,7 @@ static RTN_STATUS do_work(motorRecord * pmr, CALLBACK_VALUE proc_ind)
|
||||
|
||||
vbase = pmr->vbas / fabs(pmr->mres);
|
||||
hvel = pmr->hvel / fabs(pmr->mres);
|
||||
acc = (hvel - vbase) / pmr->accl;
|
||||
acc = (hvel - vbase) > 0 ? ((hvel - vbase) / pmr->accl) : (hvel / pmr->accl);
|
||||
hpos = 0;
|
||||
|
||||
INIT_MSG();
|
||||
@@ -2147,13 +2147,13 @@ static RTN_STATUS do_work(motorRecord * pmr, CALLBACK_VALUE proc_ind)
|
||||
double newpos = pmr->dval / pmr->mres; /* where to go */
|
||||
double vbase = pmr->vbas / fabs(pmr->mres); /* base speed */
|
||||
double vel = pmr->velo / fabs(pmr->mres); /* normal speed */
|
||||
double acc = (vel - vbase) / pmr->accl; /* normal accel. */
|
||||
double acc = (vel - vbase) > 0 ? ((vel - vbase) / pmr->accl) : (vel / pmr->accl); /* normal accel. */
|
||||
/*
|
||||
* 'bpos' is one backlash distance away from 'newpos'.
|
||||
*/
|
||||
double bpos = (pmr->dval - pmr->bdst) / pmr->mres;
|
||||
double bvel = pmr->bvel / fabs(pmr->mres); /* backlash speed */
|
||||
double bacc = (bvel - vbase) / pmr->bacc; /* backlash accel. */
|
||||
double bacc = (bvel - vbase) > 0 ? ((bvel - vbase) / pmr->bacc) : (bvel / pmr->bacc); /* backlash accel. */
|
||||
bool use_rel, preferred_dir, too_small;
|
||||
double relpos = pmr->diff / pmr->mres;
|
||||
double relbpos = ((pmr->dval - pmr->bdst) - pmr->drbv) / pmr->mres;
|
||||
|
||||
@@ -19,6 +19,7 @@ SRCS += devPIC862.cc drvPIC862.cc PIC862Register.cc
|
||||
SRCS += devPIC663.cc drvPIC663.cc PIC663Register.cc
|
||||
SRCS += devPIE710.cc drvPIE710.cc PIE710Register.cc
|
||||
SRCS += devPIE516.cc drvPIE516.cc PIE516Register.cc
|
||||
SRCS += devPIE517.cc drvPIE517.cc PIE517Register.cc
|
||||
SRCS += devPIE816.cc drvPIE816.cc PIE816Register.cc
|
||||
|
||||
|
||||
|
||||
Executable
+68
@@ -0,0 +1,68 @@
|
||||
/*
|
||||
FILENAME... PIE517Register.cc
|
||||
USAGE... Register PI motor device driver shell commands.
|
||||
|
||||
Version: $Revision: 1.1 $
|
||||
Modified By: $Author: sullivan $
|
||||
Last Modified: $Date: 2007-03-30 20:01:05 $
|
||||
*/
|
||||
|
||||
/*****************************************************************
|
||||
COPYRIGHT NOTIFICATION
|
||||
*****************************************************************
|
||||
|
||||
(C) COPYRIGHT 1993 UNIVERSITY OF CHICAGO
|
||||
|
||||
This software was developed under a United States Government license
|
||||
described on the COPYRIGHT_UniversityOfChicago file included as part
|
||||
of this distribution.
|
||||
**********************************************************************/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stddef.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <iocsh.h>
|
||||
#include "motor.h"
|
||||
#include "drvPIE517.h"
|
||||
#include "epicsExport.h"
|
||||
|
||||
extern "C"
|
||||
{
|
||||
|
||||
// Pi Setup arguments
|
||||
static const iocshArg setupArg0 = {"Max. controller count", iocshArgInt};
|
||||
static const iocshArg setupArg1 = {"Polling rate", iocshArgInt};
|
||||
// Pi Config arguments
|
||||
static const iocshArg configArg0 = {"Card being configured", iocshArgInt};
|
||||
static const iocshArg configArg1 = {"asyn port name", iocshArgString};
|
||||
static const iocshArg configArg2 = {"asyn address (GPIB)", iocshArgInt};
|
||||
|
||||
static const iocshArg * const PIE517SetupArgs[2] = {&setupArg0, &setupArg1};
|
||||
static const iocshArg * const PIE517ConfigArgs[3] = {&configArg0, &configArg1,
|
||||
&configArg2};
|
||||
|
||||
static const iocshFuncDef setupPIE517 = {"PIE517Setup", 2, PIE517SetupArgs};
|
||||
static const iocshFuncDef configPIE517 = {"PIE517Config", 3, PIE517ConfigArgs};
|
||||
|
||||
static void setupPIE517CallFunc(const iocshArgBuf *args)
|
||||
{
|
||||
PIE517Setup(args[0].ival, args[1].ival);
|
||||
}
|
||||
|
||||
|
||||
static void configPIE517CallFunc(const iocshArgBuf *args)
|
||||
{
|
||||
PIE517Config(args[0].ival, args[1].sval, args[2].ival);
|
||||
}
|
||||
|
||||
|
||||
static void PIE517motorRegister(void)
|
||||
{
|
||||
iocshRegister(&setupPIE517, setupPIE517CallFunc);
|
||||
iocshRegister(&configPIE517, configPIE517CallFunc);
|
||||
}
|
||||
|
||||
epicsExportRegistrar(PIE517motorRegister);
|
||||
|
||||
} // extern "C"
|
||||
Executable
+316
@@ -0,0 +1,316 @@
|
||||
/*
|
||||
FILENAME... devPIE517.cc
|
||||
USAGE... Motor record device level support for Physik Instrumente (PI)
|
||||
GmbH & Co. E-516 motor controller.
|
||||
|
||||
Version: $Revision: 1.2 $
|
||||
Modified By: $Author: sluiter $
|
||||
Last Modified: $Date: 2008-03-14 20:21:37 $
|
||||
*/
|
||||
|
||||
/*
|
||||
* Original Author: Ron Sluiter
|
||||
* Date: 12/17/03
|
||||
* Current Author: Joe Sullivan
|
||||
*
|
||||
* Experimental Physics and Industrial Control System (EPICS)
|
||||
*
|
||||
* Copyright 1991, the Regents of the University of California,
|
||||
* and the University of Chicago Board of Governors.
|
||||
*
|
||||
* This software was produced under U.S. Government contracts:
|
||||
* (W-7405-ENG-36) at the Los Alamos National Laboratory,
|
||||
* and (W-31-109-ENG-38) at Argonne National Laboratory.
|
||||
*
|
||||
* Initial development by:
|
||||
* The Controls and Automation Group (AT-8)
|
||||
* Ground Test Accelerator
|
||||
* Accelerator Technology Division
|
||||
* Los Alamos National Laboratory
|
||||
*
|
||||
* Co-developed with
|
||||
* The Controls and Computing Group
|
||||
* Accelerator Systems Division
|
||||
* Advanced Photon Source
|
||||
* Argonne National Laboratory
|
||||
*
|
||||
* Modification Log:
|
||||
* -----------------
|
||||
* .01 08/10/16 Bruno Luvizotto (brunoluvizotto@gmail.com) - copied from devPIE516.cc
|
||||
* .02 08/10/16 Bruno Luvizotto (brunoluvizotto@gmail.com) - edited the files for the E517 controller
|
||||
*/
|
||||
|
||||
|
||||
#include <string.h>
|
||||
#include "motorRecord.h"
|
||||
#include "motor.h"
|
||||
#include "motordevCom.h"
|
||||
#include "drvPIE517.h"
|
||||
#include "epicsExport.h"
|
||||
|
||||
extern struct driver_table PIE517_access;
|
||||
|
||||
/* ----------------Create the dsets for devPIE517----------------- */
|
||||
static struct driver_table *drvtabptr;
|
||||
static long PIE517_init(void *);
|
||||
static long PIE517_init_record(void *);
|
||||
static long PIE517_start_trans(struct motorRecord *);
|
||||
static RTN_STATUS PIE517_build_trans(motor_cmnd, double *, struct motorRecord *);
|
||||
static RTN_STATUS PIE517_end_trans(struct motorRecord *);
|
||||
|
||||
struct motor_dset devPIE517 =
|
||||
{
|
||||
{8, NULL, (DEVSUPFUN) PIE517_init, (DEVSUPFUN) PIE517_init_record, NULL},
|
||||
motor_update_values,
|
||||
PIE517_start_trans,
|
||||
PIE517_build_trans,
|
||||
PIE517_end_trans
|
||||
};
|
||||
|
||||
extern "C" {epicsExportAddress(dset,devPIE517);}
|
||||
|
||||
/* --------------------------- program data --------------------- */
|
||||
|
||||
/* This table is used to define the command types */
|
||||
/* WARNING! this must match "motor_cmnd" in motor.h */
|
||||
|
||||
static msg_types PIE517_table[] = {
|
||||
MOTION, /* MOVE_ABS */
|
||||
MOTION, /* MOVE_REL */
|
||||
MOTION, /* HOME_FOR */
|
||||
MOTION, /* HOME_REV */
|
||||
IMMEDIATE, /* LOAD_POS */
|
||||
IMMEDIATE, /* SET_VEL_BASE */
|
||||
IMMEDIATE, /* SET_VELOCITY */
|
||||
IMMEDIATE, /* SET_ACCEL */
|
||||
IMMEDIATE, /* GO */
|
||||
IMMEDIATE, /* SET_ENC_RATIO */
|
||||
INFO, /* GET_INFO */
|
||||
MOVE_TERM, /* STOP_AXIS */
|
||||
VELOCITY, /* JOG */
|
||||
IMMEDIATE, /* SET_PGAIN */
|
||||
IMMEDIATE, /* SET_IGAIN */
|
||||
IMMEDIATE, /* SET_DGAIN */
|
||||
IMMEDIATE, /* ENABLE_TORQUE */
|
||||
IMMEDIATE, /* DISABL_TORQUE */
|
||||
IMMEDIATE, /* PRIMITIVE */
|
||||
IMMEDIATE, /* SET_HIGH_LIMIT */
|
||||
IMMEDIATE, /* SET_LOW_LIMIT */
|
||||
VELOCITY /* JOG_VELOCITY */
|
||||
};
|
||||
|
||||
|
||||
static struct board_stat **PIE517_cards;
|
||||
|
||||
/* --------------------------- program data --------------------- */
|
||||
|
||||
|
||||
/* initialize device support for PIE517 stepper motor */
|
||||
static long PIE517_init(void *arg)
|
||||
{
|
||||
long rtnval;
|
||||
int after = (arg == 0) ? 0 : 1;
|
||||
|
||||
if (after == 0)
|
||||
{
|
||||
drvtabptr = &PIE517_access;
|
||||
(drvtabptr->init)();
|
||||
}
|
||||
|
||||
rtnval = motor_init_com(after, *drvtabptr->cardcnt_ptr, drvtabptr, &PIE517_cards);
|
||||
return(rtnval);
|
||||
}
|
||||
|
||||
|
||||
/* initialize a record instance */
|
||||
static long PIE517_init_record(void *arg)
|
||||
{
|
||||
struct motorRecord *mr = (struct motorRecord *) arg;
|
||||
/* Disable change of direction testing in record support */
|
||||
/* This is a closed-loop device */
|
||||
mr->ntm = menuYesNoNO;
|
||||
return(motor_init_record_com(mr, *drvtabptr->cardcnt_ptr, drvtabptr, PIE517_cards));
|
||||
}
|
||||
|
||||
|
||||
/* start building a transaction */
|
||||
static long PIE517_start_trans(struct motorRecord *mr)
|
||||
{
|
||||
motor_start_trans_com(mr, PIE517_cards);
|
||||
return(OK);
|
||||
}
|
||||
|
||||
|
||||
/* end building a transaction */
|
||||
static RTN_STATUS PIE517_end_trans(struct motorRecord *mr)
|
||||
{
|
||||
motor_end_trans_com(mr, drvtabptr);
|
||||
return(OK);
|
||||
}
|
||||
|
||||
|
||||
/* add a part to the transaction */
|
||||
static RTN_STATUS PIE517_build_trans(motor_cmnd command, double *parms, struct motorRecord *mr)
|
||||
{
|
||||
struct motor_trans *trans = (struct motor_trans *) mr->dpvt;
|
||||
struct mess_node *motor_call;
|
||||
struct controller *brdptr;
|
||||
struct PIE517controller *cntrl;
|
||||
char buff[110];
|
||||
int card, maxdigits;
|
||||
unsigned int size;
|
||||
double dval, cntrl_units, res;
|
||||
RTN_STATUS rtnval;
|
||||
bool send;
|
||||
|
||||
send = true; /* Default to send motor command. */
|
||||
rtnval = OK;
|
||||
buff[0] = '\0';
|
||||
|
||||
/* Protect against NULL pointer with WRTITE_MSG(GO/STOP_AXIS/GET_INFO, NULL). */
|
||||
dval = (parms == NULL) ? 0.0 : *parms;
|
||||
|
||||
rtnval = (RTN_STATUS) motor_start_trans_com(mr, PIE517_cards);
|
||||
|
||||
motor_call = &(trans->motor_call);
|
||||
card = motor_call->card;
|
||||
brdptr = (*trans->tabptr->card_array)[card];
|
||||
if (brdptr == NULL)
|
||||
return(rtnval = ERROR);
|
||||
|
||||
cntrl = (struct PIE517controller *) brdptr->DevicePrivate;
|
||||
res = cntrl->drive_resolution[motor_call->signal];
|
||||
cntrl_units = dval;
|
||||
maxdigits = 3;
|
||||
|
||||
if (PIE517_table[command] > motor_call->type)
|
||||
motor_call->type = PIE517_table[command];
|
||||
|
||||
if (trans->state != BUILD_STATE)
|
||||
return(rtnval = ERROR);
|
||||
|
||||
if (command == PRIMITIVE && mr->init != NULL && strlen(mr->init) != 0)
|
||||
strcat(motor_call->message, mr->init);
|
||||
|
||||
switch (command)
|
||||
{
|
||||
case MOVE_ABS:
|
||||
case MOVE_REL:
|
||||
case HOME_FOR:
|
||||
case HOME_REV:
|
||||
case JOG:
|
||||
if (strlen(mr->prem) != 0)
|
||||
{
|
||||
strcat(motor_call->message, mr->prem);
|
||||
strcat(motor_call->message, EOL_E517);
|
||||
}
|
||||
if (strlen(mr->post) != 0)
|
||||
motor_call->postmsgptr = (char *) &mr->post;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
switch (command)
|
||||
{
|
||||
case MOVE_ABS:
|
||||
sprintf(buff, "MOV # %.*f", maxdigits, (cntrl_units * res));
|
||||
strcat(buff, EOL_E517);
|
||||
break;
|
||||
|
||||
case MOVE_REL:
|
||||
sprintf(buff, "MVR # %.*f", maxdigits, (cntrl_units * res));
|
||||
strcat(buff, EOL_E517);
|
||||
break;
|
||||
|
||||
case HOME_FOR:
|
||||
case HOME_REV:
|
||||
rtnval = ERROR;
|
||||
break;
|
||||
|
||||
case LOAD_POS:
|
||||
rtnval = ERROR;
|
||||
break;
|
||||
|
||||
case SET_VEL_BASE:
|
||||
send = false; /* DC motor; not base velocity. */
|
||||
break;
|
||||
|
||||
case SET_VELOCITY:
|
||||
sprintf(buff, "VEL # %.*f", maxdigits, (cntrl_units * res));
|
||||
strcat(buff, EOL_E517);
|
||||
break;
|
||||
|
||||
case ENABLE_TORQUE:
|
||||
strcpy(buff, "SVO #1");
|
||||
strcat(buff, EOL_E517);
|
||||
break;
|
||||
|
||||
case DISABL_TORQUE:
|
||||
strcpy(buff, "SVO #0");
|
||||
strcat(buff, EOL_E517);
|
||||
break;
|
||||
|
||||
case SET_ACCEL:
|
||||
/* The PIE517 does not support acceleration commands. */
|
||||
case GO:
|
||||
/* The PIE517 starts moving immediately on move commands, GO command
|
||||
* does nothing. */
|
||||
send = false;
|
||||
break;
|
||||
|
||||
case PRIMITIVE:
|
||||
case GET_INFO:
|
||||
/* These commands are not actually done by sending a message, but
|
||||
rather they will indirectly cause the driver to read the status
|
||||
of all motors */
|
||||
break;
|
||||
|
||||
case STOP_AXIS:
|
||||
/* No stop command available - use move relative 0 */
|
||||
sprintf(buff, "STP #");
|
||||
strcat(buff, EOL_E517);
|
||||
break;
|
||||
|
||||
case JOG_VELOCITY:
|
||||
case JOG:
|
||||
sprintf(buff, "VEL # %.*f", maxdigits, cntrl_units);
|
||||
strcat(buff, EOL_E517);
|
||||
break;
|
||||
|
||||
case SET_PGAIN:
|
||||
send = false;
|
||||
break;
|
||||
case SET_IGAIN:
|
||||
send = false;
|
||||
break;
|
||||
case SET_DGAIN:
|
||||
send = false;
|
||||
break;
|
||||
|
||||
case SET_HIGH_LIMIT:
|
||||
case SET_LOW_LIMIT:
|
||||
case SET_ENC_RATIO:
|
||||
trans->state = IDLE_STATE; /* No command sent to the controller. */
|
||||
send = false;
|
||||
break;
|
||||
|
||||
default:
|
||||
send = false;
|
||||
rtnval = ERROR;
|
||||
}
|
||||
|
||||
size = strlen(buff);
|
||||
if (send == false)
|
||||
return(rtnval);
|
||||
else if (size > sizeof(buff) || (strlen(motor_call->message) + size) > MAX_MSG_SIZE)
|
||||
errlogMessage("PIE517_build_trans(): buffer overflow.\n");
|
||||
else
|
||||
{
|
||||
strcat(motor_call->message, buff);
|
||||
rtnval = motor_end_trans_com(mr, drvtabptr);
|
||||
}
|
||||
return(rtnval);
|
||||
}
|
||||
@@ -46,6 +46,12 @@ driver(drvPIE516)
|
||||
registrar(PIE516motorRegister)
|
||||
variable(drvPIE516debug)
|
||||
|
||||
# Physik Instrumente (PI) GmbH & Co. E-517 driver support.
|
||||
device(motor,VME_IO,devPIE517,"PIE517")
|
||||
driver(drvPIE517)
|
||||
registrar(PIE517motorRegister)
|
||||
variable(drvPIE517debug)
|
||||
|
||||
# Physik Instrumente (PI) GmbH & Co. E-816 driver support.
|
||||
device(motor,VME_IO,devPIE816,"PIE816")
|
||||
driver(drvPIE816)
|
||||
|
||||
Executable
+680
@@ -0,0 +1,680 @@
|
||||
/*
|
||||
FILENAME... drvPIE517.cc
|
||||
USAGE... Motor record driver level support for Physik Instrumente (PI)
|
||||
GmbH & Co. E-516 motor controller.
|
||||
|
||||
Version: $Revision: 1.1 $
|
||||
Modified By: $Author: sullivan $
|
||||
Last Modified: $Date: 2007-03-30 20:01:05 $
|
||||
*/
|
||||
|
||||
/*
|
||||
* Original Author: Ron Sluiter
|
||||
* Date: 10/18/05
|
||||
* Current Author: Joe Sullivan
|
||||
*
|
||||
* Experimental Physics and Industrial Control System (EPICS)
|
||||
*
|
||||
* Copyright 1991, the Regents of the University of California,
|
||||
* and the University of Chicago Board of Governors.
|
||||
*
|
||||
* This software was produced under U.S. Government contracts:
|
||||
* (W-7405-ENG-36) at the Los Alamos National Laboratory,
|
||||
* and (W-31-109-ENG-38) at Argonne National Laboratory.
|
||||
*
|
||||
* Initial development by:
|
||||
* The Controls and Automation Group (AT-8)
|
||||
* Ground Test Accelerator
|
||||
* Accelerator Technology Division
|
||||
* Los Alamos National Laboratory
|
||||
*
|
||||
* Co-developed with
|
||||
* The Controls and Computing Group
|
||||
* Accelerator Systems Division
|
||||
* Advanced Photon Source
|
||||
* Argonne National Laboratory
|
||||
*
|
||||
* Modification Log:
|
||||
* -----------------
|
||||
* .01 08/10/16 Bruno Luvizotto (brunoluvizotto@gmail.com) - copied from devPIE516.cc.
|
||||
* .02 08/10/16 Bruno Luvizotto (brunoluvizotto@gmail.com) - edited the files for the E517 controller.
|
||||
* Tested on PI VER:
|
||||
* FW_DSP: 02.034
|
||||
* FW_FPGA: 02.040
|
||||
* FW_MCU: 1.22.6
|
||||
*/
|
||||
|
||||
/*
|
||||
DESIGN LIMITATIONS...
|
||||
1 - Like all controllers, the PIE517 must be powered-on when EPICS is first
|
||||
booted up.
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include <epicsThread.h>
|
||||
#include <drvSup.h>
|
||||
#include "motorRecord.h"
|
||||
#include "motor.h"
|
||||
#include "drvPIE517.h"
|
||||
#include "epicsExport.h"
|
||||
|
||||
#define GET_IDENT "VER?"
|
||||
#define SET_ONLINE "ONL # 1" /* Set Online Mode ON */
|
||||
#define SET_VELCTRL "VCO # 1" /* Set Velocity Control Mode - Required for DONE */
|
||||
#define READ_ONLINE "ONL? #" /* Read Online Mode */
|
||||
#define READ_POS "POS? #" /* Read position */
|
||||
#define READ_OVERFLOW "OVF? #" /* Read Servo Overflow Status */
|
||||
#define READ_ONTARGET "ONT? #" /* Read Position ON Target */
|
||||
#define READ_SERVO "SVO? #" /* Read Servo Enable Status */
|
||||
|
||||
|
||||
#define PIE517_NUM_CARDS 10
|
||||
#define MAX_AXES 3
|
||||
#define BUFF_SIZE 100 /* Maximum length of string to/from PIE517 */
|
||||
|
||||
/*----------------debugging-----------------*/
|
||||
volatile int drvPIE517debug = 0;
|
||||
extern "C" {epicsExportAddress(int, drvPIE517debug);}
|
||||
static inline void Debug(int level, const char *format, ...) {
|
||||
#ifdef DEBUG
|
||||
if (level < drvPIE517debug) {
|
||||
va_list pVar;
|
||||
va_start(pVar, format);
|
||||
vprintf(format, pVar);
|
||||
va_end(pVar);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/* --- Local data. --- */
|
||||
int PIE517_num_cards = 0;
|
||||
static char *PIE517_axis[] = {"1 ", "2 ", "3 "}; //{"A", "B", "C"};
|
||||
|
||||
/* Local data required for every driver; see "motordrvComCode.h" */
|
||||
#include "motordrvComCode.h"
|
||||
|
||||
|
||||
/*----------------functions-----------------*/
|
||||
static int recv_mess(int, char *, int);
|
||||
static RTN_STATUS send_mess(int, char const *, char *);
|
||||
static int set_status(int, int);
|
||||
static long report(int);
|
||||
static long init();
|
||||
static int motor_init();
|
||||
static void query_done(int, int, struct mess_node *);
|
||||
|
||||
/*----------------functions-----------------*/
|
||||
|
||||
struct driver_table PIE517_access =
|
||||
{
|
||||
motor_init,
|
||||
motor_send,
|
||||
motor_free,
|
||||
motor_card_info,
|
||||
motor_axis_info,
|
||||
&mess_queue,
|
||||
&queue_lock,
|
||||
&free_list,
|
||||
&freelist_lock,
|
||||
&motor_sem,
|
||||
&motor_state,
|
||||
&total_cards,
|
||||
&any_motor_in_motion,
|
||||
send_mess,
|
||||
recv_mess,
|
||||
set_status,
|
||||
query_done,
|
||||
NULL,
|
||||
&initialized,
|
||||
PIE517_axis
|
||||
};
|
||||
|
||||
struct
|
||||
{
|
||||
long number;
|
||||
long (*report) (int);
|
||||
long (*init) (void);
|
||||
} drvPIE517 = {2, report, init};
|
||||
|
||||
extern "C" {epicsExportAddress(drvet, drvPIE517);}
|
||||
|
||||
static struct thread_args targs = {SCAN_RATE, &PIE517_access, 0.0};
|
||||
|
||||
/*********************************************************
|
||||
* Print out driver status report
|
||||
*********************************************************/
|
||||
static long report(int level)
|
||||
{
|
||||
int card;
|
||||
|
||||
if (PIE517_num_cards <=0)
|
||||
printf(" No PIE517 controllers configured.\n");
|
||||
else
|
||||
{
|
||||
for (card = 0; card < PIE517_num_cards; card++)
|
||||
{
|
||||
struct controller *brdptr = motor_state[card];
|
||||
|
||||
if (brdptr == NULL)
|
||||
printf(" PIE517 controller %d connection failed.\n", card);
|
||||
else
|
||||
{
|
||||
struct PIE517controller *cntrl;
|
||||
|
||||
cntrl = (struct PIE517controller *) brdptr->DevicePrivate;
|
||||
printf(" PIE517 controller #%d, port=%s, id: %s \n", card,
|
||||
cntrl->asyn_port, brdptr->ident);
|
||||
}
|
||||
}
|
||||
}
|
||||
return(OK);
|
||||
}
|
||||
|
||||
|
||||
static long init()
|
||||
{
|
||||
/*
|
||||
* We cannot call motor_init() here, because that function can do GPIB I/O,
|
||||
* and hence requires that the drvGPIB have already been initialized.
|
||||
* That cannot be guaranteed, so we need to call motor_init from device
|
||||
* support
|
||||
*/
|
||||
/* Check for setup */
|
||||
if (PIE517_num_cards <= 0)
|
||||
{
|
||||
Debug(1, "init(): PIE517 driver disabled. PIE517Setup() missing from startup script.\n");
|
||||
}
|
||||
return((long) 0);
|
||||
}
|
||||
|
||||
|
||||
static void query_done(int card, int axis, struct mess_node *nodeptr)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
/********************************************************************************
|
||||
* *
|
||||
* FUNCTION NAME: set_status *
|
||||
* *
|
||||
* LOGIC: *
|
||||
* Initialize. *
|
||||
* Send "Moving Status" query. *
|
||||
* Read response. *
|
||||
* IF normal response to query. *
|
||||
* Set communication status to NORMAL. *
|
||||
* ELSE *
|
||||
* IF communication status is NORMAL. *
|
||||
* Set communication status to RETRY. *
|
||||
* NORMAL EXIT. *
|
||||
* ELSE *
|
||||
* Set communication status error. *
|
||||
* ERROR EXIT. *
|
||||
* ENDIF *
|
||||
* ENDIF *
|
||||
* *
|
||||
* IF "Moving Status" indicates any motion (i.e. status != 0). *
|
||||
* Clear "Done Moving" status bit. *
|
||||
* ELSE *
|
||||
* Set "Done Moving" status bit. *
|
||||
* ENDIF *
|
||||
* *
|
||||
* *
|
||||
********************************************************************************/
|
||||
|
||||
static int set_status(int card, int signal)
|
||||
{
|
||||
struct PIE517controller *cntrl;
|
||||
struct mess_node *nodeptr;
|
||||
struct mess_info *motor_info;
|
||||
struct motorRecord *mr;
|
||||
/* Message parsing variables */
|
||||
char buff[BUFF_SIZE];
|
||||
int rtn_state;
|
||||
unsigned int overflow_status, ontarget_status, servo_status, online_status;
|
||||
epicsInt32 motorData;
|
||||
bool plusdir, ls_active, plusLS, minusLS;
|
||||
bool readOK;
|
||||
msta_field status;
|
||||
|
||||
cntrl = (struct PIE517controller *) motor_state[card]->DevicePrivate;
|
||||
motor_info = &(motor_state[card]->motor_info[signal]);
|
||||
nodeptr = motor_info->motor_motion;
|
||||
if (nodeptr != NULL)
|
||||
mr = (struct motorRecord *) nodeptr->mrecord;
|
||||
else
|
||||
mr = NULL;
|
||||
status.All = motor_info->status.All;
|
||||
|
||||
recv_mess(card, buff, FLUSH);
|
||||
|
||||
readOK = false;
|
||||
// send_mess(card, READ_ONLINE, PIE517_axis[signal]);
|
||||
// if (recv_mess(card, buff, 1) && sscanf(buff, "%d", &online_status))
|
||||
// {
|
||||
// if (!online_status)
|
||||
// {
|
||||
// /* Assume Controller Reboot - Set ONLINE and Velocity Control ON */
|
||||
// send_mess(card, SET_ONLINE, PIE517_axis[signal]);
|
||||
// //send_mess(card, SET_VELCTRL, (char) NULL);
|
||||
// }
|
||||
|
||||
send_mess(card, READ_ONTARGET, PIE517_axis[signal]);
|
||||
if (recv_mess(card, buff, 1) && sscanf(buff, "%d", &ontarget_status))
|
||||
{
|
||||
send_mess(card, READ_OVERFLOW, PIE517_axis[signal]);
|
||||
if (recv_mess(card, buff, 1) && sscanf(buff, "%d", &overflow_status))
|
||||
{
|
||||
send_mess(card, READ_SERVO, PIE517_axis[signal]);
|
||||
if (recv_mess(card, buff, 1) && sscanf(buff, "%d", &servo_status))
|
||||
{
|
||||
send_mess(card, READ_POS, PIE517_axis[signal]);
|
||||
if (recv_mess(card, buff, 1))
|
||||
{
|
||||
motorData = NINT(atof(buff) / cntrl->drive_resolution[signal]);
|
||||
readOK = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// }
|
||||
|
||||
if (readOK)
|
||||
{
|
||||
cntrl->status = NORMAL;
|
||||
status.Bits.CNTRL_COMM_ERR = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (cntrl->status == NORMAL)
|
||||
{
|
||||
cntrl->status = RETRY;
|
||||
rtn_state = OK;
|
||||
goto exit;
|
||||
}
|
||||
else
|
||||
{
|
||||
cntrl->status = COMM_ERR;
|
||||
status.Bits.CNTRL_COMM_ERR = 1;
|
||||
status.Bits.RA_PROBLEM = 1;
|
||||
rtn_state = 1;
|
||||
goto exit;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Always DONE if torque disabled */
|
||||
status.Bits.RA_DONE = (ontarget_status) ? 1 : 0;
|
||||
status.Bits.RA_HOME = status.Bits.RA_DONE;
|
||||
|
||||
status.Bits.EA_POSITION = (servo_status) ? 1 : 0; /* Torgue disabled flag */
|
||||
|
||||
ls_active = plusLS = minusLS = false;
|
||||
|
||||
/* LS status may be true but servo is not within position error - keep updating */
|
||||
/* No Limit switches but if the Servo Controller overflows indicate with a + LS */
|
||||
if (status.Bits.RA_DONE)
|
||||
plusLS = overflow_status ? true : false;
|
||||
|
||||
if (motorData == motor_info->position)
|
||||
{
|
||||
if (nodeptr != 0) /* Increment counter only if motor is moving. */
|
||||
motor_info->no_motion_count++;
|
||||
}
|
||||
else
|
||||
{
|
||||
status.Bits.RA_DIRECTION = (motorData >= motor_info->position) ? 1 : 0;
|
||||
motor_info->position = motor_info->encoder_position = motorData;
|
||||
motor_info->no_motion_count = 0;
|
||||
}
|
||||
|
||||
plusdir = (status.Bits.RA_DIRECTION) ? true : false;
|
||||
|
||||
/* Set limit switch error indicators. */
|
||||
if (plusLS == true)
|
||||
{
|
||||
status.Bits.RA_PLUS_LS = 1;
|
||||
if (plusdir == true)
|
||||
ls_active = true;
|
||||
}
|
||||
else
|
||||
status.Bits.RA_PLUS_LS = 0;
|
||||
|
||||
if (minusLS == true)
|
||||
{
|
||||
status.Bits.RA_MINUS_LS = 1;
|
||||
if (plusdir == false)
|
||||
ls_active = true;
|
||||
}
|
||||
else
|
||||
status.Bits.RA_MINUS_LS = 0;
|
||||
|
||||
/* encoder status */
|
||||
status.Bits.EA_SLIP = 0;
|
||||
status.Bits.EA_SLIP_STALL = 0;
|
||||
status.Bits.EA_HOME = 0;
|
||||
|
||||
status.Bits.RA_PROBLEM = 0;
|
||||
|
||||
/* Parse motor velocity? */
|
||||
/* NEEDS WORK */
|
||||
|
||||
motor_info->velocity = 0;
|
||||
|
||||
if (!status.Bits.RA_DIRECTION)
|
||||
motor_info->velocity *= -1;
|
||||
|
||||
rtn_state = (!motor_info->no_motion_count || ls_active == true ||
|
||||
status.Bits.RA_DONE | status.Bits.RA_PROBLEM) ? 1 : 0;
|
||||
|
||||
/* Test for post-move string. */
|
||||
if ((status.Bits.RA_DONE || ls_active == true) && nodeptr != 0 &&
|
||||
nodeptr->postmsgptr != 0)
|
||||
{
|
||||
strcpy(buff, nodeptr->postmsgptr);
|
||||
send_mess(card, buff, (char) NULL);
|
||||
nodeptr->postmsgptr = NULL;
|
||||
}
|
||||
|
||||
exit:
|
||||
motor_info->status.All = status.All;
|
||||
return(rtn_state);
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************/
|
||||
/* send a message to the PIE517 board */
|
||||
/* send_mess() */
|
||||
/*****************************************************/
|
||||
static RTN_STATUS send_mess(int card, char const *com, char *name)
|
||||
{
|
||||
char local_buff[MAX_MSG_SIZE];
|
||||
char *pbuff;
|
||||
struct PIE517controller *cntrl;
|
||||
int comsize, namesize;
|
||||
size_t nwrite;
|
||||
|
||||
comsize = (com == NULL) ? 0 : strlen(com);
|
||||
namesize = (name == NULL) ? 0 : strlen(name);
|
||||
|
||||
if ((comsize + namesize) > MAX_MSG_SIZE)
|
||||
{
|
||||
errlogMessage("drvPIE517.cc:send_mess(); message size violation.\n");
|
||||
return(ERROR);
|
||||
}
|
||||
else if (comsize == 0) /* Normal exit on empty input message. */
|
||||
return(OK);
|
||||
|
||||
if (!motor_state[card])
|
||||
{
|
||||
errlogPrintf("drvPIE517.cc:send_mess() - invalid card #%d\n", card);
|
||||
return(ERROR);
|
||||
}
|
||||
|
||||
local_buff[0] = (char) NULL; /* Terminate local buffer. */
|
||||
|
||||
if (name == NULL)
|
||||
strcat(local_buff, com); /* Make a local copy of the string. */
|
||||
else
|
||||
{
|
||||
strcpy(local_buff, com);
|
||||
pbuff = strchr(local_buff, '#');
|
||||
if (pbuff != NULL)
|
||||
*pbuff = *name;
|
||||
else
|
||||
Debug(1, "send_mess(): NAME ERROR: message = %s\n", local_buff);
|
||||
}
|
||||
|
||||
Debug(2, "send_mess(): message = %s\n", local_buff);
|
||||
|
||||
cntrl = (struct PIE517controller *) motor_state[card]->DevicePrivate;
|
||||
pasynOctetSyncIO->write(cntrl->pasynUser, local_buff, strlen(local_buff),
|
||||
COMM_TIMEOUT, &nwrite);
|
||||
|
||||
return(OK);
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************/
|
||||
/* receive a message from the PIE517 board */
|
||||
/* recv_mess() */
|
||||
/*****************************************************/
|
||||
static int recv_mess(int card, char *com, int flag)
|
||||
{
|
||||
struct PIE517controller *cntrl;
|
||||
size_t nread = 0;
|
||||
asynStatus status = asynError;
|
||||
int eomReason;
|
||||
char *pos;
|
||||
|
||||
/* Check that card exists */
|
||||
if (!motor_state[card])
|
||||
return(ERROR);
|
||||
|
||||
cntrl = (struct PIE517controller *) motor_state[card]->DevicePrivate;
|
||||
|
||||
if (flag == FLUSH)
|
||||
pasynOctetSyncIO->flush(cntrl->pasynUser);
|
||||
else
|
||||
status = pasynOctetSyncIO->read(cntrl->pasynUser, com, BUFF_SIZE,
|
||||
COMM_TIMEOUT, &nread, &eomReason);
|
||||
pos=strchr(com,'=');
|
||||
if(pos != NULL)
|
||||
strcpy(com,&pos[1]);
|
||||
|
||||
if ((status != asynSuccess) || (nread <= 0))
|
||||
{
|
||||
com[0] = '\0';
|
||||
nread = 0;
|
||||
}
|
||||
|
||||
Debug(2, "recv_mess(): message = \"%s\"\n", com);
|
||||
return(nread);
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************/
|
||||
/* Setup system configuration */
|
||||
/* PIE517Setup() */
|
||||
/*****************************************************/
|
||||
RTN_STATUS
|
||||
PIE517Setup(int num_cards, /* maximum number of controllers in system. */
|
||||
int scan_rate) /* polling rate - 1/60 sec units. */
|
||||
{
|
||||
int itera;
|
||||
|
||||
if (num_cards < 1 || num_cards > PIE517_NUM_CARDS)
|
||||
PIE517_num_cards = PIE517_NUM_CARDS;
|
||||
else
|
||||
PIE517_num_cards = num_cards;
|
||||
|
||||
/* Set motor polling task rate */
|
||||
if (scan_rate >= 1 && scan_rate <= 60)
|
||||
targs.motor_scan_rate = scan_rate;
|
||||
else
|
||||
targs.motor_scan_rate = SCAN_RATE;
|
||||
|
||||
/*
|
||||
* Allocate space for motor_state structures. Note this must be done
|
||||
* before PIE517Config is called, so it cannot be done in motor_init()
|
||||
* This means that we must allocate space for a card without knowing
|
||||
* if it really exists, which is not a serious problem
|
||||
*/
|
||||
motor_state = (struct controller **) malloc(PIE517_num_cards *
|
||||
sizeof(struct controller *));
|
||||
|
||||
for (itera = 0; itera < PIE517_num_cards; itera++)
|
||||
motor_state[itera] = (struct controller *) NULL;
|
||||
|
||||
return(OK);
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************/
|
||||
/* Configure a controller */
|
||||
/* PIE517Config() */
|
||||
/*****************************************************/
|
||||
RTN_STATUS
|
||||
PIE517Config(int card, /* card being configured */
|
||||
const char *name, /* asyn port name */
|
||||
int addr) /* asyn address (GPIB) */
|
||||
{
|
||||
struct PIE517controller *cntrl;
|
||||
|
||||
if (card < 0 || card >= PIE517_num_cards)
|
||||
return(ERROR);
|
||||
|
||||
motor_state[card] = (struct controller *) malloc(sizeof(struct controller));
|
||||
motor_state[card]->DevicePrivate = malloc(sizeof(struct PIE517controller));
|
||||
cntrl = (struct PIE517controller *) motor_state[card]->DevicePrivate;
|
||||
|
||||
strcpy(cntrl->asyn_port, name);
|
||||
cntrl->asyn_address = addr;
|
||||
return(OK);
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************/
|
||||
/* initialize all software and hardware */
|
||||
/* This is called from the initialization routine in */
|
||||
/* device support. */
|
||||
/* motor_init() */
|
||||
/*****************************************************/
|
||||
static int motor_init()
|
||||
{
|
||||
struct controller *brdptr;
|
||||
struct PIE517controller *cntrl;
|
||||
int card_index, motor_index;
|
||||
char buff[BUFF_SIZE], *pbuff;
|
||||
int total_axis;
|
||||
int status;
|
||||
int version;
|
||||
bool online;
|
||||
asynStatus success_rtn;
|
||||
static const char output_terminator[] = EOL_E517;
|
||||
static const char input_terminator[] = EOL_E517;
|
||||
|
||||
initialized = true; /* Indicate that driver is initialized. */
|
||||
|
||||
/* Check for setup */
|
||||
if (PIE517_num_cards <= 0)
|
||||
return(ERROR);
|
||||
|
||||
for (card_index = 0; card_index < PIE517_num_cards; card_index++)
|
||||
{
|
||||
if (!motor_state[card_index])
|
||||
continue;
|
||||
|
||||
brdptr = motor_state[card_index];
|
||||
brdptr->ident[0] = (char) NULL; /* No controller identification message. */
|
||||
brdptr->cmnd_response = false;
|
||||
total_cards = card_index + 1;
|
||||
cntrl = (struct PIE517controller *) brdptr->DevicePrivate;
|
||||
|
||||
status = version = 0;
|
||||
|
||||
/* Initialize communications channel */
|
||||
success_rtn = pasynOctetSyncIO->connect(cntrl->asyn_port, 0,
|
||||
&cntrl->pasynUser, NULL);
|
||||
if (success_rtn == asynSuccess)
|
||||
{
|
||||
//int retry = 0;
|
||||
|
||||
pasynOctetSyncIO->setOutputEos(cntrl->pasynUser, output_terminator,
|
||||
strlen(output_terminator));
|
||||
pasynOctetSyncIO->setInputEos(cntrl->pasynUser, input_terminator,
|
||||
strlen(input_terminator));
|
||||
|
||||
/* Send a message to the board, see if it exists */
|
||||
/* flush any junk at input port - should not be any data available */
|
||||
pasynOctetSyncIO->flush(cntrl->pasynUser);
|
||||
|
||||
/* Assure that Controller is ONLINE */
|
||||
online = true;
|
||||
//do
|
||||
//{
|
||||
// online = false;
|
||||
// /* Set Controller to ONLINE mode */
|
||||
// send_mess(card_index, SET_ONLINE, (char) NULL);
|
||||
// send_mess(card_index, READ_ONLINE, (char) NULL);
|
||||
// if ((status = recv_mess(card_index, buff, 1)))
|
||||
//online = (atoi(buff)==1) ? true : false;
|
||||
// else
|
||||
//retry++;
|
||||
//} while (online == false && retry < 3);
|
||||
|
||||
//send_mess(card_index, GET_IDENT, (char) NULL);
|
||||
//status = recv_mess(card_index, buff, 1);
|
||||
|
||||
/* Parse out E517 revision (2 decimal places) and convert to int */
|
||||
if ((pbuff = strchr(buff, 'V')))
|
||||
version = NINT(atof(pbuff+1) * 100);
|
||||
else
|
||||
version = 0;
|
||||
}
|
||||
|
||||
if (success_rtn == asynSuccess && online == true)
|
||||
{
|
||||
strcpy(brdptr->ident, buff);
|
||||
brdptr->localaddr = (char *) NULL;
|
||||
brdptr->motor_in_motion = 0;
|
||||
|
||||
/* Check for E517 versions that need the status word shifted up 8 bits */
|
||||
/*if (version >= 311)
|
||||
cntrl->versionSupport = true;
|
||||
else
|
||||
cntrl->versionSupport = false;*/
|
||||
|
||||
/* Determine # of axes. Request stage name. See if it responds */
|
||||
for (total_axis = 0; total_axis < MAX_AXES; total_axis++)
|
||||
{
|
||||
send_mess(card_index, READ_POS, PIE517_axis[total_axis]);
|
||||
status = recv_mess(card_index, buff, 1);
|
||||
if (!status)
|
||||
break;
|
||||
}
|
||||
brdptr->total_axis = total_axis;
|
||||
|
||||
/* Turn ON velocity control mode - All axis */
|
||||
//send_mess(card_index, SET_VELCTRL, (char) NULL);
|
||||
|
||||
for (motor_index = 0; motor_index < total_axis; motor_index++)
|
||||
{
|
||||
struct mess_info *motor_info = &brdptr->motor_info[motor_index];
|
||||
|
||||
motor_info->status.All = 0;
|
||||
motor_info->no_motion_count = 0;
|
||||
motor_info->encoder_position = 0;
|
||||
motor_info->position = 0;
|
||||
brdptr->motor_info[motor_index].motor_motion = NULL;
|
||||
/* PIE517 has DC motor support only */
|
||||
motor_info->encoder_present = YES;
|
||||
motor_info->status.Bits.EA_PRESENT = 1;
|
||||
motor_info->pid_present = NO;
|
||||
motor_info->status.Bits.GAIN_SUPPORT = 1;
|
||||
|
||||
cntrl->drive_resolution[motor_index] = POS_RES;
|
||||
|
||||
set_status(card_index, motor_index); /* Read status of each motor */
|
||||
}
|
||||
}
|
||||
else
|
||||
motor_state[card_index] = (struct controller *) NULL;
|
||||
}
|
||||
|
||||
any_motor_in_motion = 0;
|
||||
|
||||
mess_queue.head = (struct mess_node *) NULL;
|
||||
mess_queue.tail = (struct mess_node *) NULL;
|
||||
|
||||
free_list.head = (struct mess_node *) NULL;
|
||||
free_list.tail = (struct mess_node *) NULL;
|
||||
|
||||
epicsThreadCreate((char *) "PIE517_motor", epicsThreadPriorityMedium,
|
||||
epicsThreadGetStackSize(epicsThreadStackMedium),
|
||||
(EPICSTHREADFUNC) motor_task, (void *) &targs);
|
||||
|
||||
return(OK);
|
||||
}
|
||||
|
||||
|
||||
Executable
+75
@@ -0,0 +1,75 @@
|
||||
/* File: drvPIE516.h */
|
||||
|
||||
|
||||
/* Device Driver Support definitions for motor */
|
||||
/*
|
||||
* Original Author: Ron Sluiter
|
||||
* Current Author: Joe Sullivan
|
||||
* Date: 09/20/2005
|
||||
*
|
||||
* Modification Log:
|
||||
* -----------------
|
||||
* .01 08/10/16 Bruno Luvizotto (brunoluvizotto@gmail.com) - copied from drvPIE516.h
|
||||
* .02 08/10/16 Bruno Luvizotto (brunoluvizotto@gmail.com) - edited the files for the E517 controller
|
||||
*/
|
||||
|
||||
#ifndef INCdrvPIE517h
|
||||
#define INCdrvPIE517h 1
|
||||
|
||||
#include "motordrvCom.h"
|
||||
#include "asynDriver.h"
|
||||
#include "asynDriver.h"
|
||||
#include "asynOctetSyncIO.h"
|
||||
|
||||
#define COMM_TIMEOUT 2 /* Timeout in seconds. */
|
||||
#define POS_RES 0.001 /* Position resolution. */
|
||||
|
||||
#define EOL_E517 "\n" /* Command End-Of-Line = LF (0x10) */
|
||||
|
||||
struct PIE517controller
|
||||
{
|
||||
asynUser *pasynUser; /* asynUser structure */
|
||||
int asyn_address; /* Use for GPIB or other address with asyn */
|
||||
CommStatus status; /* Controller communication status. */
|
||||
double drive_resolution[4];
|
||||
bool versionSupport; /* Track supported Versions - include in Report */
|
||||
char asyn_port[80]; /* asyn port name */
|
||||
};
|
||||
|
||||
|
||||
typedef union
|
||||
{
|
||||
epicsUInt16 All;
|
||||
struct
|
||||
{
|
||||
#ifdef MSB_First
|
||||
unsigned int cmnd_err :1; /* 15 - Command Error */
|
||||
unsigned int na6 :1; /* 14 - */
|
||||
unsigned int autozero :1; /* 13 - AutoZero function is running */
|
||||
unsigned int plus_ls :1; /* 12 - Positive limit switch flag. */
|
||||
unsigned int minus_ls :1; /* 11 - Negative limit switch flag. */
|
||||
unsigned int moving :1; /* 10 - Moving indicator - position error outside tolerance */
|
||||
unsigned int volt_limit :1; /* 9 - piezo voltage limit reached */
|
||||
unsigned int torque :1; /* 8 - Servo-control status */
|
||||
unsigned int nabyte :8;
|
||||
|
||||
#else
|
||||
unsigned int nabyte :8;
|
||||
unsigned int torque :1; /* 8 - Servo-control status */
|
||||
unsigned int volt_limit :1; /* 9 - piezo voltage limit reached */
|
||||
unsigned int moving :1; /* 10 - Moving indicator - position error outside tolerance */
|
||||
unsigned int minus_ls :1; /* 11 - Negative limit switch flag. */
|
||||
unsigned int plus_ls :1; /* 12 - Positive limit switch flag. */
|
||||
unsigned int autozero :1; /* 13 - AutoZero function is running */
|
||||
unsigned int na6 :1; /* 14 - */
|
||||
unsigned int cmnd_err :1; /* 15 - Command Error */
|
||||
#endif
|
||||
} Bits;
|
||||
} E517_Status_Reg;
|
||||
|
||||
|
||||
/* Function prototypes. */
|
||||
extern RTN_STATUS PIE517Setup(int, int);
|
||||
extern RTN_STATUS PIE517Config(int, const char *, int);
|
||||
|
||||
#endif /* INCdrvPIE517h */
|
||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -0,0 +1,60 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>MainWindow</class>
|
||||
<widget class="QMainWindow" name="MainWindow">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>352</width>
|
||||
<height>282</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>MainWindow</string>
|
||||
</property>
|
||||
<widget class="QWidget" name="centralwidget">
|
||||
<widget class="caInclude" name="cainclude">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>176</width>
|
||||
<height>282</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="macro">
|
||||
<string notr="true">P=$(P),M=$(M1)</string>
|
||||
</property>
|
||||
<property name="filename" stdset="0">
|
||||
<string notr="true">motorxU.ui</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="caInclude" name="cainclude_2">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>176</x>
|
||||
<y>0</y>
|
||||
<width>176</width>
|
||||
<height>282</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="macro">
|
||||
<string notr="true">P=$(P),M=$(M2)</string>
|
||||
</property>
|
||||
<property name="filename" stdset="0">
|
||||
<string notr="true">motorxU.ui</string>
|
||||
</property>
|
||||
</widget>
|
||||
</widget>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>caInclude</class>
|
||||
<extends>QWidget</extends>
|
||||
<header>caInclude</header>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
@@ -0,0 +1,76 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>MainWindow</class>
|
||||
<widget class="QMainWindow" name="MainWindow">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>528</width>
|
||||
<height>282</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>MainWindow</string>
|
||||
</property>
|
||||
<widget class="QWidget" name="centralwidget">
|
||||
<widget class="caInclude" name="cainclude">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>176</width>
|
||||
<height>282</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="macro">
|
||||
<string notr="true">P=$(P),M=$(M1)</string>
|
||||
</property>
|
||||
<property name="filename" stdset="0">
|
||||
<string notr="true">motorxU.ui</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="caInclude" name="cainclude_2">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>176</x>
|
||||
<y>0</y>
|
||||
<width>176</width>
|
||||
<height>282</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="macro">
|
||||
<string notr="true">P=$(P),M=$(M2)</string>
|
||||
</property>
|
||||
<property name="filename" stdset="0">
|
||||
<string notr="true">motorxU.ui</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="caInclude" name="cainclude_3">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>352</x>
|
||||
<y>0</y>
|
||||
<width>176</width>
|
||||
<height>282</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="macro">
|
||||
<string notr="true">P=$(P),M=$(M3)</string>
|
||||
</property>
|
||||
<property name="filename" stdset="0">
|
||||
<string notr="true">motorxU.ui</string>
|
||||
</property>
|
||||
</widget>
|
||||
</widget>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>caInclude</class>
|
||||
<extends>QWidget</extends>
|
||||
<header>caInclude</header>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
@@ -0,0 +1,92 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>MainWindow</class>
|
||||
<widget class="QMainWindow" name="MainWindow">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>704</width>
|
||||
<height>282</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>MainWindow</string>
|
||||
</property>
|
||||
<widget class="QWidget" name="centralwidget">
|
||||
<widget class="caInclude" name="cainclude">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>176</width>
|
||||
<height>282</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="macro">
|
||||
<string notr="true">P=$(P),M=$(M1)</string>
|
||||
</property>
|
||||
<property name="filename" stdset="0">
|
||||
<string notr="true">motorxU.ui</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="caInclude" name="cainclude_2">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>176</x>
|
||||
<y>0</y>
|
||||
<width>176</width>
|
||||
<height>282</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="macro">
|
||||
<string notr="true">P=$(P),M=$(M2)</string>
|
||||
</property>
|
||||
<property name="filename" stdset="0">
|
||||
<string notr="true">motorxU.ui</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="caInclude" name="cainclude_3">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>352</x>
|
||||
<y>0</y>
|
||||
<width>176</width>
|
||||
<height>282</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="macro">
|
||||
<string notr="true">P=$(P),M=$(M3)</string>
|
||||
</property>
|
||||
<property name="filename" stdset="0">
|
||||
<string notr="true">motorxU.ui</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="caInclude" name="cainclude_4">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>528</x>
|
||||
<y>0</y>
|
||||
<width>176</width>
|
||||
<height>282</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="macro">
|
||||
<string notr="true">P=$(P),M=$(M4)</string>
|
||||
</property>
|
||||
<property name="filename" stdset="0">
|
||||
<string notr="true">motorxU.ui</string>
|
||||
</property>
|
||||
</widget>
|
||||
</widget>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>caInclude</class>
|
||||
<extends>QWidget</extends>
|
||||
<header>caInclude</header>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
@@ -0,0 +1,108 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>MainWindow</class>
|
||||
<widget class="QMainWindow" name="MainWindow">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>880</width>
|
||||
<height>282</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>MainWindow</string>
|
||||
</property>
|
||||
<widget class="QWidget" name="centralwidget">
|
||||
<widget class="caInclude" name="cainclude">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>176</width>
|
||||
<height>282</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="macro">
|
||||
<string notr="true">P=$(P),M=$(M1)</string>
|
||||
</property>
|
||||
<property name="filename" stdset="0">
|
||||
<string notr="true">motorxU.ui</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="caInclude" name="cainclude_2">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>176</x>
|
||||
<y>0</y>
|
||||
<width>176</width>
|
||||
<height>282</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="macro">
|
||||
<string notr="true">P=$(P),M=$(M2)</string>
|
||||
</property>
|
||||
<property name="filename" stdset="0">
|
||||
<string notr="true">motorxU.ui</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="caInclude" name="cainclude_3">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>352</x>
|
||||
<y>0</y>
|
||||
<width>176</width>
|
||||
<height>282</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="macro">
|
||||
<string notr="true">P=$(P),M=$(M3)</string>
|
||||
</property>
|
||||
<property name="filename" stdset="0">
|
||||
<string notr="true">motorxU.ui</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="caInclude" name="cainclude_4">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>528</x>
|
||||
<y>0</y>
|
||||
<width>176</width>
|
||||
<height>282</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="macro">
|
||||
<string notr="true">P=$(P),M=$(M5)</string>
|
||||
</property>
|
||||
<property name="filename" stdset="0">
|
||||
<string notr="true">motorxU.ui</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="caInclude" name="cainclude_5">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>704</x>
|
||||
<y>0</y>
|
||||
<width>176</width>
|
||||
<height>282</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="macro">
|
||||
<string notr="true">P=$(P),M=$(M5)</string>
|
||||
</property>
|
||||
<property name="filename" stdset="0">
|
||||
<string notr="true">motorxU.ui</string>
|
||||
</property>
|
||||
</widget>
|
||||
</widget>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>caInclude</class>
|
||||
<extends>QWidget</extends>
|
||||
<header>caInclude</header>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
@@ -0,0 +1,124 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>MainWindow</class>
|
||||
<widget class="QMainWindow" name="MainWindow">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>528</width>
|
||||
<height>564</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>MainWindow</string>
|
||||
</property>
|
||||
<widget class="QWidget" name="centralwidget">
|
||||
<widget class="caInclude" name="cainclude">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>176</width>
|
||||
<height>282</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="macro">
|
||||
<string notr="true">P=$(P),M=$(M1)</string>
|
||||
</property>
|
||||
<property name="filename" stdset="0">
|
||||
<string notr="true">motorxU.ui</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="caInclude" name="cainclude_2">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>176</x>
|
||||
<y>0</y>
|
||||
<width>176</width>
|
||||
<height>282</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="macro">
|
||||
<string notr="true">P=$(P),M=$(M2)</string>
|
||||
</property>
|
||||
<property name="filename" stdset="0">
|
||||
<string notr="true">motorxU.ui</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="caInclude" name="cainclude_3">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>352</x>
|
||||
<y>0</y>
|
||||
<width>176</width>
|
||||
<height>282</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="macro">
|
||||
<string notr="true">P=$(P),M=$(M3)</string>
|
||||
</property>
|
||||
<property name="filename" stdset="0">
|
||||
<string notr="true">motorxU.ui</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="caInclude" name="cainclude_4">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>282</y>
|
||||
<width>176</width>
|
||||
<height>282</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="macro">
|
||||
<string notr="true">P=$(P),M=$(M4)</string>
|
||||
</property>
|
||||
<property name="filename" stdset="0">
|
||||
<string notr="true">motorxU.ui</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="caInclude" name="cainclude_5">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>176</x>
|
||||
<y>282</y>
|
||||
<width>176</width>
|
||||
<height>282</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="macro">
|
||||
<string notr="true">P=$(P),M=$(M5)</string>
|
||||
</property>
|
||||
<property name="filename" stdset="0">
|
||||
<string notr="true">motorxU.ui</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="caInclude" name="cainclude_6">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>352</x>
|
||||
<y>282</y>
|
||||
<width>176</width>
|
||||
<height>282</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="macro">
|
||||
<string notr="true">P=$(P),M=$(M6)</string>
|
||||
</property>
|
||||
<property name="filename" stdset="0">
|
||||
<string notr="true">motorxU.ui</string>
|
||||
</property>
|
||||
</widget>
|
||||
</widget>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>caInclude</class>
|
||||
<extends>QWidget</extends>
|
||||
<header>caInclude</header>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
@@ -0,0 +1,140 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>MainWindow</class>
|
||||
<widget class="QMainWindow" name="MainWindow">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>704</width>
|
||||
<height>564</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>MainWindow</string>
|
||||
</property>
|
||||
<widget class="QWidget" name="centralwidget">
|
||||
<widget class="caInclude" name="cainclude">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>176</width>
|
||||
<height>282</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="macro">
|
||||
<string notr="true">P=$(P),M=$(M1)</string>
|
||||
</property>
|
||||
<property name="filename" stdset="0">
|
||||
<string notr="true">motorxU.ui</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="caInclude" name="cainclude_2">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>176</x>
|
||||
<y>0</y>
|
||||
<width>176</width>
|
||||
<height>282</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="macro">
|
||||
<string notr="true">P=$(P),M=$(M2)</string>
|
||||
</property>
|
||||
<property name="filename" stdset="0">
|
||||
<string notr="true">motorxU.ui</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="caInclude" name="cainclude_3">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>352</x>
|
||||
<y>0</y>
|
||||
<width>176</width>
|
||||
<height>282</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="macro">
|
||||
<string notr="true">P=$(P),M=$(M3)</string>
|
||||
</property>
|
||||
<property name="filename" stdset="0">
|
||||
<string notr="true">motorxU.ui</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="caInclude" name="cainclude_4">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>528</x>
|
||||
<y>0</y>
|
||||
<width>176</width>
|
||||
<height>282</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="macro">
|
||||
<string notr="true">P=$(P),M=$(M4)</string>
|
||||
</property>
|
||||
<property name="filename" stdset="0">
|
||||
<string notr="true">motorxU.ui</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="caInclude" name="cainclude_5">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>282</y>
|
||||
<width>176</width>
|
||||
<height>282</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="macro">
|
||||
<string notr="true">P=$(P),M=$(M5)</string>
|
||||
</property>
|
||||
<property name="filename" stdset="0">
|
||||
<string notr="true">motorxU.ui</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="caInclude" name="cainclude_6">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>176</x>
|
||||
<y>282</y>
|
||||
<width>176</width>
|
||||
<height>282</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="macro">
|
||||
<string notr="true">P=$(P),M=$(M6)</string>
|
||||
</property>
|
||||
<property name="filename" stdset="0">
|
||||
<string notr="true">motorxU.ui</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="caInclude" name="cainclude_7">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>352</x>
|
||||
<y>282</y>
|
||||
<width>176</width>
|
||||
<height>282</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="macro">
|
||||
<string notr="true">P=$(P),M=$(M7)</string>
|
||||
</property>
|
||||
<property name="filename" stdset="0">
|
||||
<string notr="true">motorxU.ui</string>
|
||||
</property>
|
||||
</widget>
|
||||
</widget>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>caInclude</class>
|
||||
<extends>QWidget</extends>
|
||||
<header>caInclude</header>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
@@ -0,0 +1,156 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>MainWindow</class>
|
||||
<widget class="QMainWindow" name="MainWindow">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>704</width>
|
||||
<height>564</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>MainWindow</string>
|
||||
</property>
|
||||
<widget class="QWidget" name="centralwidget">
|
||||
<widget class="caInclude" name="cainclude">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>176</width>
|
||||
<height>282</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="macro">
|
||||
<string notr="true">P=$(P),M=$(M1)</string>
|
||||
</property>
|
||||
<property name="filename" stdset="0">
|
||||
<string notr="true">motorxU.ui</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="caInclude" name="cainclude_2">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>176</x>
|
||||
<y>0</y>
|
||||
<width>176</width>
|
||||
<height>282</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="macro">
|
||||
<string notr="true">P=$(P),M=$(M2)</string>
|
||||
</property>
|
||||
<property name="filename" stdset="0">
|
||||
<string notr="true">motorxU.ui</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="caInclude" name="cainclude_3">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>352</x>
|
||||
<y>0</y>
|
||||
<width>176</width>
|
||||
<height>282</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="macro">
|
||||
<string notr="true">P=$(P),M=$(M3)</string>
|
||||
</property>
|
||||
<property name="filename" stdset="0">
|
||||
<string notr="true">motorxU.ui</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="caInclude" name="cainclude_4">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>528</x>
|
||||
<y>0</y>
|
||||
<width>176</width>
|
||||
<height>282</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="macro">
|
||||
<string notr="true">P=$(P),M=$(M4)</string>
|
||||
</property>
|
||||
<property name="filename" stdset="0">
|
||||
<string notr="true">motorxU.ui</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="caInclude" name="cainclude_5">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>282</y>
|
||||
<width>176</width>
|
||||
<height>282</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="macro">
|
||||
<string notr="true">P=$(P),M=$(M5)</string>
|
||||
</property>
|
||||
<property name="filename" stdset="0">
|
||||
<string notr="true">motorxU.ui</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="caInclude" name="cainclude_6">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>176</x>
|
||||
<y>282</y>
|
||||
<width>176</width>
|
||||
<height>282</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="macro">
|
||||
<string notr="true">P=$(P),M=$(M6)</string>
|
||||
</property>
|
||||
<property name="filename" stdset="0">
|
||||
<string notr="true">motorxU.ui</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="caInclude" name="cainclude_7">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>352</x>
|
||||
<y>282</y>
|
||||
<width>176</width>
|
||||
<height>282</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="macro">
|
||||
<string notr="true">P=$(P),M=$(M7)</string>
|
||||
</property>
|
||||
<property name="filename" stdset="0">
|
||||
<string notr="true">motorxU.ui</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="caInclude" name="cainclude_8">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>528</x>
|
||||
<y>282</y>
|
||||
<width>176</width>
|
||||
<height>282</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="macro">
|
||||
<string notr="true">P=$(P),M=$(M8)</string>
|
||||
</property>
|
||||
<property name="filename" stdset="0">
|
||||
<string notr="true">motorxU.ui</string>
|
||||
</property>
|
||||
</widget>
|
||||
</widget>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>caInclude</class>
|
||||
<extends>QWidget</extends>
|
||||
<header>caInclude</header>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
Reference in new issue
Block a user