/*
	Private header file for magtape:
*/

#include <Xm/PrimitiveP.h>


#define MirrorY 1175.0f
#define TopReelX 233.0f
#define TopReelY 267.0f
#define TopReelOuterR 215.0f
#define TopReelInnerR 94.0f
#define TopReelLabelWidth 150.0f
#define TopReelLabelHeight 50.0f
#define TopReelLabelDistance 150.0f
#define TopCornerX 484.0f
#define TopCornerY 247.0f
#define TopCornerOuterR 11.0f
#define TopCornerInnerR 5.0f
#define TopChamperInX 396.0f
#define TopChamperInY 483.0f
#define TopChamperInInnerR 9.0f
#define TopChamperInOuterR 34.5f
#define TopChamperOuter1X 389.0f
#define TopChamperOuter1Y 488.0f
#define TopChamperOuter2X 725.0f
#define TopChamperOuter2Y 29.0f
#define TopChamperOuter3X 807.0f
#define TopChamperOuter3Y 95.0f
#define TopChamperOuter4X 472.0f
#define TopChamperOuter4Y 555.0f
#define TopChamperInner1X 397.0f
#define TopChamperInner1Y 496.0f
#define TopChamperInner2X 728.0f
#define TopChamperInner2Y 46.0f
#define TopChamperInner3X 793.0f
#define TopChamperInner3Y 98.0f
#define TopChamperInner4X 463.0f
#define TopChamperInner4Y 549.0f
#define TopChamperOutX 473.0f
#define TopChamperOutY 536.0f
#define TopChamperOutR 10.0f
#define Head1X 546.0f
#define Head1Y 579.0f
#define Head2X 546.0f
#define Head2Y 543.0f
#define Head3X 577.0f
#define Head3Y 523.0f
#define Head4X 601.0f
#define Head4Y 523.0f
#define Head5X 631.0f
#define Head5Y 543.0f
#define Head6X 631.0f
#define Head6Y 579.0f
#define CapstanX 706.0f
#define CapstanY 593.0f
#define CapstanR 43.0f
#define BottomReelX 233.0f
#define BottomReelY (MirrorY-267.0f)
#define BottomReelOuterR 215.0f
#define BottomReelInnerRx 94.0f
#define BottomReelInnerR 84.0f
#define BottomCornerX 484.0f
#define BottomCornerY (MirrorY-247.0f)
#define BottomCornerOuterR 11.0f
#define BottomCornerInnerR 5.0f
#define BottomChamperInX 396.0f
#define BottomChamperInY (MirrorY-483.0f)
#define BottomChamperInOuterR 34.5f
#define BottomChamperInInnerR 9.0f
#define BottomChamperOuter1X 389.0f
#define BottomChamperOuter1Y (MirrorY-488.0f)
#define BottomChamperOuter2X 725.0f
#define BottomChamperOuter2Y (MirrorY-29.0f)
#define BottomChamperOuter3X 807.0f
#define BottomChamperOuter3Y (MirrorY-95.0f)
#define BottomChamperOuter4X 472.0f
#define BottomChamperOuter4Y (MirrorY-555.0f)
#define BottomChamperInner1X 397.0f
#define BottomChamperInner1Y (MirrorY-496.0f)
#define BottomChamperInner2X 728.0f
#define BottomChamperInner2Y (MirrorY-46.0f)
#define BottomChamperInner3X 793.0f
#define BottomChamperInner3Y (MirrorY-98.0f)
#define BottomChamperInner4X 463.0f
#define BottomChamperInner4Y (MirrorY-549.0f)
#define BottomChamperOutX 473.0f
#define BottomChamperOutY (MirrorY-536.0f)
#define BottomChamperOutR 10.0f

/*  status:

*/
#define FORWARD_ACCELERATE 21
#define FORWARD_KEEP 22
#define FORWARD_DECELERATE 23

#define REVERSE_ACCELERATE 31
#define REVERSE_KEEP 32
#define REVERSE_DECELERATE 33

#define REWIND_ACCELERATE 41
#define REWIND_KEEP 42
#define REWIND_DECELERATE 43

/* speed, in m/s */

#define READSPEED (36.0*0.0254)
#define REWINDSPEED (180.0*0.0254)
// It can accelerate to READSPEED in 0.01 secs
// capstanAcceleration = 36*0.0254/0.01 = 91.44 m/s²
// However, we want to do it in one framerate (1/60 sec):
#define CAPSTANACCELERATION (36.0*0.0254*60.0)
#define XMAX 830
#define YMAX 1170

#define wXMAX 247
#define wYMAX 350

  /* pixels per m 215/0.1325=1622.64 pixels/m*/
#define PIXELSPERM (BottomReelOuterR/0.1325)
#define THICKNESS (2.43e-3*0.0254)
  /* help3 block: 400 words
     density 200/556 cpi
     gap 0.75"
     6 bit + parity / character

  record: 200 cpi: 400*7/200 + 0.75 = 14.75" = 0.37465 m
	  556 cpi: 400*7/556 + 0.75 = 5.79" =  0.147 m

  champer length: 34.42 cm
  width:          5.13 cm
  */
#define CHAMPERLENGTH 0.3442
#define CHAMPERWIDTH 0.0513
#define IDLE_SPEED (0.01)
#define MAXCHAMPERTAPELENGTH (2.0*CHAMPERLENGTH-CHAMPERWIDTH*0.5+CHAMPERWIDTH*M_PI)

#define SQR(x)  ((x)*(x))
#define SIGN(x) ( (x)<0.0?-1.0:((x)>0.0?1.0:0.0) )

typedef struct _XsMagTapeClassPart
{
  int ignore;
} XsMagTapeClassPart;

typedef struct _XsMagTapeClassRec
{
  CoreClassPart core_class;
  XmPrimitiveClassPart primitive_class;
  XsMagTapeClassPart magTape_class;
} XsMagTapeClassRec;

extern XsMagTapeClassRec XsmagTapeClassRec;

/* Image type - contains height, width, and data */
struct Image {
    unsigned int sizeX;
    unsigned int sizeY;
    char *data;
};
typedef struct Image Image;

typedef struct _XsMagTapePart
{
  Pixel backgroundcolor;
         
  XtCallbackList done;

  GLXContext glx_context;

  XVisualInfo *visualInfo;

  Visual *gl_visual;
  String tapeLabel;
  int unitNo;

  double secs,lastsecs,dsecs,dsecs2,inRadius,outRadius,inRotation,outRotation;
  double capstanSpeed, capstanAcceleration;
  double inSpeed, inAcceleration, inRatio;
  double outSpeed, outAcceleration, outRatio;
  double UAKK;

  double taperead,readstart,tapeappetite,tapeadjust;
  double inTape;
  double outTape;
  double inError;
  double outError;
  double thickness;
  double OUTlength;
  double INlength;
  double radius0;
  struct timespec time0,time1;

  /* The number of our GLUT window */
  Boolean myVisual;
  Colormap cmap;
  int window; 
  int window_width, window_height;
  int fullscreen;
  GLfloat window_aspect;
  GLuint texture[1];
  int status;

  int xmin, xmax, ymin, ymax;

  Image *image1;

} XsMagTapePart;

typedef struct _XsMagTapeRec
{
  CorePart core;
  XsMagTapePart magTape;
} XsMagTapeRec;

