GVC用共通ヘッダファイル(gvc_init.h)

// --------------------------------------------------
// Global Versatile Controler http://www.gvc-on.net/
// --------------------------------------------------
// --------------------------------------------------
// Revision Memo (Y.M.D Editor/Memo)
// --------------------------------------------------
// 
// 2013.05.08 T.Kabu
// GVC Rev.2としてのもろもろを定義
// 
// --------------------
// 今までの記録
// 2011.11.04 T.Kabu
// 2011.11.18 H.A.
// 2011.12.02 Arduino-IDE VerUp to 1.0
// 2011.12.13 T.Kabu このファイルはベースなので、定数を各モジュールに別途記述とした
// 2012.01.19 T.Kabu gvcd側からのコマンドを受け付けるようにしたベース
// 2012.02.07 T.Kabu gvcd側からGVCに対して送られてきたコマンドを処理するようにした
// 2012.03.02 T.Kabu 定数やテーブル定義などをヘッダファイルに分離した
// 2012.10.15 T.Kabu Arduinoはメモリの制限があるので、メッセージテーブルをポインタ構造体として扱うためファイルを別ける
// 2013.12.20 T.Kabu 清書と、赤外線データのサイズの関係で扱えるデータサイズをヘッダ込みで最大1600バイトまでに統一する
// 
// このファイルはArduinoのWireライブラリディレクトリに「gvc.h」というファイル名で寄生設置すること
// 例→C:\Documents and Settings\User\デスクトップ\arduino-1.0\libraries\Wire\gvc.h
// --------------------

//---------------------------------------------------
// include
//---------------------------------------------------
// Standard Liblary
// 
// ここでは標準ヘッダファイルは読み込まないこと
// 

// --------------------------------------------------
// GVC Parameter define and initialize
// --------------------------------------------------
// 動作確認用LEDを接続するポート
#define	PORT_STATUS_LED		PORTAbits.RA4
#define	PORT_RESULT_LED		PORTAbits.RA5

// STATUS用LEDを青色、RESULT用LEDを赤色、としている
#define	PORT_BLUE_LED		PORTAbits.RA4
#define	PORT_RED_LED		PORTAbits.RA5

// 赤外線信号受信ポート
#define	PORT_IR_RX			PORTCbits.RC0
#define	PORT_IR_TX			PORTCbits.RC1		// 赤外線LEDポート(0を1として反転出力すること)

// 赤外線信号送信ポート(0を1として反転出力すること)
#define	PORT_IR_TX			PORTCbits.RC1

// LEDのON/OFF用スイッチ
#define	LED_ON				0;
#define	LED_OFF				1;

// メッセージタイプ
#define GVC_CMD_REQUEST_VERSION		0x01		// バージョン要求コマンド
#define GVC_CMD_REQUEST_MODULEINFO	0x02		// 接続モジュール情報要求コマンド
#define GVC_CMD_REQUEST_MODULEDATA	0x03		// モジュールデータ取得要求コマンド
#define GVC_MSG_0x04				0x04		// xxx (TBD)
#define GVC_MSG_ENQ					0x05		// GVCへの各種要求
#define GVC_MSG_0x06				0x06		// xxx (TBD)
#define GVC_MSG_0x07				0x07		// xxx (TBD)
#define GVC_MSG_0x08				0x08		// xxx (TBD)
#define GVC_MSG_0x09				0x09		// xxx (TBD)
#define GVC_MSG_0x0a				0x0a		// xxx (TBD)
#define GVC_MSG_0x0b				0x0b		// xxx (TBD)
#define GVC_MSG_0x0c				0x0c		// xxx (TBD)
#define GVC_MSG_0x0d				0x0d		// xxx (TBD)
#define GVC_MSG_0x0e				0x0e		// xxx (TBD)
#define GVC_MSG_0x0f				0x0f		// xxx (TBD)

#define GVC_MSG_0x10				0x10		// xxx (TBD)
#define GVC_MSG_0x11				0x11		// xxx (TBD)
#define GVC_MSG_0x12				0x12		// xxx (TBD)
#define GVC_MSG_0x13				0x13		// xxx (TBD)
#define GVC_MSG_0x14				0x14		// xxx (TBD)
#define GVC_MSG_0x15				0x15		// xxx (TBD)
#define GVC_MSG_0x16				0x16		// xxx (TBD)
#define GVC_MSG_0x17				0x17		// xxx (TBD)
#define GVC_MSG_0x18				0x18		// xxx (TBD)
#define GVC_MSG_0x19				0x19		// xxx (TBD)
#define GVC_MSG_0x1a				0x1a		// xxx (TBD)
#define GVC_MSG_0x1b				0x1b		// xxx (TBD)
#define GVC_MSG_0x1c				0x1c		// xxx (TBD)
#define GVC_MSG_0x1d				0x1d		// xxx (TBD)
#define GVC_MSG_0x1e				0x1e		// xxx (TBD)
#define GVC_MSG_0x1f				0x1f		// xxx (TBD)

#define GVC_MSG_0x20				0x20		// xxx (TBD)
#define GVC_MSG_OTHER				0x21		// 各種情報メッセージ
#define GVC_MSG_0x22				0x22		// xxx (TBD)
#define GVC_MSG_0x23				0x23		// xxx (TBD)
#define GVC_MSG_0x24				0x24		// xxx (TBD)
#define GVC_MSG_0x25				0x25		// xxx (TBD)
#define GVC_MSG_0x26				0x26		// xxx (TBD)
#define GVC_MSG_0x27				0x27		// xxx (TBD)
#define GVC_MSG_0x28				0x28		// xxx (TBD)
#define GVC_MSG_0x29				0x29		// xxx (TBD)
#define GVC_MSG_0x2a				0x2a		// xxx (TBD)
#define GVC_MSG_0x2b				0x2b		// xxx (TBD)
#define GVC_MSG_0x2c				0x2c		// xxx (TBD)
#define GVC_MSG_0x2d				0x2d		// xxx (TBD)
#define GVC_MSG_0x2e				0x2e		// xxx (TBD)
#define GVC_MSG_0x2f				0x2f		// xxx (TBD)

#define GVC_MSG_0x30				0x30		// xxx (TBD)
#define GVC_MSG_0x31				0x31		// xxx (TBD)
#define GVC_MSG_0x32				0x32		// xxx (TBD)
#define GVC_MSG_0x33				0x33		// xxx (TBD)
#define GVC_MSG_0x34				0x34		// xxx (TBD)
#define GVC_MSG_0x35				0x35		// xxx (TBD)
#define GVC_MSG_0x36				0x36		// xxx (TBD)
#define GVC_MSG_0x37				0x37		// xxx (TBD)
#define GVC_MSG_0x38				0x38		// xxx (TBD)
#define GVC_MSG_0x39				0x39		// xxx (TBD)
#define GVC_MSG_0x3a				0x3a		// xxx (TBD)
#define GVC_MSG_0x3b				0x3b		// xxx (TBD)
#define GVC_MSG_0x3c				0x3c		// xxx (TBD)
#define GVC_MSG_0x3d				0x3d		// xxx (TBD)
#define GVC_MSG_0x3e				0x3e		// xxx (TBD)
#define GVC_MSG_0x3f				0x3f		// xxx (TBD)

#define GVC_MSG_0x40				0x40		// xxx (TBD)
#define GVC_MSG_0x41				0x41		// 'A' Acceleration (TBD)
#define GVC_MSG_0x42				0x42		// 'B' xxx (TBD)
#define GVC_MSG_0x43				0x43		// 'C' Compass (TBD)
#define GVC_MSG_DIST				0x44		// 'D' Distance (TBD)
#define GVC_MSG_0x45				0x45		// 'E' xxx (TBD)
#define GVC_MSG_0x46				0x46		// 'F' xxx (TBD)
#define GVC_MSG_0x47				0x47		// 'G' Gyro (TBD)
#define GVC_MSG_HUMI				0x48		// 'H' Humidity (TBD)
#define GVC_MSG_IR					0x49		// 'I' Infrared (TBD)
#define GVC_MSG_0x4a				0x4a		// 'J' xxx (TBD)
#define GVC_MSG_0x4b				0x4b		// 'K' xxx (TBD)
#define GVC_MSG_LIGHT				0x4c		// 'L' LIGHT (TBD)
#define GVC_MSG_0x4d				0x4d		// 'M' xxx (TBD)
#define GVC_MSG_0x4e				0x4e		// 'N' xxx (TBD)
#define GVC_MSG_0x4f				0x4f		// 'O' xxx (TBD)

#define GVC_MSG_PRESS				0x50		// 'P' Pressure (TBD)
#define GVC_MSG_0x51				0x51		// 'Q' xxx (TBD)
#define GVC_MSG_0x52				0x52		// 'R' xxx (TBD)
#define GVC_MSG_0x53				0x53		// 'S' xxx (TBD)
#define GVC_MSG_TEMP				0x54		// 'T' Templeture (TBD)
#define GVC_MSG_0x55				0x55		// 'U' xxx (TBD)
#define GVC_MSG_0x56				0x56		// 'V' xxx (TBD)
#define GVC_MSG_0x57				0x57		// 'W' xxx (TBD)
#define GVC_MSG_0x58				0x58		// 'X' xxx (TBD)
#define GVC_MSG_0x59				0x59		// 'Y' xxx (TBD)
#define GVC_MSG_0x5a				0x5a		// 'Z' xxx (TBD)
#define GVC_MSG_0x5b				0x5b		// xxx (TBD)
#define GVC_MSG_0x5c				0x5c		// xxx (TBD)
#define GVC_MSG_0x5d				0x5d		// xxx (TBD)
#define GVC_MSG_0x5e				0x5e		// xxx (TBD)
#define GVC_MSG_0x5f				0x5f		// xxx (TBD)

#define GVC_MSG_0x60				0x60		// 'a' xxx (TBD)
#define GVC_MSG_0x61				0x61		// 'b' xxx (TBD)
#define GVC_MSG_0x62				0x62		// 'c' xxx (TBD)
#define GVC_MSG_0x63				0x63		// 'd' xxx (TBD)
#define GVC_MSG_0x64				0x64		// 'e' xxx (TBD)
#define GVC_MSG_0x65				0x65		// 'f' xxx (TBD)
#define GVC_MSG_0x66				0x66		// 'g' xxx (TBD)
#define GVC_MSG_0x67				0x67		// 'h' xxx (TBD)
#define GVC_MSG_0x68				0x68		// 'X' xxx (TBD)
#define GVC_MSG_0x69				0x69		// 'i' xxx (TBD)
#define GVC_MSG_0x6a				0x6a		// 'j' xxx (TBD)
#define GVC_MSG_0x6b				0x6b		// 'k' xxx (TBD)
#define GVC_MSG_0x6c				0x6c		// 'l' xxx (TBD)
#define GVC_MSG_0x6d				0x6d		// 'm' xxx (TBD)
#define GVC_MSG_0x6e				0x6e		// 'n' xxx (TBD)
#define GVC_MSG_0x6f				0x6f		// 'o' xxx (TBD)

#define GVC_MSG_0x70				0x70		// 'p' xxx (TBD)
#define GVC_MSG_0x71				0x71		// 'q' xxx (TBD)
#define GVC_MSG_0x72				0x72		// 'r' xxx (TBD)
#define GVC_MSG_0x73				0x73		// 's' xxx (TBD)
#define GVC_MSG_0x74				0x74		// 't' xxx (TBD)
#define GVC_MSG_0x75				0x75		// 'u' xxx (TBD)
#define GVC_MSG_0x76				0x76		// 'v' xxx (TBD)
#define GVC_MSG_0x77				0x77		// 'w' xxx (TBD)
#define GVC_MSG_0x78				0x78		// 'x' xxx (TBD)
#define GVC_MSG_0x79				0x79		// 'y' xxx (TBD)
#define GVC_MSG_0x7a				0x7a		// 'z' xxx (TBD)
#define GVC_MSG_0x7b				0x7b		// xxx (TBD)
#define GVC_MSG_0x7c				0x7c		// xxx (TBD)
#define GVC_MSG_0x7d				0x7d		// xxx (TBD)
#define GVC_MSG_0x7e				0x7e		// xxx (TBD)
#define GVC_MSG_0x7f				0x7f		// xxx (TBD)

#define GVC_DEV_00					0			// GVC DEVICE NO 0 (DO NOT USE THIS!!)
#define GVC_DEV_01					1			// GVC DEVICE NO 1
#define GVC_DEV_02					2			// GVC DEVICE NO 2
#define GVC_DEV_03					3			// GVC DEVICE NO 3
#define GVC_DEV_04					4			// GVC DEVICE NO 4
#define GVC_DEV_05					5			// GVC DEVICE NO 5
#define GVC_DEV_06					6			// GVC DEVICE NO 6
#define GVC_DEV_07					7			// GVC DEVICE NO 7
#define GVC_DEV_08					8			// GVC DEVICE NO 8
#define GVC_DEV_09					9			// GVC DEVICE NO 9

#define GVC_I2C_MESSAGE_HEADER_SIZE	4			// I2C上を流れるメッセージのヘッダー部分(format,cmd,data_len)の長さ
#define GVC_SERIAL_MESSAGE_HEADER_SIZE	6		// シリアル上を流れるメッセージのヘッダー部分(msg_type, dev_num, format,cmd,data_len)の長さ

#define	GVC_IR_DATALEN_MAX			1568		// 赤外線データの最大長 2013.12.20 仮決定

// GVCの各モジュールのメイン/サブバッファサイズ
#define GVC_MAINBUFF_SIZE			2560		// メインバッファサイズ
#define GVC_SUBBUFF_SIZE			256			// メインバッファサイズ

// --------------------------------------------------
// Structure 
// --------------------------------------------------
//  |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
// ------------------------------
// GVC I2C MESSAGE (GVC <-I2C-> Module)
// ------------------------------
typedef struct _GVC_I2C_MESSAGE_T_
{
	unsigned char format;								// format
	unsigned char cmd;									// cmd
	unsigned int  data_len;								// data length
	unsigned char data[];								// data array (最低3バイトで、その最後はchecksumが入る)
} GVC_I2C_MESSAGE_t;


// ------------------------------
// GVC SERIAL MESSAGE (gvcd <-Serial-> GVC)
// ------------------------------
typedef struct _GVC_SERIAL_MESSAGE_T_
{
	unsigned char msg_type;								// message type
	unsigned char dev_num;								// device number
	unsigned char format;								// format
	unsigned char cmd;									// cmd
	unsigned int  data_len;								// data length
	unsigned char data[];								// data array (最低3バイトで、その最後はchecksumが入る)
} GVC_SERIAL_MESSAGE_t;
// unionで複数構成にしてもいいかなと思ったけど、まぁそこまでいじるよりもダイレクトにポインタ参照で入れていったほうが早いし…

// --------------------------------------------------
// Variable Param prototype
// --------------------------------------------------
extern	unsigned char reg_SSP1STAT;						// SSP1ステータスレジスタ

// --------------------------------------------------
// Function prototype
// --------------------------------------------------
// ------------------------------
// STATUS LED Brink (ON=300ms/OFF=100ms)
// ------------------------------
extern void led_status_brink(char);

// ------------------------------
// RESULT LED Brink (ON=300ms/OFF=100ms)
// ------------------------------
extern void led_result_brink(char);

// ------------------------------
// STATUS/RESULT LED Brink (ON=300ms/OFF=100ms)
// ------------------------------
extern void led_brink(char);

// ------------------------------
// LED Brink (Start Up Sign)
// ------------------------------
extern void led_brink3(void);

// ------------------------------
// LED light
// ------------------------------
extern void led_light(char, char);

// ------------------------------
// CRC8テーブルから計算
// ------------------------------
extern unsigned char GetCRC8(const void *, size_t);

// ------------------------------
// Send CR
// ------------------------------
extern void send_cr(void);

// ------------------------------
// Send LF
// ------------------------------
extern void send_lf(void);

// ------------------------------
// Send CR/LF
// ------------------------------
extern void send_crlf(void);

// ------------------------------
// Send STR DATA
// ------------------------------
extern void send_strdata(const char *);

// ------------------------------
// Send intdata
// ------------------------------
extern void send_intdata(int);

// ------------------------------
// Send hexdata
// ------------------------------
extern void send_hexdata(char);

// ------------------------------
// Send DATA
// ------------------------------
extern void send_serial(const char *, int);

// ------------------------------
// I2C wait Clear buffer
// ------------------------------
extern void i2c_waitClearbuffer(void);

// ------------------------------
// I2C begin Transmission
// ------------------------------
extern void i2c_beginTransmission(void);

// ------------------------------
// I2C end Transmission
// ------------------------------
extern void i2c_endTransmission(void);

// ------------------------------
// I2C write
// ------------------------------
extern int i2c_write(char, char *, int);

// ------------------------------
// I2C read
// ------------------------------
extern int i2c_read(char, char *, int);

// ------------------------------
// I2C Scan
// ------------------------------
extern char i2c_slave_check(unsigned char);