/***********************************************************

	picsys18.h

	Version 1.00: 2009/10/12

	Copyright (C) 2008-2009, MicroFan Div., PeopleMedia, Inc.
	All rights reserved.

***********************************************************/

#ifndef PICSYS18_H_
#define PICSYS18_H_

#include <p18cxxx.h>
#include <delays.h>
#include <stdlib.h>
#include<string.h>

#define	MHz	*1000000UL
#define	KHz	*1000UL
#define	Hz	*1UL

#include "picsys18conf.h"

#if defined(XTAL_OSC)
#define	F_CPU	XTAL_OSC
#elif defined(INT_OSC)
#define	F_CPU	INT_OSC
#else
#error 発信器と周波数の指定がありません
#endif

#if F_CPU >= 16MHz
#define	HEART_BEAT	(2KHz)
#else
#define	HEART_BEAT	(1KHz)
#endif

/************************************************/

#if defined(__18F2420) || defined(__18F2520)|| defined(__18F2620)
#define	__18F28PIN
#elif defined(__18F4550)
#define	__18F40PIN
#define __USB
#elif defined(__18F2550) || defined(__18F2553)
#define	__18F28PIN
#define __USB
#elif defined(__18F26J50) || defined(__18F25J50) || defined(__18F24J50)
#define	__18FJ28PIN
#define __USB
#endif

/************************************************/

typedef enum _BOOL { FALSE = 0, TRUE } BOOL;	// Undefined size
/*
#define	TRUE	1
#define	FALSE	0
*/

#define	HIGH	1
#define	LOW		0

typedef unsigned char BYTE ;

#define	BIT(n)	(0b00000001 << (n))


/*------------------------------------------------
	I/Oポートの定義
------------------------------------------------*/

#define	ID_ANL	0
#define	ID_ANH	1
#define	ID_PORTA	2
#define	ID_PORTB	3
#define	ID_PORTC	4
#define	ID_PORTD	5
#define	ID_PORTE	6
#define	ID_PORTF	7
#define	ID_PORTG	8
#define	ID_PORTH	9
#define	ID_PORTI	10
#define	ID_PORTJ	11
#define	ID_VSW	15

#define	NO_ASSIGN	0xff

#define	isAN(n)	((n & 0b1110000) == 0b0000000)

#define	AN(pin)	(pin)

#define	GET_PORT(pin)	(pin >> 3)

#define	RA(pin)	((ID_PORTA << 3) | pin)
#define	RB(pin)	((ID_PORTB << 3) | pin)
#define	RC(pin)	((ID_PORTC << 3) | pin)
#define	RD(pin)	((ID_PORTD << 3) | pin)
#define	RE(pin)	((ID_PORTE << 3) | pin)
#define	VSW(pin)	((ID_VSW << 3) | pin)


/*------------------------------------------------
	ピンモードの定義
------------------------------------------------*/

#define	INPUT 1
#define	OUTPUT 0

#define	IN_ANALOG	2

#define	OUT_BEEP	3
#define	OUT_PWM1	0b1000
#define	OUT_PWM2	0b1001
#define	OUT_PWM3	0b1010
#define	OUT_PWM4	0b1011
#define	OUT_SERVO1	0b1100
#define	OUT_SERVO2	0b1101
#define	OUT_SERVO3	0b1110
#define	OUT_SERVO4	0b1111

#define	isPWM(n)	((n & 0b1100) == 0b1000)
#define	isSERVO(n)	((n & 0b1100) == 0b1100)


/************************************************/

// RCサーボの中立パルス幅(マイクロ秒)
#define	SERVO_NEUTRAL	1500 
// RCサーボのパルスの最大変位量(マイクロ秒)
#define	SERVO_MINMAX	500


/************************************************/

void pinMode(BYTE, BYTE) ;
void digitalWrite(BYTE, int) ;
void bitOut(BYTE, int) ;
int digitalRead(BYTE) ;

#define	MSBFIRST	1
#define	LSBFIRST	0

void shiftOut(BYTE, BYTE, BYTE, BYTE) ;

int analogRead(BYTE) ;
void analogWrite(BYTE, int) ;
void analogReference(BYTE) ;

#define	DEFAULT	0
#define	EXTERNAL	1

/************************************************/

void delayMicroseconds(unsigned int) ;
void delayMilliseconds(unsigned int) ;

unsigned long millis(void) ;


/************************************************/

void isrFunc() ;

#define	interrupts()	{ INTCONbits.GIEL = 1 ; }
#define	noInterrupts()	{ INTCONbits.GIEL = 0 ; }


/************************************************/

#ifdef OPTIMIZE
void isr_optShiftOut(BYTE, BYTE) ;
#endif

void isr_pinMode(BYTE, BYTE) ;
void isr_bitOut(BYTE, int) ;
int isr_digitalRead(BYTE) ;
void isr_shiftOut(BYTE, BYTE, BYTE, BYTE) ;


/************************************************/

#if defined(PIC_DEV_2550URL)
void SW_init(void) ;
BYTE SW_read(BYTE) ;

/* 割り込み中に利用 */
void isr_SW_update(void) ;
#endif

/************************************************/

extern char _fmtbuf[] ;
int ltos(char [], long, BYTE) ;
char *ftos(char [], float, char) ;


/************************************************/

void setup(void) ;
void loop(void) ;


/************************************************/

#ifdef PICSYS18_SP
#if !defined(__18F4550)
#error MCUチップの設定が間違っています
#endif

#include "..\board\picsys18-sp.h"

#define USE_SEG7

#endif

#ifdef PICSYS18_XBEE
#if !(defined(__18F26J50) || defined(__18F25J50)|| defined(__18F24J50))
#error MCUチップの設定が間違っています
#endif

#include "..\board\picsys18-xbee.h"
#endif

#ifdef PIC_DEV_2420RL
#if !(defined(__18F2420) || defined(__18F2520)|| defined(__18F2620))
#error MCUチップの設定が間違っています
#endif

#include "..\board\pic-dev-2420rl.h"
#endif

#ifdef PIC_DEV_2550URL
#if !(defined(__18F2550) || defined(__18F2553))
#error MCUチップの設定が間違っています
#endif

#include "..\board\pic-dev-2550url.h"
#endif

#ifdef PIC18F_MOD_2553
#if !(defined(__18F2550) || defined(__18F2553))
#error MCUチップの設定が間違っています
#endif

#include "..\board\pic18f-mod-2553.h"
#endif

#ifdef PIC_DML_2520
#if !(defined(__18F2420) || defined(__18F2520)|| defined(__18F2620))
#error MCUチップの設定が間違っています
#endif

#include "..\board\pic-dml-2520.h"

#ifdef USE_CLCD
#undef USE_CLCD
#endif

#ifdef USE_SEG7
#undef USE_SEG7
#endif

#ifndef USE_DML
#define	USE_DML
#endif

#endif


/************************************************/

#include "pic18timer.h"
#if defined(USE_USB)
#include "pic18usbcdc.h"
#endif
#include "pic18serial.h"
#include "pic18clcd.h"
#include "pic18seg7.h"
#include "pic18dml.h"


#endif /*PICSYS18_H_*/
