USB HID Keyboard and car audio controller for steering of TOYOTA car

Dependencies:   USBDevice mbed

Committer:
zeus3110
Date:
Thu Aug 20 11:59:37 2015 +0000
Revision:
0:30fe2eec5271
First release

Who changed what in which revision?

UserRevisionLine numberNew contents of line
zeus3110 0:30fe2eec5271 1 #include "DEH970Ctrl.h"
zeus3110 0:30fe2eec5271 2
zeus3110 0:30fe2eec5271 3
zeus3110 0:30fe2eec5271 4 unsigned char VolPlus[DATA_LENGTH]={0xB5,0x4A,0x50,0xAF};
zeus3110 0:30fe2eec5271 5 //unsigned char VolPlus[DATA_LENGTH]={0x55,0xAA,0xA5,0x5A};
zeus3110 0:30fe2eec5271 6 unsigned char VolMinus[DATA_LENGTH]={0xB5,0x4A,0xD0,0x2F};
zeus3110 0:30fe2eec5271 7
zeus3110 0:30fe2eec5271 8 DEH970Controller::DEH970Controller(PwmOut *Port)
zeus3110 0:30fe2eec5271 9 {
zeus3110 0:30fe2eec5271 10 Locked=false;
zeus3110 0:30fe2eec5271 11 IRPort=Port;
zeus3110 0:30fe2eec5271 12
zeus3110 0:30fe2eec5271 13 PwmPortInit();
zeus3110 0:30fe2eec5271 14 }
zeus3110 0:30fe2eec5271 15
zeus3110 0:30fe2eec5271 16 DEH970Controller::~DEH970Controller()
zeus3110 0:30fe2eec5271 17 {
zeus3110 0:30fe2eec5271 18
zeus3110 0:30fe2eec5271 19 }
zeus3110 0:30fe2eec5271 20
zeus3110 0:30fe2eec5271 21 bool DEH970Controller::IsLocked()
zeus3110 0:30fe2eec5271 22 {
zeus3110 0:30fe2eec5271 23 return Locked;
zeus3110 0:30fe2eec5271 24 }
zeus3110 0:30fe2eec5271 25
zeus3110 0:30fe2eec5271 26 void DEH970Controller::PwmPortInit()
zeus3110 0:30fe2eec5271 27 {
zeus3110 0:30fe2eec5271 28 #ifdef DEBUG
zeus3110 0:30fe2eec5271 29 printf("PWM Port Init\n");
zeus3110 0:30fe2eec5271 30 #endif
zeus3110 0:30fe2eec5271 31 IRPort->period_us(BurstPeriod);
zeus3110 0:30fe2eec5271 32 IRPort->write(IR_OFF);
zeus3110 0:30fe2eec5271 33 }
zeus3110 0:30fe2eec5271 34
zeus3110 0:30fe2eec5271 35 void DEH970Controller::SendSignal(unsigned char *Dp)
zeus3110 0:30fe2eec5271 36 {
zeus3110 0:30fe2eec5271 37 DataBitPos=0;
zeus3110 0:30fe2eec5271 38 DataBytePos=-1;
zeus3110 0:30fe2eec5271 39 Data=Dp;
zeus3110 0:30fe2eec5271 40 DataBit=false;
zeus3110 0:30fe2eec5271 41 TimeOutIR=NULL;
zeus3110 0:30fe2eec5271 42 #ifdef DEBUG
zeus3110 0:30fe2eec5271 43 printf("SendSignal\n");
zeus3110 0:30fe2eec5271 44 #endif
zeus3110 0:30fe2eec5271 45 SendData();
zeus3110 0:30fe2eec5271 46 }
zeus3110 0:30fe2eec5271 47
zeus3110 0:30fe2eec5271 48 void DEH970Controller::SendData()
zeus3110 0:30fe2eec5271 49 {
zeus3110 0:30fe2eec5271 50 timestamp_t WaitTime;
zeus3110 0:30fe2eec5271 51
zeus3110 0:30fe2eec5271 52 if(TimeOutIR!=NULL)
zeus3110 0:30fe2eec5271 53 delete TimeOutIR;
zeus3110 0:30fe2eec5271 54
zeus3110 0:30fe2eec5271 55 TimeOutIR=new Timeout();
zeus3110 0:30fe2eec5271 56 DataBit=!DataBit;
zeus3110 0:30fe2eec5271 57
zeus3110 0:30fe2eec5271 58 #ifdef DEBUG
zeus3110 0:30fe2eec5271 59 printf("%d %d %d\n",DataBytePos,DataBitPos,DataBit);
zeus3110 0:30fe2eec5271 60 #endif
zeus3110 0:30fe2eec5271 61 // Send Leader
zeus3110 0:30fe2eec5271 62 if(DataBytePos==-1)
zeus3110 0:30fe2eec5271 63 {
zeus3110 0:30fe2eec5271 64 WaitTime=DataBit?LeaderOn:LeaderOff;
zeus3110 0:30fe2eec5271 65 IRPort->write(DataBit?IR_ON:IR_OFF);
zeus3110 0:30fe2eec5271 66 if(!DataBit)
zeus3110 0:30fe2eec5271 67 DataBytePos++;
zeus3110 0:30fe2eec5271 68 }
zeus3110 0:30fe2eec5271 69 // Send Trailer
zeus3110 0:30fe2eec5271 70 else if(DataBytePos==DATA_LENGTH)
zeus3110 0:30fe2eec5271 71 {
zeus3110 0:30fe2eec5271 72 WaitTime=DataBit?TrailerOn:TrailerOff;
zeus3110 0:30fe2eec5271 73 IRPort->write(DataBit?IR_ON:IR_OFF);
zeus3110 0:30fe2eec5271 74 if(!DataBit)
zeus3110 0:30fe2eec5271 75 DataBytePos++;
zeus3110 0:30fe2eec5271 76 }
zeus3110 0:30fe2eec5271 77 // Finish if Sent Trailer
zeus3110 0:30fe2eec5271 78 else if(DataBytePos==DATA_LENGTH+1)
zeus3110 0:30fe2eec5271 79 {
zeus3110 0:30fe2eec5271 80 #ifdef DEBUG
zeus3110 0:30fe2eec5271 81 printf("finished\n");
zeus3110 0:30fe2eec5271 82 #endif
zeus3110 0:30fe2eec5271 83 return;
zeus3110 0:30fe2eec5271 84 }
zeus3110 0:30fe2eec5271 85 // Send Data
zeus3110 0:30fe2eec5271 86 else
zeus3110 0:30fe2eec5271 87 {
zeus3110 0:30fe2eec5271 88 if(DataBit)
zeus3110 0:30fe2eec5271 89 WaitTime=DataOn;
zeus3110 0:30fe2eec5271 90 else
zeus3110 0:30fe2eec5271 91 WaitTime=((((int)Data[DataBytePos])&(0x00000080>>DataBitPos))==0)?DataOff0:DataOff1;
zeus3110 0:30fe2eec5271 92 #ifdef DEBUG2
zeus3110 0:30fe2eec5271 93 printf("%x\n",(((int)Data[DataBytePos])&(0x00000080>>DataBitPos))!=0);
zeus3110 0:30fe2eec5271 94 #endif
zeus3110 0:30fe2eec5271 95 IRPort->write(DataBit?IR_ON:IR_OFF);
zeus3110 0:30fe2eec5271 96 if(!DataBit)
zeus3110 0:30fe2eec5271 97 { DataBitPos=(DataBitPos+1)%8;
zeus3110 0:30fe2eec5271 98 if(DataBitPos==0)
zeus3110 0:30fe2eec5271 99 DataBytePos++;
zeus3110 0:30fe2eec5271 100 }
zeus3110 0:30fe2eec5271 101 }
zeus3110 0:30fe2eec5271 102
zeus3110 0:30fe2eec5271 103 TimeOutIR->attach_us(this,&DEH970Controller::SendData,WaitTime);
zeus3110 0:30fe2eec5271 104 }
zeus3110 0:30fe2eec5271 105
zeus3110 0:30fe2eec5271 106 void DEH970Controller::SendVolPlus()
zeus3110 0:30fe2eec5271 107 {
zeus3110 0:30fe2eec5271 108 #ifdef DEBUG
zeus3110 0:30fe2eec5271 109 printf("Send Vol Plus\n");
zeus3110 0:30fe2eec5271 110 #endif
zeus3110 0:30fe2eec5271 111 SendSignal(VolPlus);
zeus3110 0:30fe2eec5271 112 }
zeus3110 0:30fe2eec5271 113
zeus3110 0:30fe2eec5271 114 void DEH970Controller::SendVolMinus()
zeus3110 0:30fe2eec5271 115 {
zeus3110 0:30fe2eec5271 116 SendSignal(VolMinus);
zeus3110 0:30fe2eec5271 117 }