/* 
 * Copyright (C) 2004 Darren Hutchinson (dbh@gbdt.com.au)
 * 
 * This program 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 software; see the file COPYING.  If not, write to
 * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
 * MA 02111-1307, USA. 
 *
 * $Id: paddle.h,v 1.2 2004/03/03 07:37:11 dbh Exp $
 */

#ifndef _PADDLE_H_
#define _PADDLE_H_

/* This file describes the data in the EQ6/Atlas hand paddle serial stream.
 *
 * This is a one-directional serial stream at 935 bits/sec. This is a fairly
 * wierd speed that seems to be used to give an overall serial stream time
 * of 76.2ms [basically the full-step time for siderial rate, which is
 * half of the actual half-step rate].
 *
 * See the file eq6-serial.txt for further details.
 */
#include <inttypes.h>

/* Define the serial rate used by the paddle
 */
#define PADDLE_RATE	935L		/* Bit rate for the paddle */

/* The serial stream is a set of 6, 9 bit words. The first three words
 * are for RA control, the second three words are for DEC control.
 *
 * Note that the ordering here is arbitary (through reverse engineering), but
 * seems sensible.
 *
 * Word1:	RA sync (B8 = 0)
 * Word2:	RA direction (B8 = 0)
 * Word3:	RA speed (B8 = 0)
 * Word4:	??? (Assumed to be DEC sync) (B8 = 1)
 * Word5:	DEC direction (B8 = 1)
 * Word6:	DEC speed (B8 = 1)
 *
 */

/* Word #1 - RA SYNC
 */
#define RA_SYNC		0x7e

/* Word #2 - RA DIRECTION
 */
#define RA_DIR_BIT	0	// RA Direction bit
#define RA_DIR_LEFT	0
#define RA_DIR_RIGHT	(1 << RA_DIR_BIT)

/* Note: Will be 0 for southern hemispere siderial, 1 for northern siderial
 */


/* Word #3 - RA SPEED
 */
#define RA_SPEED_MASK	0x0f	// Speed bits
#define RA_SPEED_0	0x00	// x2, opposite direction to siderial
#define RA_SPEED_1	0x01	// No RA button pressed
#define RA_SPEED_2	0x02	// x2, same direction as siderial
#define RA_SPEED_8	0x04	// siderial x8
#define RA_SPEED_16	0x08	// siderial x16

/* Word #4 - ???. This word always seems to be zero. Assume it's a sync word
 * unless we hear something different
 */
#define DEC_SYNC	0x00

/* Word #5 - DEC DIRECTION
 */
#define DEC_DIR_BIT	0	// DEC Direction bit
#define DEC_DIR_UP	0
#define DEC_DIR_DOWN	(1 << DEC_DIR_BIT)

/* Word #6 - DEC SPEED
 */
#define DEC_SPEED_MASK	0x0f	// Speed bits
#define DEC_SPEED_0	0x00	// No buttons pressed
#define DEC_SPEED_2	0x02	// siderial x2
#define DEC_SPEED_8	0x04	// siderial x8
#define DEC_SPEED_16	0x08	// siderial x16

/* Prototypes for paddle.c functions that can be called from outside
 */
extern void paddleInit(void);

extern uint8_t	paddleDecRate;
extern uint8_t	paddleRaRate;
extern uint8_t	siderialRate;

/* Configuration variable - sets whether the 2X rate for the paddle should
 * be considered as 1X or 0.3X
 */
extern uint8_t  paddleGuideRate;
#endif /* _PADDLE_H_ */
