PS4 controller with IM315

Dependents:  

Committer:
m2130
Date:
Wed Oct 12 09:35:15 2022 +0000
Revision:
2:83f5186d950c
Parent:
0:9577e971f55b
hage;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
m2130 0:9577e971f55b 1 #include "IM315PS4.hpp"
m2130 0:9577e971f55b 2
m2130 0:9577e971f55b 3 IM315PS4::IM315PS4(PinName TX, PinName RX){
m2130 0:9577e971f55b 4 i = 0;
m2130 2:83f5186d950c 5 flag = false;
m2130 0:9577e971f55b 6 len = 17;
m2130 0:9577e971f55b 7 val = ':';
m2130 0:9577e971f55b 8 data = new uint8_t[len];
m2130 0:9577e971f55b 9 DATA = new uint8_t[8];
m2130 0:9577e971f55b 10 _pc = new Serial(USBTX, USBRX);
m2130 0:9577e971f55b 11 dev = new Serial(TX, RX);
m2130 0:9577e971f55b 12 dev -> baud(19200);
m2130 0:9577e971f55b 13 _pc -> baud(9600);
m2130 0:9577e971f55b 14 dev -> printf("SRST\r\n");
m2130 0:9577e971f55b 15 dev -> attach(callback(this,&IM315PS4::get),Serial::RxIrq);
m2130 0:9577e971f55b 16 }
m2130 0:9577e971f55b 17
m2130 0:9577e971f55b 18 IM315PS4::IM315PS4(PinName TX, PinName RX, int baud){
m2130 0:9577e971f55b 19 i = 0;
m2130 2:83f5186d950c 20 flag = false;
m2130 0:9577e971f55b 21 len = 17;
m2130 0:9577e971f55b 22 val = ':';
m2130 0:9577e971f55b 23 data = new uint8_t[len];
m2130 0:9577e971f55b 24 DATA = new uint8_t[8];
m2130 0:9577e971f55b 25 _pc = new Serial(USBTX, USBRX);
m2130 0:9577e971f55b 26 dev = new Serial(TX, RX);
m2130 0:9577e971f55b 27 dev -> baud(19200);
m2130 0:9577e971f55b 28 _pc -> baud(baud);
m2130 0:9577e971f55b 29 dev -> printf("SRST\r\n");
m2130 0:9577e971f55b 30 dev -> attach(callback(this,&IM315PS4::get),Serial::RxIrq);
m2130 0:9577e971f55b 31 }
m2130 0:9577e971f55b 32
m2130 0:9577e971f55b 33 void IM315PS4::get(){
m2130 0:9577e971f55b 34 if(dev -> readable()){
m2130 0:9577e971f55b 35 data[i] = dev -> getc();
m2130 0:9577e971f55b 36 if(data[i] == val){
m2130 0:9577e971f55b 37 if(i == 0) i++;
m2130 0:9577e971f55b 38 else{
m2130 0:9577e971f55b 39 data[0] = val;
m2130 0:9577e971f55b 40 i = 1;
m2130 0:9577e971f55b 41 }
m2130 0:9577e971f55b 42 }
m2130 0:9577e971f55b 43 else{
m2130 0:9577e971f55b 44 if(i == 0);
m2130 0:9577e971f55b 45 else if(data[i] == ',');
m2130 0:9577e971f55b 46 else i++;
m2130 0:9577e971f55b 47 }
m2130 0:9577e971f55b 48 if(i >= len){
m2130 0:9577e971f55b 49 if(data[0] == val){
m2130 2:83f5186d950c 50 flag = !flag;
m2130 0:9577e971f55b 51 DATA[0] = ASCII(data[1], data[2]);
m2130 0:9577e971f55b 52 DATA[1] = ASCII(data[3], data[4]);
m2130 0:9577e971f55b 53 DATA[2] = ASCII(data[5], data[6]);
m2130 0:9577e971f55b 54 DATA[3] = ASCII(data[7], data[8]);
m2130 0:9577e971f55b 55 DATA[4] = ASCII(data[9], data[10]);
m2130 0:9577e971f55b 56 DATA[5] = ASCII(data[11], data[12]);
m2130 0:9577e971f55b 57 DATA[6] = ASCII(data[13], data[14]);
m2130 0:9577e971f55b 58 DATA[7] = ASCII(data[15], data[16]);
m2130 0:9577e971f55b 59 }
m2130 0:9577e971f55b 60 i = 0;
m2130 0:9577e971f55b 61 }
m2130 0:9577e971f55b 62 }
m2130 0:9577e971f55b 63 else{
m2130 0:9577e971f55b 64 for(int i = 0 ; i < 8 ; i++)DATA[i] = 0;
m2130 0:9577e971f55b 65 }
m2130 0:9577e971f55b 66 }
m2130 0:9577e971f55b 67
m2130 0:9577e971f55b 68 uint8_t IM315PS4::ASCII(uint8_t data1, uint8_t data2){
m2130 0:9577e971f55b 69 uint8_t dat1 = 0;
m2130 0:9577e971f55b 70 uint8_t dat2 = 0;
m2130 0:9577e971f55b 71 if(data1 >= 0x30 && data1 <= 0x39)dat1 = 16 * (data1 - 0x30);
m2130 0:9577e971f55b 72 else if(data1 >= 0x41 && data1 <= 0x46)dat1 = 16 * (data1 - 0x37);
m2130 0:9577e971f55b 73 if(data2 >= 0x30 && data2 <= 0x39)dat2 = data2 - 0x30;
m2130 0:9577e971f55b 74 else if(data2 >= 0x41 && data2 <= 0x46)dat2 = data2 - 0x37;
m2130 0:9577e971f55b 75 return dat1 + dat2;
m2130 0:9577e971f55b 76 }
m2130 0:9577e971f55b 77
m2130 0:9577e971f55b 78 void IM315PS4::button_state(){
m2130 0:9577e971f55b 79 if(up()) _pc -> printf("Up ");
m2130 0:9577e971f55b 80 if(right()) _pc -> printf("Right ");
m2130 0:9577e971f55b 81 if(left()) _pc -> printf("Left ");
m2130 0:9577e971f55b 82 if(down()) _pc -> printf("Down ");
m2130 0:9577e971f55b 83 if(tri()) _pc -> printf("Tri ");
m2130 0:9577e971f55b 84 if(circle()) _pc -> printf("Circle ");
m2130 0:9577e971f55b 85 if(square()) _pc -> printf("Square ");
m2130 0:9577e971f55b 86 if(cross()) _pc -> printf("Cross ");
m2130 0:9577e971f55b 87 if(l1()) _pc -> printf("L1 ");
m2130 0:9577e971f55b 88 if(l2An() != 0)_pc -> printf("L2:%2x ", l2An());
m2130 0:9577e971f55b 89 if(l3()) _pc -> printf("L3 ");
m2130 0:9577e971f55b 90 if(r1()) _pc -> printf("R1 ");
m2130 0:9577e971f55b 91 if(r2An() != 0)_pc -> printf("R2:%2x ", r2An());
m2130 0:9577e971f55b 92 if(r3()) _pc -> printf("R3 ");
m2130 0:9577e971f55b 93 if(option()) _pc -> printf("OPTIONS ");
m2130 0:9577e971f55b 94 if(share()) _pc -> printf("SHARE ");
m2130 0:9577e971f55b 95 if(ps()) _pc -> printf("PS ");
m2130 0:9577e971f55b 96 if(touchpad()) _pc -> printf("TOUCHPAD ");
m2130 0:9577e971f55b 97 if(lsx() != 127) _pc -> printf("LSX:%3d ", lsx());
m2130 0:9577e971f55b 98 if(lsy() != 127) _pc -> printf("LSY:%3d ", lsy());
m2130 0:9577e971f55b 99 if(rsx() != 127) _pc -> printf("RSX:%3d ", rsx());
m2130 0:9577e971f55b 100 if(rsy() != 127)_pc -> printf("RSY:%3d ", rsy());
m2130 0:9577e971f55b 101 _pc -> printf("\n");
m2130 0:9577e971f55b 102 }
m2130 0:9577e971f55b 103 void IM315PS4::data_print(){_pc -> printf("%2x %2x %2x %2x %2x %2x %2x %2x\n", DATA[0], DATA[1], DATA[2], DATA[3], DATA[4], DATA[5], DATA[6], DATA[7]);}
m2130 0:9577e971f55b 104
m2130 2:83f5186d950c 105 bool IM315PS4::available(){
m2130 2:83f5186d950c 106 return flag;
m2130 2:83f5186d950c 107 }
m2130 2:83f5186d950c 108
m2130 0:9577e971f55b 109 bool IM315PS4::up(){return DATA[1] & UP ? 1 : 0;}
m2130 0:9577e971f55b 110
m2130 0:9577e971f55b 111 bool IM315PS4::right(){return DATA[1] & RIGHT ? 1 : 0;}
m2130 0:9577e971f55b 112
m2130 0:9577e971f55b 113 bool IM315PS4::left(){return DATA[1] & LEFT ? 1 : 0;}
m2130 0:9577e971f55b 114
m2130 0:9577e971f55b 115 bool IM315PS4::down(){return DATA[1] & DOWN ? 1 : 0;}
m2130 0:9577e971f55b 116
m2130 0:9577e971f55b 117 bool IM315PS4::tri(){return DATA[0] & TRI ? 1 : 0;}
m2130 0:9577e971f55b 118
m2130 0:9577e971f55b 119 bool IM315PS4::circle(){return DATA[0] & CIRCLE ? 1 : 0;}
m2130 0:9577e971f55b 120
m2130 0:9577e971f55b 121 bool IM315PS4::square(){return DATA[0] & SQUARE ? 1 : 0;}
m2130 0:9577e971f55b 122
m2130 0:9577e971f55b 123 bool IM315PS4::cross(){return DATA[0] & CROSS ? 1 : 0;}
m2130 0:9577e971f55b 124
m2130 0:9577e971f55b 125 bool IM315PS4::touchpad(){return DATA[0] & TOUCHPAD ? 1 : 0;}
m2130 0:9577e971f55b 126
m2130 0:9577e971f55b 127 bool IM315PS4::ps(){return DATA[0] & PS ? 1 : 0;}
m2130 0:9577e971f55b 128
m2130 0:9577e971f55b 129 bool IM315PS4::l1(){return DATA[0] & L1 ? 1 : 0;}
m2130 0:9577e971f55b 130
m2130 0:9577e971f55b 131 bool IM315PS4::r1(){return DATA[0] & R1 ? 1 : 0;}
m2130 0:9577e971f55b 132
m2130 0:9577e971f55b 133 bool IM315PS4::option(){return DATA[1] & OPTION ? 1 : 0;}
m2130 0:9577e971f55b 134
m2130 0:9577e971f55b 135 bool IM315PS4::share(){return DATA[1] & SHARE ? 1 : 0;}
m2130 0:9577e971f55b 136
m2130 0:9577e971f55b 137 bool IM315PS4::l3(){return DATA[1] & L3 ? 1 : 0;}
m2130 0:9577e971f55b 138
m2130 0:9577e971f55b 139 bool IM315PS4::r3(){return DATA[1] & R3 ? 1 : 0;}
m2130 0:9577e971f55b 140
m2130 0:9577e971f55b 141 uint8_t IM315PS4::l2An(){return DATA[2];}
m2130 0:9577e971f55b 142
m2130 0:9577e971f55b 143 uint8_t IM315PS4::r2An(){return DATA[3];}
m2130 0:9577e971f55b 144
m2130 0:9577e971f55b 145 uint8_t IM315PS4::lsx(){return DATA[4];}
m2130 0:9577e971f55b 146
m2130 0:9577e971f55b 147 uint8_t IM315PS4::lsy(){return DATA[5];}
m2130 0:9577e971f55b 148
m2130 0:9577e971f55b 149 uint8_t IM315PS4::rsx(){return DATA[6];}
m2130 0:9577e971f55b 150
m2130 0:9577e971f55b 151 uint8_t IM315PS4::rsy(){return DATA[7];}
m2130 0:9577e971f55b 152
m2130 0:9577e971f55b 153 IM315PS4::~IM315PS4(){
m2130 0:9577e971f55b 154 delete data;
m2130 0:9577e971f55b 155 delete DATA;
m2130 0:9577e971f55b 156 delete dev;
m2130 0:9577e971f55b 157 delete _pc;
m2130 0:9577e971f55b 158 }