firmware/main.c
author cpresser@slime-ws
Sat, 26 Jul 2008 14:22:38 +0200
changeset 25 96f051df5d60
parent 2 2f55e5dd591d
permissions -rw-r--r--
added eeprom code
slime@2
     1
/*
slime@2
     2
 * Project Frontplatte
slime@2
     3
 *
slime@2
     4
 * main.c  -  main programm
slime@2
     5
 *
slime@2
     6
 * This file is released under the GNU General Public License. Refer
slime@2
     7
 * to the COPYING file distributed with this package.
slime@2
     8
 *
slime@2
     9
 * (c) 2007 Carsten Presser cpresser AT fsing.uni-sb.de
slime@2
    10
 */
slime@2
    11
slime@2
    12
/** I N C L U D E S **********************************************************/
slime@2
    13
#include <p18cxxx.h>
slime@2
    14
#include "usb.h"
slime@2
    15
#include "io_cfg.h"
slime@2
    16
#include "usb_compile_time_validation.h"
slime@2
    17
slime@2
    18
#include "delay.h"
slime@2
    19
#include <pwm.h>
slime@2
    20
#include "user.h"
slime@2
    21
#include "rc5.h"
slime@2
    22
#include "comm.h"
slime@2
    23
#include "myi2c.h"
slime@2
    24
#include "t6963.h"
slime@2
    25
slime@2
    26
/** P R I V A T E  P R O T O T Y P E S ***************************************/
slime@2
    27
void USBTasks(void);
slime@2
    28
slime@2
    29
/** V E C T O R  R E M A P P I N G *******************************************/
slime@2
    30
extern void _startup (void);        // See c018i.c in your C18 compiler dir
slime@2
    31
#pragma code _RESET_INTERRUPT_VECTOR = 0x000800
slime@2
    32
void _reset (void)
slime@2
    33
{
slime@2
    34
    _asm goto _startup _endasm
slime@2
    35
}
slime@2
    36
slime@2
    37
slime@2
    38
/** C O D E ********************************************************/
slime@2
    39
#pragma code
slime@2
    40
slime@2
    41
void main(void)
slime@2
    42
{
slime@2
    43
	unsigned char i = 0;
slime@2
    44
	// init system
slime@2
    45
    mInitializeUSBDriver();
slime@2
    46
    UserInit();
slime@2
    47
slime@2
    48
	// main loop
slime@2
    49
    while(1)
slime@2
    50
    {
slime@2
    51
// USB-Tasks first...
slime@2
    52
        USBTasks();
slime@2
    53
slime@2
    54
		if (gg_ioflags & FLAG_I2C)
slime@2
    55
		{
slime@2
    56
			ReadKeys();
slime@2
    57
			if (! (gg_ioflags & FLAG_KEY)) ReadClock();
slime@2
    58
cpresser@25
    59
			gg_ioflags &= (FLAG_I2C ^ 255);					// delete i2c-flag
slime@2
    60
		}
slime@2
    61
slime@2
    62
slime@2
    63
// perhaps we need to power up?
slime@2
    64
		if (((gg_ioflags & FLAG_IR) && (gg_ir == RC5_KEY_POWER)) || (gg_ioflags & FLAG_ALARM))
slime@2
    65
		{
slime@2
    66
			PIN_POWER	= 1;
slime@2
    67
			Delay15ms();
slime@2
    68
			PIN_POWER	= 0;
slime@2
    69
			gg_ioflags |= FLAG_POWER;
slime@2
    70
			// TODO: echo starting command??
slime@2
    71
			gg_ioflags &= (FLAG_IR ^ 255);
slime@2
    72
		}
slime@2
    73
slime@2
    74
slime@2
    75
		// check for input, process it and send our answers...
slime@2
    76
		if((usb_device_state >= CONFIGURED_STATE)&&(UCONbits.SUSPND!=1))
slime@2
    77
		{
slime@2
    78
        	ProcessInput();
slime@2
    79
		}
slime@2
    80
slime@2
    81
// if in managed mode...
slime@2
    82
		if (gg_mode == MODE_MANAGED)
slime@2
    83
		{
slime@2
    84
			if((usb_device_state >= CONFIGURED_STATE)&&(UCONbits.SUSPND!=1))
slime@2
    85
			{
slime@2
    86
				// wooo wooo woooo. now zoidberg is the popular one!
slime@2
    87
				if (gg_ioflags & FLAG_KEY)
slime@2
    88
				{
slime@2
    89
					comm_send_ir(RC5_FRONT_ADDRESS, gg_keys);
slime@2
    90
					gg_ioflags &= (FLAG_KEY ^ 255);
slime@2
    91
				}
slime@2
    92
				if (gg_ioflags & FLAG_IR)
slime@2
    93
				{
slime@2
    94
					comm_send_ir(gg_ir_address, gg_ir);
slime@2
    95
					gg_ioflags &= (FLAG_IR ^ 255);
slime@2
    96
				}
slime@2
    97
			}
slime@2
    98
			else
slime@2
    99
			{
slime@2
   100
				gg_mode = MODE_UNMANAGED;
slime@2
   101
			}
slime@2
   102
		} 
slime@2
   103
		else
slime@2
   104
		{
slime@2
   105
			// we are NOT in usb-mode...
slime@2
   106
			if (gg_ioflags & FLAG_KEY)
slime@2
   107
			{
slime@2
   108
				switch (gg_keys)
slime@2
   109
				{
slime@2
   110
					case RC5_KEY_UP:	
slime@2
   111
						if (gg_pwm1dc <= 250) gg_pwm1dc += 5;
slime@2
   112
						SetDCPWM1((int)gg_pwm1dc << 2);
slime@2
   113
						break;
slime@2
   114
slime@2
   115
					case RC5_KEY_DOWN:	
slime@2
   116
						if (gg_pwm1dc >= 5) gg_pwm1dc -= 5;
slime@2
   117
						SetDCPWM1((int)gg_pwm1dc << 2);
slime@2
   118
						break;
slime@2
   119
slime@2
   120
					default:
slime@2
   121
						break;
slime@2
   122
				}
slime@2
   123
				gg_ioflags &= (FLAG_KEY ^ 255);
slime@2
   124
			}
slime@2
   125
slime@2
   126
			// always display some stuff...
slime@2
   127
			if (gg_ioflags & FLAG_COUNTER)
slime@2
   128
			{
slime@2
   129
slime@2
   130
				DrawTime();
slime@2
   131
/*				lcd_WriteData(0x00);		// byte1
slime@2
   132
				lcd_WriteData(0x08);		// byte2
slime@2
   133
				lcd_WriteCommand(0x24);		//set!
slime@2
   134
				Wdebug(gg_pwm1dc);*/
slime@2
   135
slime@2
   136
				gg_ioflags &= (FLAG_COUNTER ^ 255);
slime@2
   137
			}
slime@2
   138
slime@2
   139
		}
slime@2
   140
slime@2
   141
    } // end of main loop
slime@2
   142
} 
slime@2
   143
slime@2
   144
slime@2
   145
slime@2
   146
slime@2
   147
void USBTasks(void)
slime@2
   148
{
slime@2
   149
    /*
slime@2
   150
     * Servicing Hardware
slime@2
   151
     */
slime@2
   152
    USBCheckBusStatus();                    // Must use polling method
slime@2
   153
    if(UCFGbits.UTEYE!=1)
slime@2
   154
        USBDriverService();                 // Interrupt or polling method
slime@2
   155
    
slime@2
   156
    #if defined(USB_USE_CDC)
slime@2
   157
    CDCTxService();
slime@2
   158
    #endif
slime@2
   159
slime@2
   160
}