firmware/comm.c
author cpresser@slime-ws
Sat, 26 Jul 2008 14:22:38 +0200
changeset 25 96f051df5d60
parent 23 dc247e80ef26
permissions -rw-r--r--
added eeprom code
slime@2
     1
/*
slime@2
     2
 * Project Frontplatte
slime@2
     3
 *
slime@2
     4
 * comm.c  -  Handle incoming commands
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
slime@2
    13
/** I N C L U D E S **********************************************************/
slime@2
    14
#include <p18cxxx.h>
slime@2
    15
#include <pwm.h>
cpresser@23
    16
#include <eep.h>
slime@2
    17
#include "typedefs.h"
slime@2
    18
#include "usb.h"
slime@2
    19
#include "cdc.h"
slime@2
    20
#include "io_cfg.h"
slime@2
    21
#include "comm.h"
slime@2
    22
#include "user.h"
slime@2
    23
slime@2
    24
#include "delay.h"
slime@2
    25
#include "t6963.h"
slime@2
    26
#include "myi2c.h"
slime@2
    27
#include "rc5.h"
slime@2
    28
slime@2
    29
slime@2
    30
/** P R I V A T E  P R O T O T Y P E S ***************************************/
slime@2
    31
void comm_send_data(unsigned char *data, unsigned char numbytes); 
slime@2
    32
void comm_send_ack(void);
slime@2
    33
void comm_send_nack(void); 
slime@2
    34
void comm_send_nimp(void);
slime@2
    35
slime@2
    36
slime@2
    37
slime@2
    38
/** C O D E ********************************************************/
slime@2
    39
void ProcessInput(void)
slime@2
    40
{   
slime@2
    41
	unsigned char len;			// command length
slime@2
    42
	unsigned char input[64];	// input buffer
slime@2
    43
	unsigned char i;			// default counter
slime@2
    44
slime@2
    45
slime@2
    46
/* C H E C K   I N P U T */
slime@2
    47
	//do we have some data ?
slime@2
    48
    len=getsUSBUSART((char*)&(input[0]), 64); 
slime@2
    49
slime@2
    50
	if (len < CMD_HD_LENGTH) return;
slime@2
    51
slime@2
    52
	//check if input is valid
slime@2
    53
	if (input[CMD_HD_SYNC] == CMD_SYNC_SEND)
slime@2
    54
slime@2
    55
		if ((input[CMD_HD_LENGTH+1] == (len-4)) && (input[CMD_HD_LENGTH] == 0) )// TODO!!
slime@2
    56
		{
slime@2
    57
			// looks like we recieved a valid command...
slime@2
    58
			switch(input[CMD_HD_COMMAND])
slime@2
    59
			{
slime@2
    60
/* S Y S T E M    C O M M A N D S */
slime@2
    61
				case CMD_GET_VERSION:
slime@2
    62
					if (input[CMD_HD_LENGTH+1] != 0) { comm_send_nack(); break;}
slime@2
    63
					input[0] = FW_VERSION;
slime@2
    64
					comm_send_data(input, 0x01);
slime@2
    65
					break;
slime@2
    66
slime@2
    67
				case CMD_BOOT:
slime@2
    68
					if (input[CMD_HD_LENGTH+1] != 0) { comm_send_nack(); break;}
slime@2
    69
					comm_send_ack();
slime@2
    70
					// stolen from microchip forum
slime@2
    71
					INTCONbits.GIE = 0;              // shut down global interrupts 
slime@2
    72
					USBSoftDetach();
slime@2
    73
					Delay15ms();
slime@2
    74
 					_asm goto BOOTLOAD_START _endasm;
slime@2
    75
					break;
cpresser@23
    76
cpresser@23
    77
/* E E P R O M    C O M M A N D S */
cpresser@23
    78
				case CMD_READ_EEPROM:
cpresser@23
    79
					if (input[CMD_HD_LENGTH+1] != 1) { comm_send_nack(); break;}
cpresser@23
    80
					input[0] = Read_b_eep (input[CMD_DATA_START]);
cpresser@23
    81
					comm_send_data(input, 0x01);
cpresser@23
    82
					break;
cpresser@23
    83
cpresser@23
    84
				case CMD_WRITE_EEPROM:
cpresser@25
    85
					if (input[CMD_HD_LENGTH+1] != 2) { comm_send_nack(); break;}
cpresser@23
    86
					Write_b_eep (input[CMD_DATA_START],input[CMD_DATA_START+1]);
cpresser@23
    87
					comm_send_ack();
cpresser@23
    88
					break;
cpresser@23
    89
slime@2
    90
				
slime@2
    91
/* D I S P L A Y    C O M M A N D S */
slime@2
    92
				case CMD_DISP_CLEAR_SCREEN:
slime@2
    93
					if (input[CMD_HD_LENGTH+1] != 0) { comm_send_nack(); break;}
slime@2
    94
					lcd_ClearScreen();
slime@2
    95
					// now send ack
slime@2
    96
					comm_send_ack();
slime@2
    97
					break;
slime@2
    98
slime@2
    99
				case CMD_DISP_SET_ROW_DATA:
slime@2
   100
					if (input[CMD_HD_LENGTH+1] < 3) { comm_send_nack(); break;}
slime@2
   101
					// goto desired address
slime@2
   102
					lcd_WriteData(input[CMD_DATA_START]);	// lower byte
slime@2
   103
					lcd_WriteData(input[CMD_DATA_START+1]);	// upper byte
slime@2
   104
					lcd_WriteCommand(0x24);
slime@2
   105
slime@2
   106
					// now write data
slime@2
   107
					//lcd_SetAutomode(MODE_AUTO);
slime@2
   108
					for(i = (CMD_DATA_START+2); i<=(len-1); i++) 
slime@2
   109
					{
slime@2
   110
						//lcd_WriteData(input[i]);
slime@2
   111
						lcd_WriteByte(input[i]);
slime@2
   112
					}
slime@2
   113
					//lcd_SetAutomode(MODE_NOAUTO);
slime@2
   114
					comm_send_ack();							// now send ack
slime@2
   115
					break;
slime@2
   116
slime@2
   117
				case CMD_DISP_SET_ADDRESS:
slime@2
   118
					if (input[CMD_HD_LENGTH+1] != 2) { comm_send_nack(); break;}
slime@2
   119
					// goto desired position
slime@2
   120
					lcd_WriteData(input[CMD_DATA_START]);	// lower byte
slime@2
   121
					lcd_WriteData(input[CMD_DATA_START+1]);	// upper byte
slime@2
   122
					lcd_WriteCommand(0x24);
slime@2
   123
					// now send ack
slime@2
   124
					comm_send_ack();
slime@2
   125
					break; 
slime@2
   126
slime@2
   127
/* C L O C K    C O M M A N D S */
slime@2
   128
				case CMD_READ_CLOCK:
slime@2
   129
					if (input[CMD_HD_LENGTH+1] != 0) { comm_send_nack(); break;}
slime@2
   130
					LDPageReadI2C(pcf8583, 0x00, input, 0x10);
slime@2
   131
					comm_send_data(input, 0x10);
slime@2
   132
					break;
slime@2
   133
slime@2
   134
				case CMD_WRITE_CLOCK:
slime@2
   135
					if (input[CMD_HD_LENGTH+1] != 0x10) { comm_send_nack(); break;}
slime@2
   136
					LDPageWriteI2C(pcf8583, 0x00, &input[CMD_DATA_START], 0x10);
slime@2
   137
					comm_send_ack();;
slime@2
   138
					break;
slime@2
   139
slime@2
   140
/* P W M    C O M M A N D S */
slime@2
   141
				case CMD_SET_PWM1:
slime@2
   142
					if (input[CMD_HD_LENGTH+1] != 1) { comm_send_nack(); break;}
slime@2
   143
					SetDCPWM1((int)input[CMD_DATA_START] << 2);
slime@2
   144
					comm_send_ack();
slime@2
   145
					break;
slime@2
   146
slime@2
   147
				case CMD_SET_PWM2:
slime@2
   148
					if (input[CMD_HD_LENGTH+1] != 1) { comm_send_nack(); break;}
slime@2
   149
					SetDCPWM2((int)input[CMD_DATA_START] << 2);
slime@2
   150
					comm_send_ack();
slime@2
   151
					break;
slime@2
   152
slime@2
   153
/* M O D E    C O M M A N D S */
slime@2
   154
				case CMD_SET_MODE_MANAGED:
slime@2
   155
					if (input[CMD_HD_LENGTH+1] != 0) { comm_send_nack(); break;}
slime@2
   156
					gg_mode = MODE_MANAGED;
slime@2
   157
					comm_send_ack();
slime@2
   158
					break;
slime@2
   159
slime@2
   160
				case CMD_SET_MODE_UNMANAGED:
slime@2
   161
					if (input[CMD_HD_LENGTH+1] != 0) { comm_send_nack(); break;}
slime@2
   162
					gg_mode = MODE_UNMANAGED;
slime@2
   163
					comm_send_ack();
slime@2
   164
					break;
slime@2
   165
slime@2
   166
slime@2
   167
				default:
slime@2
   168
					// not implemented...
slime@2
   169
					comm_send_nimp();
slime@2
   170
					break;
slime@2
   171
		}
slime@2
   172
	}
slime@2
   173
	else
slime@2
   174
	{
slime@2
   175
		// input data is somehow invalid
slime@2
   176
		comm_send_nack();
slime@2
   177
	}
slime@2
   178
slime@2
   179
slime@2
   180
}//end ProcessInput
slime@2
   181
slime@2
   182
slime@2
   183
slime@2
   184
slime@2
   185
slime@2
   186
slime@2
   187
slime@2
   188
slime@2
   189
slime@2
   190
/* S E N D   D A T A  &  R E T U R N C O D E S */
slime@2
   191
void comm_send_data(unsigned char *data, unsigned char numbytes) 
slime@2
   192
{
slime@2
   193
    // send a data packet
slime@2
   194
	unsigned char cmd[64];
slime@2
   195
	unsigned char i;
slime@2
   196
	cmd[CMD_HD_SYNC] = CMD_SYNC_RECV;
slime@2
   197
	cmd[CMD_HD_COMMAND] = CMD_SYS_ACK;
slime@2
   198
	cmd[CMD_HD_LENGTH] = 0;
slime@2
   199
	cmd[CMD_HD_LENGTH+1] = numbytes;
slime@2
   200
slime@2
   201
	for (i=0; i<numbytes; i++) {
slime@2
   202
		cmd[CMD_DATA_START + i] = data[i];
slime@2
   203
	}
slime@2
   204
slime@2
   205
	if mUSBUSARTIsTxTrfReady()
slime@2
   206
		mUSBUSARTTxRam((byte*)&cmd[0],(4+numbytes));
slime@2
   207
}
slime@2
   208
slime@2
   209
slime@2
   210
void comm_send_ir(unsigned char address, unsigned char command) 
slime@2
   211
{
slime@2
   212
    // send a data packet
slime@2
   213
	unsigned char ir_cmd[7];
slime@2
   214
	ir_cmd[CMD_HD_SYNC] 		= CMD_SYNC_RECV;
slime@2
   215
	ir_cmd[CMD_HD_COMMAND] 		= CMD_SYS_IR;
slime@2
   216
	ir_cmd[CMD_HD_LENGTH]		= 0x00;
slime@2
   217
	ir_cmd[CMD_HD_LENGTH+1]		= 0x02;
slime@2
   218
	ir_cmd[CMD_DATA_START]		= address;
slime@2
   219
	ir_cmd[CMD_DATA_START+1]	= command;
slime@2
   220
slime@2
   221
	if mUSBUSARTIsTxTrfReady()
slime@2
   222
		mUSBUSARTTxRam((byte*)&ir_cmd[0],6);
slime@2
   223
}
slime@2
   224
slime@2
   225
slime@2
   226
void comm_send_ack(void) 
slime@2
   227
{
slime@2
   228
    // send a ack-packet
slime@2
   229
	unsigned char cmd[5];
slime@2
   230
	cmd[CMD_HD_SYNC] = CMD_SYNC_RECV;
slime@2
   231
	cmd[CMD_HD_COMMAND] = CMD_SYS_ACK;
slime@2
   232
	cmd[CMD_HD_LENGTH] = 0;
slime@2
   233
	cmd[CMD_HD_LENGTH+1] = 0;
slime@2
   234
slime@2
   235
	if mUSBUSARTIsTxTrfReady()
slime@2
   236
		mUSBUSARTTxRam((byte*)&cmd[0],4);
slime@2
   237
}
slime@2
   238
slime@2
   239
void comm_send_nack(void) 
slime@2
   240
{
slime@2
   241
    // send a NOTack-packet
slime@2
   242
	unsigned char cmd[5];
slime@2
   243
	cmd[CMD_HD_SYNC] = CMD_SYNC_RECV;
slime@2
   244
	cmd[CMD_HD_COMMAND] = CMD_SYS_NACK;
slime@2
   245
	cmd[CMD_HD_LENGTH] = 0;
slime@2
   246
	cmd[CMD_HD_LENGTH+1] = 0;
slime@2
   247
slime@2
   248
	while (!mUSBUSARTIsTxTrfReady()) Nop();
slime@2
   249
	mUSBUSARTTxRam((byte*)&cmd[0],4);
slime@2
   250
}
slime@2
   251
slime@2
   252
void comm_send_nimp(void) 
slime@2
   253
{
slime@2
   254
	// send a NOTimplementet-packet
slime@2
   255
	unsigned char cmd[3];
slime@2
   256
	cmd[CMD_HD_SYNC] = CMD_SYNC_RECV;
slime@2
   257
	cmd[CMD_HD_COMMAND] = CMD_SYS_NIMP;
slime@2
   258
	cmd[CMD_HD_LENGTH] = 0;
slime@2
   259
	cmd[CMD_HD_LENGTH+1] = 0;
slime@2
   260
slime@2
   261
	if mUSBUSARTIsTxTrfReady()
slime@2
   262
		mUSBUSARTTxRam((byte*)&cmd[0],4);
slime@2
   263
}