/*============================================
//題名：ipod　コントローラー
//日付：2012/03/06
//名前：KK
//
//使用PIC：PIC18F4520
//使用コンパイラ：MPLAB C18 Compiler
============================================*/
#include<p18cxxx.h>

#include<usart.h>
#include<delays.h>
#include<sw_uart.h>
#include"sw_uart_my.h"

/*=====定義文=====*/
#define	delimiter		0x90

#define	SIMPLE_REMORT	0x01
#define	PLAY			0x02
#define	PAUSE			0x02
#define	VO_PLASS		0x03
#define	VO_MINUS		0x04
#define	NEXT			0x05
#define	BACK			0x06
#define	STOP			0x07
#define ALBAM_NEXT		0x08
#define ALBAM_BACK		0x09
#define	RELEASE			0xFF

/*=====コンフィグレーション設定=====*/
#pragma config OSC = HS
#pragma config PWRT = ON
#pragma config BOREN = OFF
#pragma config WDT = OFF
#pragma config MCLRE = OFF
#pragma config PBADEN = OFF
#pragma config LVP = OFF

/*=====関数定義=====*/
void init(void);
void com_send(unsigned char);
void send_data(unsigned char*);

/*=====グローバル変数宣言=====*/
/*ボタンリリース*/
const unsigned char release [] = {0xFF,0x55,0x03,0x02,0x00,0x00,0xFB,delimiter};

/*=====メイン関数=====*/
void main(void){
	static unsigned char sw = 0;
	
	init();
	
	/*簡易リモートモードへ*/
	com_send(SIMPLE_REMORT);
	
	while (1){
		/*SWが押されるまで待機*/
		while ((PORTC & 0x3F) == 0x3F);
		sw = (~(PORTC) & 0x3F);
		
		Delay10KTCYx(50);
		/*処理分岐*/
		switch (sw){
			case 0x01:com_send(PLAY);putrsUART("\r\nPLAY");break;
			case 0x02:com_send(BACK);putrsUART("\r\nBACK");break;
			case 0x04:com_send(NEXT);putrsUART("\r\nNEXT");break;
			case 0x08:com_send(VO_MINUS);putrsUART("\r\nVO_MINUS");break;
			case 0x10:com_send(VO_PLASS);putrsUART("\r\nVO_PLASS");break;
			case 0x20:putrsUART("\r\nNO COMMAND");break;
			default:putrsUART("\r\nNO COMMAND");break;
		}
	}	
}

/*=====送信データ作成＆送信=====*/
void com_send(unsigned char mode){
	unsigned char s_data[20] = {0};
	
	/*固定値*/
	s_data[0] = 0xFF;
	s_data[1] = 0x55;
	
	switch (mode){
	/*簡易リモートモード*/
	case SIMPLE_REMORT:
		s_data[2] = 0x03;		/*データ数(1(モード分) + n(データ分))*/
		s_data[3] = 0x00;		/*モード*/
		s_data[4] = 0x01;		/*データ1*/
		s_data[5] = 0x02;		/*データ2*/
		s_data[6] = (0x100 - s_data[2] - s_data[3] - s_data[4] - s_data[5]);	/*チェックサム*/
		s_data[7] = delimiter;	/*データ終了信号*/
		break;
	/*Play/Pause*/
	case PLAY:
		s_data[2] = 0x03;		/*データ数(1(モード分) + n(データ分))*/
		s_data[3] = 0x02;		/*モード*/
		s_data[4] = 0x00;		/*データ1*/
		s_data[5] = 0x01;		/*データ2*/
		s_data[6] = (0x100 - s_data[2] - s_data[3] - s_data[4] - s_data[5]);	/*チェックサム*/
		s_data[7] = delimiter;	/*データ終了信号*/
		break;
	/*Volume +*/
	case VO_PLASS:
		s_data[2] = 0x03;		/*データ数(1(モード分) + n(データ分))*/
		s_data[3] = 0x02;		/*モード*/
		s_data[4] = 0x00;		/*データ1*/
		s_data[5] = 0x02;		/*データ2*/
		s_data[6] = (0x100 - s_data[2] - s_data[3] - s_data[4] - s_data[5]);	/*チェックサム*/
		s_data[7] = delimiter;	/*データ終了信号*/
		break;
	/*Volume -*/
	case VO_MINUS:
		s_data[2] = 0x03;		/*データ数(1(モード分) + n(データ分))*/
		s_data[3] = 0x02;		/*モード*/
		s_data[4] = 0x00;		/*データ1*/
		s_data[5] = 0x04;		/*データ2*/
		s_data[6] = (0x100 - s_data[2] - s_data[3] - s_data[4] - s_data[5]);	/*チェックサム*/
		s_data[7] = delimiter;	/*データ終了信号*/
		break;
	/*NEXT*/
	case NEXT:
		s_data[2] = 0x03;		/*データ数(1(モード分) + n(データ分))*/
		s_data[3] = 0x02;		/*モード*/
		s_data[4] = 0x00;		/*データ1*/
		s_data[5] = 0x08;		/*データ2*/
		s_data[6] = (0x100 - s_data[2] - s_data[3] - s_data[4] - s_data[5]);	/*チェックサム*/
		s_data[7] = delimiter;	/*データ終了信号*/
		break;
	/*BACK*/
	case BACK:
		s_data[2] = 0x03;		/*データ数(1(モード分) + n(データ分))*/
		s_data[3] = 0x02;		/*モード*/
		s_data[4] = 0x00;		/*データ1*/
		s_data[5] = 0x10;		/*データ2*/
		s_data[6] = (0x100 - s_data[2] - s_data[3] - s_data[4] - s_data[5]);	/*チェックサム*/
		s_data[7] = delimiter;	/*データ終了信号*/
		break;
	/*STOP*/
	case STOP:
		s_data[2] = 0x03;		/*データ数(1(モード分) + n(データ分))*/
		s_data[3] = 0x02;		/*モード*/
		s_data[4] = 0x00;		/*データ1*/
		s_data[5] = 0x80;		/*データ2*/
		s_data[6] = (0x100 - s_data[2] - s_data[3] - s_data[4] - s_data[5]);	/*チェックサム*/
		s_data[7] = delimiter;	/*データ終了信号*/
		break;
		
	default:
		break;
	}
	/*データ送信*/
	send_data(s_data);
	
	/*ボタンリリース信号出力*/
	if (s_data[3] == 0x02){
		send_data(release);
	}	
}

/*=====データ送信=====*/
/*delimiterの前まで送信を行う*/
void send_data(unsigned char *s){
	unsigned int i = 0;
	
	while (1){
		while(BusyUSART());
		putcUSART(*s);
		s++;
		if (*s == delimiter){
			break;
		}	
	}
}

void init(void){
	TRISC = 0xFF;

	//USART_Init
	TRISCbits.TRISC7 = 1;
	TRISCbits.TRISC6 = 0;
	OpenUSART(
			USART_TX_INT_OFF & 
			USART_RX_INT_OFF &
			USART_ASYNCH_MODE &
			USART_EIGHT_BIT &
			USART_CONT_RX & 
			USART_BRGH_HIGH,
			31);
	
	//SW_UART_Init
	OpenUART();
	
	INTCONbits.GIEL = 1;
	INTCONbits.GIEH = 1;
	
}
