New backend for rotators

git-svn-id: https://hamlib.svn.sourceforge.net/svnroot/hamlib/trunk@865 7ae35d74-ebe9-4afe-98af-79ac388436b8
Hamlib-1.1.3
Francois Retief 2002-01-16 16:35:22 +00:00
rodzic e504298aa0
commit e2766bc309
5 zmienionych plików z 800 dodań i 0 usunięć

Wyświetl plik

@ -0,0 +1,7 @@
lib_LTLIBRARIES = libhamlib-easycomm.la
libhamlib_easycomm_la_SOURCES = easycomm.c
libhamlib_easycomm_la_LDFLAGS = -no-undefined -module -version-info 0:0:0
libhamlib_easycomm_la_LIBADD = ../src/libhamlib.la
noinst_HEADERS = easycomm.h

Wyświetl plik

@ -0,0 +1,343 @@
# Makefile.in generated automatically by automake 1.5 from Makefile.am.
# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
# Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
@SET_MAKE@
SHELL = @SHELL@
srcdir = @srcdir@
top_srcdir = @top_srcdir@
VPATH = @srcdir@
prefix = @prefix@
exec_prefix = @exec_prefix@
bindir = @bindir@
sbindir = @sbindir@
libexecdir = @libexecdir@
datadir = @datadir@
sysconfdir = @sysconfdir@
sharedstatedir = @sharedstatedir@
localstatedir = @localstatedir@
libdir = @libdir@
infodir = @infodir@
mandir = @mandir@
includedir = @includedir@
oldincludedir = /usr/include
pkgdatadir = $(datadir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
top_builddir = ..
ACLOCAL = @ACLOCAL@
AUTOCONF = @AUTOCONF@
AUTOMAKE = @AUTOMAKE@
AUTOHEADER = @AUTOHEADER@
INSTALL = @INSTALL@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_HEADER = $(INSTALL_DATA)
transform = @program_transform_name@
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
host_alias = @host_alias@
host_triplet = @host@
AMTAR = @AMTAR@
AS = @AS@
AWK = @AWK@
BACKENDEPS = @BACKENDEPS@
BACKENDLNK = @BACKENDLNK@
BACKEND_LIST = @BACKEND_LIST@
CC = @CC@
CPP = @CPP@
CXX = @CXX@
DEPDIR = @DEPDIR@
DLLTOOL = @DLLTOOL@
ECHO = @ECHO@
EXEEXT = @EXEEXT@
INCLTDL = @INCLTDL@
INCLUDES = @INCLUDES@
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
LIBHAMLIBTCL = @LIBHAMLIBTCL@
LIBLTDL = @LIBLTDL@
LIBOBJS = @LIBOBJS@
LIBTOOL = @LIBTOOL@
LN_S = @LN_S@
LTHAMLIBTCL = @LTHAMLIBTCL@
LTLIBOBJS = @LTLIBOBJS@
MAINT = @MAINT@
NET = @NET@
OBJDUMP = @OBJDUMP@
OBJEXT = @OBJEXT@
PACKAGE = @PACKAGE@
RANLIB = @RANLIB@
RIGMATRIX = @RIGMATRIX@
STRIP = @STRIP@
VERSION = @VERSION@
am__include = @am__include@
am__quote = @am__quote@
hamlibdocdir = @hamlibdocdir@
install_sh = @install_sh@
lib_LTLIBRARIES = libhamlib-easycomm.la
libhamlib_easycomm_la_SOURCES = easycomm.c
libhamlib_easycomm_la_LDFLAGS = -no-undefined -module -version-info 0:0:0
libhamlib_easycomm_la_LIBADD = ../src/libhamlib.la
noinst_HEADERS = easycomm.h
subdir = easycomm
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
CONFIG_HEADER = $(top_builddir)/include/config.h
CONFIG_CLEAN_FILES =
LTLIBRARIES = $(lib_LTLIBRARIES)
libhamlib_easycomm_la_DEPENDENCIES = ../src/libhamlib.la
am_libhamlib_easycomm_la_OBJECTS = easycomm.lo
libhamlib_easycomm_la_OBJECTS = $(am_libhamlib_easycomm_la_OBJECTS)
DEFS = @DEFS@
DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include
CPPFLAGS = @CPPFLAGS@
LDFLAGS = @LDFLAGS@
LIBS = @LIBS@
depcomp = $(SHELL) $(top_srcdir)/depcomp
@AMDEP_TRUE@DEP_FILES = $(DEPDIR)/easycomm.Plo
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) \
$(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
CCLD = $(CC)
LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
$(AM_LDFLAGS) $(LDFLAGS) -o $@
CFLAGS = @CFLAGS@
DIST_SOURCES = $(libhamlib_easycomm_la_SOURCES)
HEADERS = $(noinst_HEADERS)
DIST_COMMON = $(noinst_HEADERS) Makefile.am Makefile.in
SOURCES = $(libhamlib_easycomm_la_SOURCES)
all: all-am
.SUFFIXES:
.SUFFIXES: .c .lo .o .obj
mostlyclean-libtool:
-rm -f *.lo
clean-libtool:
-rm -rf .libs _libs
distclean-libtool:
-rm -f libtool
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.ac $(ACLOCAL_M4)
cd $(top_srcdir) && \
$(AUTOMAKE) --gnu easycomm/Makefile
Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status
cd $(top_builddir) && \
CONFIG_HEADERS= CONFIG_LINKS= \
CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status
install-libLTLIBRARIES: $(lib_LTLIBRARIES)
@$(NORMAL_INSTALL)
$(mkinstalldirs) $(DESTDIR)$(libdir)
@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
if test -f $$p; then \
echo " $(LIBTOOL) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$p $(DESTDIR)$(libdir)/$$p"; \
$(LIBTOOL) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$p $(DESTDIR)$(libdir)/$$p; \
else :; fi; \
done
uninstall-libLTLIBRARIES:
@$(NORMAL_UNINSTALL)
@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
echo " $(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)$(libdir)/$$p"; \
$(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)$(libdir)/$$p; \
done
clean-libLTLIBRARIES:
-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
libhamlib-easycomm.la: $(libhamlib_easycomm_la_OBJECTS) $(libhamlib_easycomm_la_DEPENDENCIES)
$(LINK) -rpath $(libdir) $(libhamlib_easycomm_la_LDFLAGS) $(libhamlib_easycomm_la_OBJECTS) $(libhamlib_easycomm_la_LIBADD) $(LIBS)
mostlyclean-compile:
-rm -f *.$(OBJEXT) core *.core
distclean-compile:
-rm -f *.tab.c
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/easycomm.Plo@am__quote@
distclean-depend:
-rm -rf $(DEPDIR)
.c.o:
@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
$(COMPILE) -c `test -f $< || echo '$(srcdir)/'`$<
.c.obj:
@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
$(COMPILE) -c `cygpath -w $<`
.c.lo:
@AMDEP_TRUE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@
@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
$(LTCOMPILE) -c -o $@ `test -f $< || echo '$(srcdir)/'`$<
CCDEPMODE = @CCDEPMODE@
uninstall-info-am:
tags: TAGS
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) ' { files[$$0] = 1; } \
END { for (i in files) print i; }'`; \
mkid -fID $$unique $(LISP)
TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
$(TAGS_FILES) $(LISP)
tags=; \
here=`pwd`; \
list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) ' { files[$$0] = 1; } \
END { for (i in files) print i; }'`; \
test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
|| etags $(ETAGS_ARGS) $$tags $$unique $(LISP)
GTAGS:
here=`CDPATH=: && cd $(top_builddir) && pwd` \
&& cd $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) $$here
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
top_distdir = ..
distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
distdir: $(DISTFILES)
@for file in $(DISTFILES); do \
if test -f $$file; then d=.; else d=$(srcdir); fi; \
dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
if test "$$dir" != "$$file" && test "$$dir" != "."; then \
$(mkinstalldirs) "$(distdir)/$$dir"; \
fi; \
if test -d $$d/$$file; then \
cp -pR $$d/$$file $(distdir) \
|| exit 1; \
else \
test -f $(distdir)/$$file \
|| cp -p $$d/$$file $(distdir)/$$file \
|| exit 1; \
fi; \
done
check-am: all-am
check: check-am
all-am: Makefile $(LTLIBRARIES) $(HEADERS)
installdirs:
$(mkinstalldirs) $(DESTDIR)$(libdir)
install: install-am
install-exec: install-exec-am
install-data: install-data-am
uninstall: uninstall-am
install-am: all-am
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
installcheck: installcheck-am
install-strip:
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
`test -z '$(STRIP)' || \
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
mostlyclean-generic:
clean-generic:
distclean-generic:
-rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]*
maintainer-clean-generic:
@echo "This command is intended for maintainers to use"
@echo "it deletes files that may require special tools to rebuild."
clean: clean-am
clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
mostlyclean-am
distclean: distclean-am
distclean-am: clean-am distclean-compile distclean-depend \
distclean-generic distclean-libtool distclean-tags
dvi: dvi-am
dvi-am:
info: info-am
info-am:
install-data-am:
install-exec-am: install-libLTLIBRARIES
install-info: install-info-am
install-man:
installcheck-am:
maintainer-clean: maintainer-clean-am
maintainer-clean-am: distclean-am maintainer-clean-generic
mostlyclean: mostlyclean-am
mostlyclean-am: mostlyclean-compile mostlyclean-generic \
mostlyclean-libtool
uninstall-am: uninstall-info-am uninstall-libLTLIBRARIES
.PHONY: GTAGS all all-am check check-am clean clean-generic \
clean-libLTLIBRARIES clean-libtool distclean distclean-compile \
distclean-depend distclean-generic distclean-libtool \
distclean-tags distdir dvi dvi-am info info-am install \
install-am install-data install-data-am install-exec \
install-exec-am install-info install-info-am \
install-libLTLIBRARIES install-man install-strip installcheck \
installcheck-am installdirs maintainer-clean \
maintainer-clean-generic mostlyclean mostlyclean-compile \
mostlyclean-generic mostlyclean-libtool tags uninstall \
uninstall-am uninstall-info-am uninstall-libLTLIBRARIES
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:

333
easycomm/easycomm.c 100644
Wyświetl plik

@ -0,0 +1,333 @@
/*
* Hamlib Rotator backend - Easycom
* Copyright (c) 2001,2002 by Stephane Fillod
* Contributed by Francois Retief <fgretief@sun.ac.za>
*
* $Id: easycomm.c,v 1.1 2002-01-16 16:35:22 fgretief Exp $
*
* This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <stdlib.h>
#include <stdio.h> /* Standard input/output definitions */
#include <string.h> /* String function definitions */
#include <unistd.h> /* UNIX standard function definitions */
#include <fcntl.h> /* File control definitions */
#include <errno.h> /* Error number definitions */
#include <termios.h> /* POSIX terminal control definitions */
#include <sys/ioctl.h>
#include <math.h>
#include <hamlib/rotator.h>
#include <serial.h>
#include <misc.h>
#include "easycomm.h"
#define USE_CUSTOM_CODE 1
/* ************************************************************************* */
/**
* easycomm_transaction
*
* Assumes rot!=NULL and cmdstr!=NULL
*
* cmdstr - string to send to rotator
* data - buffer for reply string
* data_len - (input) Maximum size of buffer
* (output) Number of bytes read.
*/
static int
easycomm_transaction (ROT *rot, const char *cmdstr, char *data, size_t data_len)
{
struct rot_state *rs;
int retval;
rs = &rot->state;
retval = write_block(&rs->rotport, cmdstr, strlen(cmdstr));
if (retval != RIG_OK) {
return retval;
}
if (data == NULL || data_len <= 0)
return RIG_OK; /* don't want a reply */
retval = read_string(&rs->rotport, data, data_len, "\n");
if (retval < 0)
return retval; /* error */
/* TODO: Error checking */
return RIG_OK;
}
/* ************************************************************************* */
static int
easycomm_rot_set_position(ROT *rot, azimuth_t az, elevation_t el)
{
unsigned char cmdstr[64], ackstr[64];
int retval;
rig_debug(RIG_DEBUG_TRACE, __FUNCTION__" called: %f %f\n", az, el);
sprintf(cmdstr, "AZ%.1f EL%.1f UP000 XXX DN000 XXX\n", az, el);
retval = easycomm_transaction(rot, cmdstr, ackstr, sizeof(ackstr));
if (retval != RIG_OK) {
return retval;
}
/* TODO: Error processing */
return RIG_OK;
}
static int
easycomm_rot_get_position(ROT *rot, azimuth_t *az, elevation_t *el)
{
unsigned char cmdstr[16], ackbuf[32];
int retval;
int t;
rig_debug(RIG_DEBUG_TRACE, __FUNCTION__" called\n");
#ifdef USE_CUSTOM_CODE
sprintf(cmdstr, "!"); /* Custom implementation: Remove later */
#else
sprintf(cmdstr, "AZ EL \n");
#endif
retval = easycomm_transaction(rot, cmdstr, ackbuf, sizeof(ackbuf));
if (retval != RIG_OK) {
return retval;
}
/* Parse parse string to extract AZ,EL values */
#ifdef USE_CUSTOM_CODE
retval = sscanf(ackbuf, "TM%i AZ%f EL%f", &t, az, el);
if (retval != 3) {
rig_debug(RIG_DEBUG_ERR, __FUNCTION__": unknown replay (%s)\n", ackbuf);
return -RIG_ERJCTED;
}
#ifndef USETESTCODE
/* Correct for desimal point. */
*az /= 10.0;
*el /= 10.0;
#else
/* Debugging code, remove later */
rig_debug(RIG_DEBUG_TRACE, " (az, el) = (%.1f, %.1f)\n", *az, *el);
*az /= 10.0;
*el /= 10.0;
rig_debug(RIG_DEBUG_TRACE, " (az, el) = (%f, %f)\n", *az, *el);
rig_debug(RIG_DEBUG_TRACE, " (az, el) = (%.2f, %.2f)\n", *az, *el);
/* Note: For some reason I found that the result of this expression
* does not give accurate results.
* The first printf give the correct value.
* The second printf give incorrect value, while
* the third printf give correct values.
*
* I get az = 42.79999 when it should be 42.8
*/
#endif
#else
*az = 45.3;
*el = 10.3;
#endif
return RIG_OK;
}
static int
easycomm_rot_stop(ROT *rot)
{
unsigned char ackbuf[32];
int retval;
rig_debug(RIG_DEBUG_TRACE, __FUNCTION__" called\n");
retval = easycomm_transaction(rot, "SA SE \n", ackbuf, sizeof(ackbuf));
if (retval != RIG_OK)
return retval;
/* TODO: error processing */
return RIG_OK;
}
static int
easycomm_rot_reset(ROT *rot, rot_reset_t rst)
{
unsigned char ackbuf[32];
int retval;
rig_debug(RIG_DEBUG_TRACE, __FUNCTION__" called\n");
retval = easycomm_transaction(rot, "RESET\n", ackbuf, sizeof(ackbuf));
if (retval != RIG_OK) /* Custom command (not in Easycomm) */
return retval;
return RIG_OK;
}
static int
easycomm_rot_park(ROT *rot)
{
unsigned char ackbuf[32];
int retval;
rig_debug(RIG_DEBUG_TRACE, __FUNCTION__" called\n");
retval = easycomm_transaction(rot, "PARK\n", ackbuf, sizeof(ackbuf));
if (retval != RIG_OK) /* Custom command (not in Easycomm) */
return retval;
return RIG_OK;
}
static int
easycomm_rot_move(ROT *rot, int direction, int speed)
{
char cmdstr[24], ackbuf[32];
int retval;
rig_debug(RIG_DEBUG_TRACE, __FUNCTION__" called\n");
/* Note: speed is unused at the moment */
switch (direction) {
case ROT_MOVE_UP: /* Elevation increase */
sprintf(cmdstr, "MU\n");
break;
case ROT_MOVE_DOWN: /* Elevation decrease */
sprintf(cmdstr, "MD\n");
break;
case ROT_MOVE_LEFT: /* Azimuth decrease */
sprintf(cmdstr, "ML\n");
break;
case ROT_MOVE_RIGHT: /* Azimuth increase */
sprintf(cmdstr, "MR\n");
break;
default:
rig_debug(RIG_DEBUG_ERR,__FUNCTION__": Invalid direction value! (%d)\n", direction);
return -RIG_EINVAL;
}
retval = easycomm_transaction(rot, cmdstr, ackbuf, sizeof(ackbuf));
if (retval != RIG_OK)
return retval;
return RIG_OK;
}
/* ************************************************************************* */
/*
* Easycomm rotator capabilities.
*/
/** EasycommI implement essentially only the set position function, but
* I included the stop command too. The radio control tags is only included
* as dummy entries because the spec require them.
*/
const struct rot_caps easycomm1_rot_caps = {
rot_model: ROT_MODEL_EASYCOMM1,
model_name: "EasycommI",
mfg_name: "Hamlib",
version: "0.1",
copyright: "LGPL",
status: RIG_STATUS_ALPHA,
rot_type: ROT_TYPE_OTHER,
port_type: RIG_PORT_SERIAL,
serial_rate_min: 9600,
serial_rate_max: 19200,
serial_data_bits: 8,
serial_stop_bits: 1,
serial_parity: RIG_PARITY_NONE,
serial_handshake: RIG_HANDSHAKE_NONE,
write_delay: 0,
post_write_delay: 0,
timeout: 200,
retry: 3,
min_az: -180.0,
max_az: 180.0,
min_el: 0.0,
max_el: 90.0,
priv: NULL, /* priv */
set_position: easycomm_rot_set_position,
stop: easycomm_rot_stop,
};
/* EasycommII implement most of the functions. Again the radio tags
* is only dummy values.
*/
const struct rot_caps easycomm2_rot_caps = {
rot_model: ROT_MODEL_EASYCOMM2,
model_name: "EasycommII",
mfg_name: "Hamlib",
version: "0.1",
copyright: "LGPL",
status: RIG_STATUS_ALPHA,
rot_type: ROT_TYPE_OTHER,
port_type: RIG_PORT_SERIAL,
serial_rate_min: 9600,
serial_rate_max: 19200,
serial_data_bits: 8,
serial_stop_bits: 1,
serial_parity: RIG_PARITY_NONE,
serial_handshake: RIG_HANDSHAKE_NONE,
write_delay: 0,
post_write_delay: 0,
timeout: 200,
retry: 3,
min_az: -180.0,
max_az: 180.0,
min_el: 0.0,
max_el: 90.0,
priv: NULL, /* priv */
rot_init: NULL,
rot_cleanup: NULL,
rot_open: NULL,
rot_close: NULL,
get_position: easycomm_rot_get_position,
set_position: easycomm_rot_set_position,
stop: easycomm_rot_stop,
park: easycomm_rot_park,
reset: easycomm_rot_reset,
move: easycomm_rot_move,
get_info: NULL,
};
/* ************************************************************************* */
int initrots_easycomm(void *be_handle)
{
rig_debug(RIG_DEBUG_VERBOSE, __FUNCTION__" called\n");
rot_register(&easycomm1_rot_caps);
rot_register(&easycomm2_rot_caps);
return RIG_OK;
}
/* ************************************************************************* */
/* end of file */

Wyświetl plik

@ -0,0 +1,32 @@
/*
* Hamlib Rotator backend - Easycomm interface protocol
* Copyright (c) 2001,2002 by Stephane Fillod
* Contributed by Francois Retief <fgretief@sun.ac.za>
*
* $Id: easycomm.h,v 1.1 2002-01-16 16:35:22 fgretief Exp $
*
* This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*/
#ifndef _ROT_EASYCOMM_H
#define _ROT_EASYCOMM_H 1
extern const struct rot_caps easycomm1_rot_caps;
extern const struct rot_caps easycomm2_rot_caps;
extern BACKEND_EXPORT(int) initrots_easycomm(void *be_handle);
#endif /* _ROT_EASYCOMM_H */

Wyświetl plik

@ -0,0 +1,85 @@
The following are the specifications for the EasyComm interfaces which
are available with the WiSP programs. Both EasyComm 1 and EasyComm2 are
available in WiSP32. Only EasyComm1 is available with WiSP31. The EasyComm
interfaces are for use by those who wish to design their own radio and rotor
controllers.
EASYCOMM I Standard
-------------------
The EasyComm 1 standard is a simple ASCII character based standard for
controling antennas and rotators.
The host PC issues a single line command as follows -:
AZaaa.a ELeee.e UPuuuuuuuuu UUU DNddddddddd DDD
The Az and El values (aaa.a and eee.e) are not fixed width. They are in
degrees and include 1 decimal place.
The Up and Dn frequencies are in Hz.
UUU and DDD are the uplink and downlink mode.
EASYCOMM II Standard
--------------------
The EasyComm 2 standard is an enhanced protocol to allow full station
control and also feedback from external systems.
The host PC issues commands to the controller by sending a 2 character
command identifier followed by the command value. Commands are
separated by either a space or carriage return or linefeed.
Not all commands need to be implemented, and the most basic system
may only decode the rotator control commands.
The Host PC can issue the following commands -:
Command Meaning Perameters
------- ------- ----------
AZ Azimuth number - 1 decimal place
EL Elevation number - 1 decimal place
UP Uplink freq in Hertz
DN Downlink freq in Hertz
DM Downlink Mode ascii, eg SSB, FM
UM Uplink Mode ascii, eg SSB, FM
DR Downlink Radio number
UR Uplink Radio number
ML Move Left
MR Move Right
MU Move Up
MD Move Down
SA Stop azimuth moving
SE Stop elevation moving
AO AOS
LO LOS
OP Set output number
IP Read an input number
AN Read analogue input number
ST Set time YY:MM:DD:HH:MM:SS
VE Request Version
For those commands that require a response, the response is an echo of
the command followed by the response. If the command specifies a field
number (eq. AN or IP), then the two numbers are delimited with a comma.
eg. To read an analogue value, the host sends ANx where x is the
analogue channel number.
In response the controller will reply with ANx,yyy where yyy is the
value read on the analogue port.
eg. To find the controller version number, the host sends VE.
In response the controller sends VExxx where xxx is an ascii string
containing the version number.
All strings sent in either direction are not of fixed length.
The controller can also send unsolicited information back to the
host. This information may be used by the host for alarms or just
control feedback. All of the above commands may be sent by the
controller for information, and in addition the following may also
be sent
ALxxx Alarm, where xxxx is an ascii string with the alarm info.
Chris Jackson, G7UPN