zeus 3110
/
SteeringController
USB HID Keyboard and car audio controller for steering of TOYOTA car
DEH970Ctrl.cpp@0:30fe2eec5271, 2015-08-20 (annotated)
- Committer:
- zeus3110
- Date:
- Thu Aug 20 11:59:37 2015 +0000
- Revision:
- 0:30fe2eec5271
First release
Who changed what in which revision?
User | Revision | Line number | New 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 | } |