//******************************************************************************
// XBMC USB Controller firmware. Version 1.0.0.31
// Copyright © 2011 Dilshan R Jayakody.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
//******************************************************************************
#include
unsigned char readbuff[64] absolute 0x500;
unsigned char writebuff[64] absolute 0x540;
char cnt, ren_pointer;
char remote_command;
int remote_id, tmp_out;
unsigned int ren_timer;
bit home_sw, back_sw;
bit rotery_mode, rotery_push, update_lcd;
bit disp_switch, is_advance;
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
void GetRotaryState()
{
if(PORTD.B1 != rotery_mode)
{
Delay_us(25);
remote_command = 1;
if(PORTD.B0 == 0)
remote_id = 1;
else
remote_id = 2;
rotery_mode = PORTD.B1;
}
if(PORTD.B2 != rotery_push)
{
if(PORTD.B2 == 0)
{
remote_command = 2;
remote_id = 0;
}
rotery_push = PORTD.B2;
}
if(PORTD.B4 != home_sw)
{
if(PORTD.B4 == 0)
{
remote_command = 2;
remote_id = 1;
}
home_sw = PORTD.B4;
}
if(PORTD.B5 != back_sw)
{
if(PORTD.B5 == 0)
{
remote_command = 2;
remote_id = 2;
}
back_sw = PORTD.B5;
}
}
void GetSIRCValue()
{
char pos = 0;
char i;
remote_command = 0;
remote_id = 0;
while((PORTE.B0 == 0) && (pos < 26))
{
Delay_us(100);
pos++;
}
if(pos == 25)
{
for(i = 0; i < 21; i++)
{
tmp_out = 0;
while((PORTE.B0 == 1) && (tmp_out < 12001))
{
Delay_us(1);
tmp_out++;
}
if(tmp_out<12001)
{
pos = 0;
while((PORTE.B0 == 0) && (pos < 20))
{
Delay_us(100);
pos++;
}
if(pos > 10)
{
if(i<8)
remote_command |= (1<67) || (readbuff[1]<65))
ResetLCD();
else
{
Lcd_Cmd(_LCD_CLEAR);
switch(readbuff[1])
{
case 65 : Lcd_Out(1,1, "Audio"); break;
case 66 : Lcd_Out(1,1, "Video"); break;
case 67 : Lcd_Out(1,1, "Picture"); break;
}
switch(readbuff[2])
{
case 66 : Lcd_Out(1,9, ": Play"); break;
case 67 : Lcd_Out(1,9, ": Pause"); break;
}
update_lcd = ((readbuff[1]<67) && (readbuff[2]>65));
if(update_lcd)
{
ren_pointer = 0;
EchoUSBInfo();
ren_timer = 0;
update_lcd = 1;
}
}
}
void interrupt()
{
USB_Interrupt_Proc();
}
void main(void)
{
ADCON1 |= 0x0F;
CMCON |= 7;
TRISE = 7;
TRISA = 0;
TRISD = 127;
ren_pointer = 0;
rotery_mode = 0;
rotery_push = 0;
update_lcd = 0;
disp_switch = 0;
home_sw = 0;
back_sw = 0;
HID_Enable(&readbuff, &writebuff);
for(cnt=0;cnt<64;cnt++)
writebuff[cnt]= 0;
Lcd_Init();
Lcd_Cmd(_LCD_CURSOR_OFF);
ResetLCD();
mainloop:
if(HID_Read() > 0)
PrintUSBInfo();
GetSIRCValue();
if(remote_command == 0)
GetRotaryState();
if(remote_command != 0)
{
writebuff[0] = 184;
writebuff[1] = 1;
writebuff[2] = remote_command;
writebuff[3] = Lo(remote_id);
writebuff[4] = Hi(remote_id);
while(!HID_Write(&writebuff,64));
}
disp_switch = !disp_switch;
if(update_lcd && disp_switch)
{
ren_timer++;
if(ren_timer >= 45000)
{
ren_timer = 0;
EchoUSBInfo();
}
}
goto mainloop;
}