#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <ctype.h>

#include <workbench/startup.h>
#include <exec/types.h>
#include <exec/memory.h>
#include <exec/errors.h>
#include <exec/ports.h>
#include <devices/audio.h>
#include <devices/narrator.h>
#include <devices/timer.h>
#include <hardware/dmabits.h>
#include <hardware/custom.h>
#include <intuition/intuition.h>
#include <intuition/screens.h>
#include <intuition/gadgetclass.h>
#include <intuition/classusr.h>
#include <intuition/imageclass.h>
#include <intuition/classes.h>
#include <intuition/icclass.h>
#include <graphics/text.h>
#include <graphics/gfxbase.h>
#include <libraries/gadtools.h>
#include <rexx/rxslib.h>
#include <workbench/workbench.h>
#include <workbench/startup.h>
#include <clib/dos_protos.h>
#include <clib/exec_protos.h>
#include <clib/icon_protos.h>
#include <clib/gadtools_protos.h>
#include <clib/graphics_protos.h>
#include <clib/intuition_protos.h>
#include <clib/diskfont_protos.h>
#include <clib/alib_protos.h>
#include <clib/mathtrans_protos.h>
#include <clib/rexxsyslib_protos.h>


#ifndef PI
#define PI        ((float) 3.141592653589793)
#endif
#define round(x)  ((int) ((x) + 0.5))

#define NB_REXXCMD  3

#define EOF     -1

#define RIGHT0F	1
#define LEFT0F	2
#define LEFT1F	4
#define RIGHT1F	8

// la taille est en octet mais le processeur de son manipule des mots. Il faut donc un nombre pair

#define SINETABLEPOWER2         10
#define SINETABLESIZE           (1 << SINETABLEPOWER2)
#define SINETABLESTEP           (2 * 3.141592654 / SINETABLESIZE)

/*		Mesures réalisées avec un multimètre FLUKE 87 */

#define FREQRAN1                26		/* fréquence recherchée 697 Hz fréquence obtenue 695 Hz */
#define FREQRAN2                30      /* fréquence recherchée 770 Hz fréquence obtenue 770 Hz */
#define FREQRAN3                33      /* fréquence recherchée 852 Hz fréquence obtenue 852 Hz */
#define FREQRAN4                35      /* fréquence recherchée 941 Hz fréquence obtenue 942 Hz */
#define FREQCOL1                46      /* fréquence recherchée 1209 Hz fréquence obtenue 1208 Hz */
#define FREQCOL2                50      /* fréquence recherchée 1336 Hz fréquence obtenue 1339 Hz */
#define FREQCOL3                54      /* fréquence recherchée 1447 Hz fréquence obtenue 1443 Hz */
#define FREQCOL4                62      /* fréquence recherchée 1633 Hz fréquence obtenue 1636 Hz */

#define MAXNUM                  15
#define LNUM                    8
#define HNUM                    26
#define LAFF                    6
#define TAFF                    12
#define WAFF                    187
#define HAFF                    28
#define MAXLINE                 12          // nombre de ligne constituant la fiche.

#define STRGADGCAR              31L
#define STRGADGCOD              6L
#define STRGADGTEL              16L
#define STRGADGORD              4L

#define OFFSET_FICHE			4

#define POSLAST                 0L
#define POSNEXT                 (POSLAST +      STRGADGORD)
#define POSNOM                  (POSNEXT +      STRGADGORD)
#define POSPRENOM               (POSNOM +       STRGADGCAR)
#define POSADDRESS1             (POSPRENOM +    STRGADGCAR)
#define POSADDRESS2             (POSADDRESS1 +  STRGADGCAR)
#define POSCODE                 (POSADDRESS2 +  STRGADGCAR)
#define POSVILLE                (POSCODE +      STRGADGCOD)
#define POSPAYS                 (POSVILLE +     STRGADGCAR)
#define POSTEL1                 (POSPAYS +      STRGADGCAR)
#define POSTEL2                 (POSTEL1 +      STRGADGTEL)
#define POSFAX                  (POSTEL2 +      STRGADGTEL)
#define POSNOTE1                (POSFAX +       STRGADGTEL)
#define POSNOTE2                (POSNOTE1 +     STRGADGCAR)
#define NEXTRECORD              (POSNOTE2 +     STRGADGCAR)

struct coordonnee
{
	long    LastRecord;
	long    NextRecord;
	char    nom[STRGADGCAR];
	char    prenom[STRGADGCAR];
	char    adresse1[STRGADGCAR];
	char    adresse2[STRGADGCAR];
	char    codepost[STRGADGCOD];
	char    ville[STRGADGCAR];
	char    pays[STRGADGCAR];
	char    telephone1[STRGADGTEL];
	char    telephone2[STRGADGTEL];
	char    fax[STRGADGTEL];
	char    note1[STRGADGCAR];
	char    note2[STRGADGCAR];
};

extern struct WBStartup *WBenchMsg;
extern struct Gadget *FirstStringGadget;
extern struct Screen *pubScreen;
extern struct DrawInfo *PubDrawInfo;
extern struct Image ImageTel;
extern struct Image clavier;
extern struct coordonnee abonne;
extern struct MsgPort *allocPort;
extern struct MsgPort *rexxPort;
extern struct IOAudio *soundIOB;
extern struct Window *MyWindow;
extern struct Window *FileWindow;
extern struct TextFont *LCDFont;
extern struct TextFont *CyberFont;
extern struct Gadget *gadText;
extern struct coordonnee abonne;
extern struct Library *DiskfontBase;
extern struct Library *IconBase;
extern struct GfxBase *GfxBase;
extern struct IntuitionBase *IntuitionBase;
extern struct timerequest *tr;

extern APTR *vi;
extern USHORT ImageTelData[240];
extern USHORT HeightScreenFont,
        WidthScreenFont;

extern BOOL FromWB;

extern FILE *conwin;

extern WORD channels;

extern BPTR fileRepertoire;

extern ULONG rexxPortBit;
extern char Chaine[MAXNUM + 1];

extern BYTE Numero[MAXNUM],
        Num, composeNom, GUI, allocationMap[], allocationMapLeft[], allocationMapRight[];

extern int LenNum, FileWindowNotClosed = 1;

extern UWORD offx,
        offy;

extern struct IOAudio *allocIOB;
extern struct timerequest *tr;
extern WORD channels,
		channel0,
		channel1,
		winRepLeft, winRepTop, winClavLeft, winClavTop;

extern char prefChannel;

extern struct timerequest *tr;
extern struct timeval timePulse, timeSpace, timePause;


extern struct Gadget *InitStrGadget(struct Window *, char *, UBYTE *, int, int, int);
extern void OpenAll(void);
extern void cleanUp(TEXT *, int);
extern void HandleFileWindow(ULONG, UWORD, APTR);
extern int Recherche(void);
extern void Repertoire(void);
extern Recompose(BYTE *);
extern void Ajoute(void);
extern void CreeMenuR(void);
extern void DeleteStringGadgets(struct Window *, struct Gadget *);
extern void free_prop(struct PropGadget *);
