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