first commit
This commit is contained in:
@@ -0,0 +1,100 @@
|
||||
#include <cdcacm.h>
|
||||
#include <usbhub.h>
|
||||
|
||||
#include "pgmstrings.h"
|
||||
|
||||
// Satisfy IDE, which only needs to see the include statment in the ino.
|
||||
#ifdef dobogusinclude
|
||||
#include <spi4teensy3.h>
|
||||
#include <SPI.h>
|
||||
#endif
|
||||
|
||||
class ACMAsyncOper : public CDCAsyncOper
|
||||
{
|
||||
public:
|
||||
uint8_t OnInit(ACM *pacm);
|
||||
};
|
||||
|
||||
uint8_t ACMAsyncOper::OnInit(ACM *pacm)
|
||||
{
|
||||
uint8_t rcode;
|
||||
// Set DTR = 1 RTS=1
|
||||
rcode = pacm->SetControlLineState(3);
|
||||
|
||||
if (rcode)
|
||||
{
|
||||
ErrorMessage<uint8_t>(PSTR("SetControlLineState"), rcode);
|
||||
return rcode;
|
||||
}
|
||||
|
||||
LINE_CODING lc;
|
||||
lc.dwDTERate = 115200;
|
||||
lc.bCharFormat = 0;
|
||||
lc.bParityType = 0;
|
||||
lc.bDataBits = 8;
|
||||
|
||||
rcode = pacm->SetLineCoding(&lc);
|
||||
|
||||
if (rcode)
|
||||
ErrorMessage<uint8_t>(PSTR("SetLineCoding"), rcode);
|
||||
|
||||
return rcode;
|
||||
}
|
||||
|
||||
USB Usb;
|
||||
//USBHub Hub(&Usb);
|
||||
ACMAsyncOper AsyncOper;
|
||||
ACM Acm(&Usb, &AsyncOper);
|
||||
|
||||
void setup()
|
||||
{
|
||||
Serial.begin( 115200 );
|
||||
#if !defined(__MIPSEL__)
|
||||
while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection
|
||||
#endif
|
||||
Serial.println("Start");
|
||||
|
||||
if (Usb.Init() == -1)
|
||||
Serial.println("OSCOKIRQ failed to assert");
|
||||
|
||||
delay( 200 );
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
Usb.Task();
|
||||
|
||||
if( Acm.isReady()) {
|
||||
uint8_t rcode;
|
||||
|
||||
/* reading the keyboard */
|
||||
if(Serial.available()) {
|
||||
uint8_t data= Serial.read();
|
||||
/* sending to the phone */
|
||||
rcode = Acm.SndData(1, &data);
|
||||
if (rcode)
|
||||
ErrorMessage<uint8_t>(PSTR("SndData"), rcode);
|
||||
}//if(Serial.available()...
|
||||
|
||||
delay(50);
|
||||
|
||||
/* reading the phone */
|
||||
/* buffer size must be greater or equal to max.packet size */
|
||||
/* it it set to 64 (largest possible max.packet size) here, can be tuned down
|
||||
for particular endpoint */
|
||||
uint8_t buf[64];
|
||||
uint16_t rcvd = 64;
|
||||
rcode = Acm.RcvData(&rcvd, buf);
|
||||
if (rcode && rcode != hrNAK)
|
||||
ErrorMessage<uint8_t>(PSTR("Ret"), rcode);
|
||||
|
||||
if( rcvd ) { //more than zero bytes received
|
||||
for(uint16_t i=0; i < rcvd; i++ ) {
|
||||
Serial.print((char)buf[i]); //printing on the screen
|
||||
}
|
||||
}
|
||||
delay(10);
|
||||
}//if( Usb.getUsbTaskState() == USB_STATE_RUNNING..
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
#if !defined(__PGMSTRINGS_H__)
|
||||
#define __PGMSTRINGS_H__
|
||||
|
||||
#define LOBYTE(x) ((char*)(&(x)))[0]
|
||||
#define HIBYTE(x) ((char*)(&(x)))[1]
|
||||
#define BUFSIZE 256 //buffer size
|
||||
|
||||
|
||||
/* Print strings in Program Memory */
|
||||
const char Gen_Error_str[] PROGMEM = "\r\nRequest error. Error code:\t";
|
||||
const char Dev_Header_str[] PROGMEM ="\r\nDevice descriptor: ";
|
||||
const char Dev_Length_str[] PROGMEM ="\r\nDescriptor Length:\t";
|
||||
const char Dev_Type_str[] PROGMEM ="\r\nDescriptor type:\t";
|
||||
const char Dev_Version_str[] PROGMEM ="\r\nUSB version:\t\t";
|
||||
const char Dev_Class_str[] PROGMEM ="\r\nDevice class:\t\t";
|
||||
const char Dev_Subclass_str[] PROGMEM ="\r\nDevice Subclass:\t";
|
||||
const char Dev_Protocol_str[] PROGMEM ="\r\nDevice Protocol:\t";
|
||||
const char Dev_Pktsize_str[] PROGMEM ="\r\nMax.packet size:\t";
|
||||
const char Dev_Vendor_str[] PROGMEM ="\r\nVendor ID:\t\t";
|
||||
const char Dev_Product_str[] PROGMEM ="\r\nProduct ID:\t\t";
|
||||
const char Dev_Revision_str[] PROGMEM ="\r\nRevision ID:\t\t";
|
||||
const char Dev_Mfg_str[] PROGMEM ="\r\nMfg.string index:\t";
|
||||
const char Dev_Prod_str[] PROGMEM ="\r\nProd.string index:\t";
|
||||
const char Dev_Serial_str[] PROGMEM ="\r\nSerial number index:\t";
|
||||
const char Dev_Nconf_str[] PROGMEM ="\r\nNumber of conf.:\t";
|
||||
const char Conf_Trunc_str[] PROGMEM ="Total length truncated to 256 bytes";
|
||||
const char Conf_Header_str[] PROGMEM ="\r\nConfiguration descriptor:";
|
||||
const char Conf_Totlen_str[] PROGMEM ="\r\nTotal length:\t\t";
|
||||
const char Conf_Nint_str[] PROGMEM ="\r\nNum.intf:\t\t";
|
||||
const char Conf_Value_str[] PROGMEM ="\r\nConf.value:\t\t";
|
||||
const char Conf_String_str[] PROGMEM ="\r\nConf.string:\t\t";
|
||||
const char Conf_Attr_str[] PROGMEM ="\r\nAttr.:\t\t\t";
|
||||
const char Conf_Pwr_str[] PROGMEM ="\r\nMax.pwr:\t\t";
|
||||
const char Int_Header_str[] PROGMEM ="\r\n\r\nInterface descriptor:";
|
||||
const char Int_Number_str[] PROGMEM ="\r\nIntf.number:\t\t";
|
||||
const char Int_Alt_str[] PROGMEM ="\r\nAlt.:\t\t\t";
|
||||
const char Int_Endpoints_str[] PROGMEM ="\r\nEndpoints:\t\t";
|
||||
const char Int_Class_str[] PROGMEM ="\r\nIntf. Class:\t\t";
|
||||
const char Int_Subclass_str[] PROGMEM ="\r\nIntf. Subclass:\t\t";
|
||||
const char Int_Protocol_str[] PROGMEM ="\r\nIntf. Protocol:\t\t";
|
||||
const char Int_String_str[] PROGMEM ="\r\nIntf.string:\t\t";
|
||||
const char End_Header_str[] PROGMEM ="\r\n\r\nEndpoint descriptor:";
|
||||
const char End_Address_str[] PROGMEM ="\r\nEndpoint address:\t";
|
||||
const char End_Attr_str[] PROGMEM ="\r\nAttr.:\t\t\t";
|
||||
const char End_Pktsize_str[] PROGMEM ="\r\nMax.pkt size:\t\t";
|
||||
const char End_Interval_str[] PROGMEM ="\r\nPolling interval:\t";
|
||||
const char Unk_Header_str[] PROGMEM = "\r\nUnknown descriptor:";
|
||||
const char Unk_Length_str[] PROGMEM ="\r\nLength:\t\t";
|
||||
const char Unk_Type_str[] PROGMEM ="\r\nType:\t\t";
|
||||
const char Unk_Contents_str[] PROGMEM ="\r\nContents:\t";
|
||||
|
||||
#endif // __PGMSTRINGS_H__
|
||||
Reference in New Issue
Block a user