Esempio n. 1
0
void ProcessIO(void)
{   
    BYTE numBytesRead;

    //Blink the LEDs according to the USB device status
    BlinkUSBStatus();
    // User Application USB tasks
    if((USBDeviceState < CONFIGURED_STATE)||(USBSuspendControl==1)) return;

    if(buttonPressed)
    {
        if(stringPrinted == FALSE)
        {
            if(mUSBUSARTIsTxTrfReady())
            {
                putrsUSBUSART("Button Pressed data-- \r\n");
                stringPrinted = TRUE;
            }
        }
    }
    else
    {
        stringPrinted = FALSE;
    }

    if(USBUSARTIsTxTrfReady())
    {
		numBytesRead = getsUSBUSART(USB_Out_Buffer,64);
		if(numBytesRead != 0)
		{
			BYTE i;
	        
			for(i=0;i<numBytesRead;i++)
			{
				switch(USB_Out_Buffer[i])
				{
					case 0x0A:
					case 0x0D:
						putUSBUSART(&USB_Out_Buffer[i],numBytesRead);
						break;
                                        case 0x53://letter S to start sampling
                                                ReadADC();
                                                putUSBUSART(ADC_sample,SAMPLE_SIZE);
                                                break;
                                        case 0x51: //letter Q to stop

                                                break;
					default:
						putUSBUSART(&USB_Out_Buffer[i],numBytesRead);
						break;
				}

			}

			//putUSBUSART(USB_In_Buffer,numBytesRead);
		}
	}

    CDCTxService();
}		//end ProcessIO
Esempio n. 2
0
//IRman protocol: respond to IR with OK...
void IRmanString(void){
	if( mUSBUSARTIsTxTrfReady() ){ //it's always ready, but this could be done better
		irToy.usbOut[0]='O';//answer OK
		irToy.usbOut[1]='K';
		putUnsignedCharArrayUsbUsart(irToy.usbOut,2);
	}
}
void send(unsigned char c){
	unsigned char b[2];

  	if( mUSBUSARTIsTxTrfReady() ){ //it's always ready, but this could be done better
		b[0]=c;
		putUnsignedCharArrayUsbUsart(b,1);
	}	

}
void sendok(void){
	unsigned char b[2];

  	if( mUSBUSARTIsTxTrfReady() ){ //it's always ready, but this could be done better
		b[0]='1';//answer OK
		putUnsignedCharArrayUsbUsart(b,1);
	}	

}
Esempio n. 5
0
/********************************************************************
 * Function:        void ProcessIO(void)
 *
 * PreCondition:    None
 *
 * Input:           None
 *
 * Output:          None
 *
 * Side Effects:    None
 *
 * Overview:        This function is a place holder for other user
 *                  routines. It is a mixture of both USB and
 *                  non-USB tasks.
 *
 * Note:            None
 *******************************************************************/
void ProcessIO(void)
{   
    BYTE numBytesRead;

    //Blink the LEDs according to the USB device status

    //
    // User Application USB tasks
    //

    // If suspended, do nothing.
    if((USBDeviceState < CONFIGURED_STATE)||(USBSuspendControl==1)) return;

    // If character received, echo it
    if(mUSBUSARTIsTxTrfReady())
    {
        numBytesRead = getsUSBUSART(USB_Out_Buffer,64);
        if(numBytesRead != 0)
        {
            BYTE i;
            
            #ifdef NETV
            
            #else            
            for(i=0;i<numBytesRead;i++)
            {
            	USB_In_Buffer[i] = USB_Out_Buffer[i];    
            }
    
    		//Test: Send SPI word to control motor
    		if(USB_In_Buffer[0] == 'u')
    		{
		    	motor_speed += 250;
		    	if(motor_speed > 3000)
		    	motor_speed = 3000;
		    	SpiChnPutC(4, motor_speed);   
	    	}
	    	else if(USB_In_Buffer[0] == 'i')
	    	{
		    	motor_speed -= 250;
		    	if(motor_speed < -3000)
		    	motor_speed = -3000;
		    	SpiChnPutC(4, motor_speed);  
	    	}
	    	
            putUSBUSART(USB_In_Buffer,numBytesRead);	//Echo
            HBLED1 ^= 1; //Toggle LEDs
            HBLED2 ^= 1;
            #endif
        }
    }

    // Service the USB CDC driver
    CDCTxService();

} // End ProcessIO
Esempio n. 6
0
// FIXME: implement for serial comms
BYTE GetUserMessage(char *buffer, BYTE len)
{
    if(CommsChannel == COMMS_USB)
    {
        if (mUSBUSARTIsTxTrfReady())
            return getsUSBUSART(buffer, len);
        else
            return 0;
    }
    return 0;
}
//setup for USB UART
void Usb2UartSetup(void){
if(mUSBUSARTIsTxTrfReady())
	{
	irToy.usbOut[0]='U';//answer OK
	irToy.usbOut[1]='0';
	irToy.usbOut[2]='1';
	putUnsignedCharArrayUsbUsart(irToy.usbOut,3);
	}
Sm_Usb_Uart=SM_USB_UART_CONFIG_MODE;
Configbuffctr=0;
}
/**
 * シリアル・ポートの Ready を待つ
 * timer1 を使ってオーバフローならば 0 を返す
 * Ready になれば 1 を返す
 */
int WaitToReadySerial(void)
{
  PIR1bits.TMR1IF = 0;
  TMR1 = 0;
  PIR1bits.TMR1IF = 0;
  while (PIR1bits.TMR1IF==0) {
    if (mUSBUSARTIsTxTrfReady())
      return 1;
    CDCTxService();
  }
  return 0;
}
Esempio n. 9
0
/********************************************************************
 * Function:        void ProcessIO(void)
 *
 * PreCondition:    None
 *
 * Input:           None
 *
 * Output:          None
 *
 * Side Effects:    None
 *
 * Overview:        This function is a place holder for other user
 *                  routines. It is a mixture of both USB and
 *                  non-USB tasks.
 *
 * Note:            None
 *******************************************************************/
void ProcessIO(void)
{
    //Blink the LEDs according to the USB device status
    BlinkUSBStatus();
    // User Application USB tasks
    if((USBDeviceState < CONFIGURED_STATE)||(USBSuspendControl==1)) return;
    if(mUSBUSARTIsTxTrfReady())
    {
        putrsUSBUSART("test123");
    }

    CDCTxService();
}		//end ProcessIO
Esempio n. 10
0
BYTE cdc_get_conf(char *confstr, BYTE conflen)
{
    char uart_c;
    if (mUSBUSARTIsTxTrfReady()) {
        if (getsUSBUSART(&uart_c, 1) != 0) {
            if ((config_cycle>0) && (config_cycle<=conflen)) {
                confstr[conflen-config_cycle] = uart_c;
            }
            config_cycle--; // advance to next state
            if (config_cycle == 0)
                return 1; // do more after this function returns..
        } // if numBytesRead
    }
    config_cycle++; // correct for inactive cdc loops in up_cdc_cycle();
    return 0;
}
Esempio n. 11
0
/********************************************************************
 * Function:        void ProcessIO(void)
 *
 * PreCondition:    None
 *
 * Input:           None
 *
 * Output:          None
 *
 * Side Effects:    None
 *
 * Overview:        This function is a place holder for other user
 *                  routines. It is a mixture of both USB and
 *                  non-USB tasks.
 *
 * Note:            None
 *******************************************************************/
void ProcessIO(void)
{   
    //Blink the LEDs according to the USB device status
    BlinkUSBStatus();
    // User Application USB tasks
    if((USBDeviceState < CONFIGURED_STATE)||(USBSuspendControl==1)) return;

	// only check for new USB buffer if the old RS232 buffer is
	// empty.
	// Additional USB packets will be NAK'd
	// until the buffer is free.
	if (RS232_Out_Data_Rdy == 0)
		{
			LastRS232Out = getsUSBUSART(RS232_Out_Data,64);
			
			if(LastRS232Out > 0)
			{
				RS232_Out_Data_Rdy = 1; // signal
										//buffer full
				RS232cp = 0;// Reset the current position
			}
		}
		
	if(RS232_Out_Data_Rdy && mTxRdyUSART())
	{
		putcUSART(RS232_Out_Data[RS232cp]);
		++RS232cp;
		if (RS232cp == LastRS232Out)
			RS232_Out_Data_Rdy = 0;
	}

	if(mDataRdyUSART())
	{
		USB_Out_Buffer[NextUSBOut] = getcUSART();
		++NextUSBOut;
		USB_Out_Buffer[NextUSBOut] = 0;
	}

	if((mUSBUSARTIsTxTrfReady()) && (NextUSBOut > 0))
	{
		putUSBUSART(&USB_Out_Buffer[0], NextUSBOut);
		NextUSBOut = 0;
	}

    CDCTxService();
}		//end ProcessIO
Esempio n. 12
0
// *--------------------------------------------------------------------------------*
void ProcessIO(void){   
    BYTE numBytesRead;

    //Blink the LEDs according to the USB device status
    BlinkUSBStatus();
    // User Application USB tasks
    if((USBDeviceState < CONFIGURED_STATE)||(USBSuspendControl==1)) return;

    if(buttonPressed){
        if(stringPrinted == FALSE){
            if(mUSBUSARTIsTxTrfReady()){
                putrsUSBUSART("Button Pressed -- \r\n");
                stringPrinted = TRUE;
            }
        }
    }else{
        stringPrinted = FALSE;
    }

    if(USBUSARTIsTxTrfReady()){
		numBytesRead = getsUSBUSART(USB_Out_Buffer,64);
		if(numBytesRead != 0){
			BYTE i;
	        
			for(i=0;i<numBytesRead;i++){
				switch(USB_Out_Buffer[i]){
					case 0x0A:
					case 0x0D:
						USB_In_Buffer[i] = USB_Out_Buffer[i];
						break;
					default:
						USB_In_Buffer[i] = USB_Out_Buffer[i] + 1;
						break;
				}
			}
			putUSBUSART(USB_In_Buffer,numBytesRead);
		}
	}

    CDCTxService();
}
Esempio n. 13
0
void processUSBData(void) {
    BYTE numBytesRead;
    // User Application USB tasks
    if ((USBDeviceState < CONFIGURED_STATE) || (USBSuspendControl == 1)) {
        return;
    }
    // Si está preparado para recibir datos
    if (mUSBUSARTIsTxTrfReady()) {
        // Recibe un buffer de tamaño determinado
        numBytesRead = getsUSBUSART(USB_Out_Buffer, 64);
        // Si ha leído datos
        if (numBytesRead != 0) {
            // FIXME Usar constantes
            if (strncmppgm2ram(USB_Out_Buffer, RTCC, strlen(RTCC)) == 0) {
                //parseRTCCData(USB_Out_Buffer);
            }
        }
    }

    CDCTxService();
}
Esempio n. 14
0
void usb_send(const char *format, ...)
{
    //char *usb_msg;
    static unsigned char usb_msg[CDC_DATA_OUT_EP_SIZE];

    va_list args;
    va_start(args,__format);
    sprintf(usb_msg,format,args);
    if (( USBGetDeviceState() < CONFIGURED_STATE ) || ( USBIsDeviceSuspended() == true ))
    {
        return;
    }
    else
    {
        if (mUSBUSARTIsTxTrfReady())
        {
            putUSBUSART(usb_msg,strlen(usb_msg));
        }
        CDCTxService();
    }

}
Esempio n. 15
0
void cdc_main_menu( rom char* name_str, rom char* ver_str)
{
    char uart_c;
    if (mUSBUSARTIsTxTrfReady()) {
        if (getsUSBUSART(&uart_c, 1) != 0) {
            switch (uart_c) {
                case 't': cdc_start_set_time(); break;
                case 'T': cdc_start_stop_time(); break;
                case 'r': cdc_start_read(); break;
                case 's': cdc_start_log(); break;
                case 'v': cdc_print_ver(name_str,  ver_str); break;
                case '?': cdc_print_help(); break;
                case 'f': cdc_start_format(); break;
                case '0': cdc_start_erase(); break;
                case 'i': cdc_start_init(); break;
                case 'u': cdc_start_conf_read(); break;
                case 'w': cdc_start_conf_write(); break;
                case 'x': cdc_start_reset(); break;
            } // switch
        } // if numBytesRead!=0
    } // if (mUSBUSARTIsTxTrfReady)
}
Esempio n. 16
0
void CDCputs(u8 *buffer, u8 length)
{
    u16 i;
    for (i = 1000; i > 0; --i)
    {
        if (mUSBUSARTIsTxTrfReady())
            break;
        #if defined(__32MX220F032D__)||defined(__32MX250F128B__)||defined(__32MX220F032B__)
            USB_Service();
        #else
            CDCTxService();
        #endif
    }
    if (i > 0)
    {
        putUSBUSART(buffer, length);
        #if defined(__32MX220F032D__)||defined(__32MX250F128B__)||defined(__32MX220F032B__)
            USB_Service();
        #else
            CDCTxService();
        #endif
    }
}
Esempio n. 17
0
void SUMPlogicCommand(unsigned char inByte){

	static enum _SUMP {
		C_IDLE = 0,
		C_PARAMETERS,
		C_PROCESS,
	} sumpRXstate = C_IDLE;

	static struct _sumpRX {
		unsigned char command[5];
		unsigned char parameters;
		unsigned char parCnt;
	} sumpRX;

	switch(sumpRXstate){ //this is a state machine that grabs the incoming commands one byte at a time

		case C_IDLE:

			switch(inByte){//switch on the current byte
				case SUMP_RESET://reset
	    			T2IE=0; //disable interrupts...
					T2ON=0;//tmr2 off
					IRRX_IE = 0;  //DISABLE RB port change interrupt
					LAstate=LA_RESET;
					break;
				case SUMP_ID://SLA0 or 1 backwards: 1ALS
		    		if( mUSBUSARTIsTxTrfReady() ){
						//putsUSBUSART("1ALS"); //doesn't work b/c of 0x00
						irToy.usbOut[0]='1';
						irToy.usbOut[1]='A';
						irToy.usbOut[2]='L';
						irToy.usbOut[3]='S';
						putUnsignedCharArrayUsbUsart(irToy.usbOut,4);
					}
					break;
				case SUMP_RUN://arm the triger
					LED_LAT |= LED_PIN;//ARMED, turn on LED
					LAstate=LA_ARMED;
   					IRRX_IF = 0;    //Reset the RB Port Change Interrupt Flag bit   
   					IRRX_IE = 1;  //Enables the RB port change interrupt
					break;
				case SUMP_XON://resume send data
				//	xflow=1;
					break;
				case SUMP_XOFF://pause send data
				//	xflow=0;
					break;
				default://long command
					sumpRX.command[0]=inByte;//store first command byte
					sumpRX.parameters=4; //all long commands are 5 bytes, get 4 parameters
					sumpRX.parCnt=0;//reset the parameter counter
					sumpRXstate=C_PARAMETERS;
					break;
			}
			break;
		case C_PARAMETERS: 
			sumpRX.command[sumpRX.parCnt]=inByte;//store each parameter
			sumpRX.parCnt++;
			if(sumpRX.parCnt<sumpRX.parameters) break; //if not all parameters, quit
		case C_PROCESS: //ignore all long commands for now
			sumpRXstate=C_IDLE;
			break;					
		}
}
// to go back to the other default, user must unplug USB IR Toy
u8 Usb2UartService(void)
{
static u8 buff_config[5];

switch (Sm_Usb_Uart)
	{
	// get configuration data
	case SM_USB_UART_CONFIG_MODE:
		{
		FlushUsbRx();
		Usb2Uart_InitUart(TRUE);
//		TRISC|=		0xC0;
//		TXSTA=		0x24;
//		RCSTA=		0x90;
//		BAUDCON=	0x08;
//		PIE1=		0x20;
		//ResetUsbUartTxBuffers();
		//ResetUsbUartRxBuffers();
		Sm_Usb_Uart=SM_USB_UART_CONFIG_MODE_OK;
		break;
		}


	case SM_USB_UART_CONFIG_MODE_OK:
		{
		Sm_Usb_Uart=SM_USB_UART_RUN_MODE;
		break;
		}

	case SM_USB_UART_RUN_MODE:
		{
#if 1
		if(getUnsignedCharArrayUsbUart(UsbRxDataBuffer,1))
			{
			TxBuffer[TxBufferCtrIn]=UsbRxDataBuffer[0];
			TxBufferCtrIn++;
			TxBufferCtrIn&=USBUARTBUFCTRMASK;
			}
#endif

		if(RxBufferCtrIn!=RxBufferCtrOut)
		//if ((Usb2UartPrepareTxData()==FALSE) && (RxBufferCtrIn!=RxBufferCtrOut))
			{
			if( mUSBUSARTIsTxTrfReady() )
				{
				LAT_LED_PIN^=1; // toggle led every sending
				irToy.usbOut[0]=RxBuffer[RxBufferCtrOut];//answer OK
				putUnsignedCharArrayUsbUsart(irToy.usbOut,1);

				RxBufferCtrOut++;
				RxBufferCtrOut&=USBUARTBUFCTRMASK;
				}
			}
		break;
		}
	} // end of switch


//	Usb2UartSendTxDataFromBuff();
#if 1
	if((TxIf)&&(TxBufferCtrIn!=TxBufferCtrOut))  // If Uart is not full and no data to be sent
		{
		TXREG=TxBuffer[TxBufferCtrOut];
		TxBufferCtrOut++;
		TxBufferCtrOut&=USBUARTBUFCTRMASK;
		}
#endif
	if(RCSTA&0x06) // error handling
		{
		RCSTAbits.CREN=0;
		RCSTAbits.CREN=1;
		}

// this will contain the routine for receiving and transmit
return 0;//CONTINUE
}
Esempio n. 19
0
void ProcessIO(void)
{   
    unsigned short result;
	static char state=VALUES;
	static char count=-1;
	static char adc_nr=0;
	static short adcchannel=0;
	char overflow=0;

    // User Application USB tasks

    if((USBDeviceState < CONFIGURED_STATE)||(USBSuspendControl==1)) return;


	if(state == PUTHEADER){
		if( mUSBUSARTIsTxTrfReady() ){
			 putsUSBUSART(USB_Head_Buffer);
			state = VALUES;
		}
	} else {


	if( mUSBUSARTIsTxTrfReady() ){             // Wait for completion

		USB_Out_Buffer[0]++;
		count++;
		if(count>=64){ //max channels
			count=0;
			USB_Out_Buffer[0] = 60; //start character
		}
		

	//	if (count<=11) result = read_register(1, (0x0b+count) ); else
	//	result = read_register(2, (0x0b+count-12) );
		adcchannel++;
		if(adcchannel==16){
 				adcchannel=0;
				overflow=1;
		}
		result = spi_transfer(adc_nr, ( WRITE_REG | (adcchannel<<10) ));

			if(overflow==1){
 				overflow=0;
				adc_nr++;
				if(adc_nr==4) adc_nr=0;
			}

		USB_Out_Buffer[3] = result &0xFF;
		USB_Out_Buffer[2] = (result &0xFF00)>>8;

		putUSBUSART(USB_Out_Buffer,5);
		LED = !LED;
		


	 }
	}




    CDCTxService();
}		//end ProcessIO
Esempio n. 20
0
void CDCTasks(void)
{
	BYTE numBytesRead;

	// Blink the LEDs according to the USB device status
	if (blinkStatusValid)
	{
		BlinkUSBStatus();
	}

	// User Application USB tasks
	if ((USBDeviceState < CONFIGURED_STATE) || (USBSuspendControl == 1))
	{
		return;
	}

#if (HILSIM_USB == 1)
	numBytesRead = getsUSBUSART(USB_In_Buffer, sizeof(USB_In_Buffer));
	if (numBytesRead != 0)
	{
		int i = 0;
		while (i < numBytesRead)
		{
			udb_gps_callback_received_byte(USB_In_Buffer[i++]);
		}
	}

	if (mUSBUSARTIsTxTrfReady())
	{
		int i = 0;
		int txchar;
		while ((i < sizeof(USB_Out_Buffer)) && ((txchar = udb_gps_callback_get_byte_to_send()) != -1))
		{
			USB_Out_Buffer[i++] = txchar;
		}
		if (i > 0)
		{
			putUSBUSART(USB_Out_Buffer, i);
		}
	}

#else
	if (mUSBUSARTIsTxTrfReady())
	{
		numBytesRead = getsUSBUSART(USB_Out_Buffer, sizeof(USB_Out_Buffer));
		if (numBytesRead != 0)
		{
			BYTE i;

			for (i = 0; i < numBytesRead; i++)
			{
				switch (USB_Out_Buffer[i])
				{
					case 0x0A:
					case 0x0D:
						USB_In_Buffer[i] = USB_Out_Buffer[i];
						break;
					default:
						USB_In_Buffer[i] = USB_Out_Buffer[i] + 1;
						break;
				}
			}
			putUSBUSART(USB_In_Buffer, numBytesRead);
		}
	}
#endif
	CDCTxService();
}
Esempio n. 21
0
/*********************************************************************
* Function: void APP_DeviceCDCBasicDemoTasks(void);
*
* Overview: Keeps the demo running.
*
* PreCondition: The demo should have been initialized and started via
*   the APP_DeviceCDCBasicDemoInitialize() and APP_DeviceCDCBasicDemoStart() demos
*   respectively.
*
* Input: None
*
* Output: None
*
********************************************************************/
void APP_DeviceCDCBasicDemoTasks()
{
    uint8_t numBytesWrite = 0;
    uint8_t packet[MAX_PACKET_SIZE];
    uint8_t packetSize;
    packet_data_u data;

    /* Make sure that the CDC driver is ready for a transmission.
     */
    if (mUSBUSARTIsTxTrfReady() == true) {
        uint16_t value;
        uint32_t percent;
        button_state_s cur_state[3];

        memset(cur_state, 0x00, 3 * sizeof(button_state_s));

        bool button1IsPressed = BUTTON_IsPressed(BUTTON_S1);
        bool button2IsPressed = BUTTON_IsPressed(BUTTON_S2);
        bool button3IsPressed = BUTTON_IsPressed(BUTTON_S3);
    
        value = ADC_Read10bit(ADC_CHANNEL_1);
        percent = ((uint32_t)100 * value) / 0x03FF;
        cur_state[0].pos = 0;
        cur_state[0].state = button1IsPressed ? BUTTON_PRESSED : BUTTON_RELEASED;
        cur_state[0].state |= ((percent >= 95) ? BUTTON_UNMOUNTED : BUTTON_MOUNTED);
        cur_state[0].uid = percent;

        value = ADC_Read10bit(ADC_CHANNEL_2);
        percent = ((uint32_t)100 * value) / 0x03FF;
        cur_state[1].pos = 1;
        cur_state[1].state = button2IsPressed ? BUTTON_PRESSED : BUTTON_RELEASED;
        cur_state[1].state |= ((percent >= 95) ? BUTTON_UNMOUNTED : BUTTON_MOUNTED);
        cur_state[1].uid = percent;

        value = ADC_Read10bit(ADC_CHANNEL_3);
        percent = ((uint32_t)100 * value) / 0x03FF;
        cur_state[2].pos = 2;
        cur_state[2].state = button3IsPressed ? BUTTON_PRESSED : BUTTON_RELEASED;
        cur_state[2].state |= ((percent >= 95) ? BUTTON_UNMOUNTED : BUTTON_MOUNTED);
        cur_state[2].uid = percent;

        if ((buttons_state[0].state != cur_state[0].state) || (buttons_state[1].state != cur_state[1].state) || (buttons_state[2].state != cur_state[2].state)) {
            memset(&data, 0x00, sizeof(packet_data_u));
            memcpy(data.buttons_state, cur_state, 3 * sizeof(button_state_s));
            assemblyPacket(GET_BUTTONS_STATE, &data, packet, &packetSize);
            memcpy(writeBuffer, packet, packetSize);
            numBytesWrite = packetSize;

            if (numBytesWrite > 0) {
                putUSBUSART(writeBuffer, numBytesWrite);
            }
            
            memcpy(buttons_state, cur_state, 3 * sizeof(button_state_s));
        }
    }

    /* Check to see if there is a transmission in progress, if there isn't, then
     * we can see about performing an echo response to data received.
     */
    if( USBUSARTIsTxTrfReady() == true)
    {
        uint16_t i;
        uint16_t validDataLen;
        uint16_t numBytesRead;
        char deviceID[] = "Keys 011";
        char *e;
        packet_type_e type;
        uint8_t payload[MAX_DATA_SIZE];
        uint8_t payloadSize;

        // Collect incoming data in read buffer. Bear in mind, buffer have to had ability receive whole CDC packet.
        if ((readPos + CDC_DATA_OUT_EP_SIZE) >= sizeof(readBuffer)) {
            e = memchr(readBuffer, PREAMBLE, sizeof(readBuffer));
            // Wipe out trash before valid data
            if (e == 0) {
                memset(readBuffer, 0x00, sizeof(readBuffer));
                readPos = 0;
            } else {
                validDataLen = (uint16_t)(&readBuffer[sizeof(readBuffer)] - e);
                memmove(readBuffer, e, validDataLen);
                memset(&readBuffer[validDataLen], 0x00, sizeof(readBuffer) - validDataLen);
                readPos = 0;
            }
        }
        numBytesRead = getsUSBUSART(&readBuffer[readPos], CDC_DATA_OUT_EP_SIZE);
        if (numBytesRead > 0) {
            // Parse all collected incoming data
            do {
                e = memchr(readBuffer, PREAMBLE, sizeof(readBuffer));
                if (e == 0) {
                    break;
                }
                i = (uint16_t)(e - readBuffer);
                parsePacket(&readBuffer[i], sizeof(readBuffer) - i, &type, payload, &payloadSize);
                numBytesWrite = 0;
                if (type == GET_DEVICE_ID) {
                    memset(&data, 0x00, sizeof(packet_data_u));
                    memcpy(data.device_id, deviceID, 8);
                    assemblyPacket(GET_DEVICE_ID, &data, packet, &packetSize);
                    memcpy(writeBuffer, packet, packetSize);
                    numBytesWrite = packetSize;
                } else if (type == GET_STATUS) {
                    memset(&data, 0x00, sizeof(packet_data_u));
                    data.device_status.errors = ERROR_NONE;
                    data.device_status.rtc = 0;
                    assemblyPacket(GET_STATUS, &data, packet, &packetSize);
                    memcpy(writeBuffer, packet, packetSize);
                    numBytesWrite = packetSize;                    
                } else if (type == SET_LEDS_STATE) {
                    led_state_s *led = (led_state_s *)payload;
                    if (led->state == LED_TURN_ON) {
                        if (led->pos == 0)
                            LED_On(LED_D2);
                        if (led->pos == 1)
                            LED_On(LED_D3);
                        if (led->pos == 2)
                            LED_On(LED_D4);
                    } else {
                        if (led->pos == 0)
                            LED_Off(LED_D2);
                        if (led->pos == 1)
                            LED_Off(LED_D3);
                        if (led->pos == 2)
                            LED_Off(LED_D4);
                    }
                } else if (type == RESET_DEVICE) {
                    LED_Off(LED_D2);
                    LED_Off(LED_D3);
                    LED_Off(LED_D4);
                    memset(readBuffer, 0x00, sizeof(readBuffer));
                    readPos = 0;
                } else {
                    memcpy(writeBuffer, &readBuffer[i], 20);
                    numBytesWrite = 20;
                }
                // Clear packet's start marker - PREAMBLE
                memset(&readBuffer[i], 0x00, 1);
                // Send answer
                if (numBytesWrite > 0) {
                    putUSBUSART(writeBuffer, numBytesWrite);
                }
            } while (1);
        }
    }

    CDCTxService();
}
/*********************************************************************
* Function: void APP_DeviceCDCBasicDemoTasks(void);
*
* Overview: Keeps the demo running.
*
* PreCondition: The demo should have been initialized and started via
*   the APP_DeviceCDCBasicDemoInitialize() and APP_DeviceCDCBasicDemoStart() demos
*   respectively.
*
* Input: None
*
* Output: None
*
********************************************************************/
void APP_DeviceCDCBasicDemoTasks()
{
    /* If the user has pressed the button associated with this demo, then we
     * are going to send a "Button Pressed" message to the terminal.
     */
    if(BUTTON_IsPressed(BUTTON_DEVICE_CDC_BASIC_DEMO) == true)
    {
        /* Make sure that we only send the message once per button press and
         * not continuously as the button is held.
         */
        if(buttonPressed == false)
        {
            /* Make sure that the CDC driver is ready for a transmission.
             */
            if(mUSBUSARTIsTxTrfReady() == true)
            {
                putrsUSBUSART(buttonMessage);
                buttonPressed = true;
            }
        }
    }
    else
    {
        /* If the button is released, we can then allow a new message to be
         * sent the next time the button is pressed.
         */
        buttonPressed = false;
    }

    /* Check to see if there is a transmission in progress, if there isn't, then
     * we can see about performing an echo response to data received.
     */
    if( USBUSARTIsTxTrfReady() == true)
    {
      uint8_t numBytesRead;
      numBytesRead = getsUSBUSART(readBuffer, sizeof(readBuffer));

      if (numBytesRead > 0) {
        switch(readBuffer[0]) {
        case 0x10:
          {
            unsigned char size = readBuffer[1];
            debug_flag2 = !debug_flag2;
            PORTCbits.RC1 = debug_flag2;
            writeBuffer[0] = 0x90;
            writeBuffer[1] = 4;
            writeBuffer[2] = numBytesRead;
            writeBuffer[3] = readBuffer[1];
            writeBuffer[4] = readBuffer[2];
            writeBuffer[5] = readBuffer[3];
            writeBuffer[1] = 4+size;
            for (unsigned char i = 0; i<size; i++) {
              writeBuffer[i+6] = readBuffer[4 + i];
            }
            if (WaitToReadySerial())
              putUSBUSART(writeBuffer, writeBuffer[1]+2);
            WaitToReadySerial();
          }
          {
            unsigned char size = readBuffer[1];
            i2c_start(0x50, 0);
            // address in big-endian format
            i2c_send(readBuffer[3]); // address MSB
            i2c_send(readBuffer[2]); // address LSB
            for (unsigned char i = 0; i<size; i++) {
              i2c_send(readBuffer[4 + i]);
            }
            i2c_stop();
            __delay_ms(10);
          }
          break;
        case 0x11:
          {
            unsigned char size = readBuffer[1];
            unsigned char data;
            unsigned char i;
            i2c_start(0x50, 0);
            // address in big-endian format
            i2c_send(readBuffer[3]); // address MSB
            i2c_send(readBuffer[2]); // address LSB
            i2c_start(0x50, 1);
            for (i=0; i<size-1; i++) {
              writeBuffer[i+2] = i2c_receive(ACK);
            }
            writeBuffer[i+2] = i2c_receive(NOACK);
            i2c_stop();
            __delay_ms(10);
            writeBuffer[0] = 0x12;
            writeBuffer[1] = size;
            putUSBUSART(writeBuffer, writeBuffer[1]+2);
          }
          break;
        }
      }

      //if (debug_flag) {
      //  debug_flag = 0;
      //  writeBuffer[0] = 9;
      //  writeBuffer[1] = 1;
      //  writeBuffer[2] = debug_data;
      //  putUSBUSART(writeBuffer, writeBuffer[1]+2);
      //}
    }
    CDCTxService();
}
Esempio n. 23
0
static void USB_CDC_send(uint16_t length) {
    if (mUSBUSARTIsTxTrfReady() == true) {
        putUSBUSART(writeBuffer, length);
    }
    CDCTxService();
}