panel

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include <string>
00003 
00004 using namespace std;
00005 
00006 Ticker timer;
00007 
00008 Serial controller_uart(PA_0,PA_1,19200);
00009 Serial ems_uart(PA_9,PB_7,19200);
00010 Serial usb_uart(USBTX,USBRX,9600);
00011 
00012 DigitalOut EMS(PA_10);
00013 
00014 DigitalIn ZONE(PC_5);
00015 DigitalIn PS1(PC_12);
00016 DigitalIn PS2(PA_5);
00017 DigitalIn TS1(PC_11);
00018 DigitalIn TS2(PC_10);
00019 DigitalIn TS3(PC_6);
00020 DigitalIn TS4(PC_8);
00021 
00022 volatile int cnt = 0;
00023 volatile int con_status = 0;
00024 volatile unsigned char tx_data[11] = { 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00 };
00025 volatile unsigned char dualshock_data[10] = { 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80 };
00026 volatile unsigned char dualshock_data_number = 0;
00027 volatile unsigned char dualshock_cmd_getflag = 0;
00028 
00029 //遠隔非常停止受信処理
00030 void recieve_ems(){
00031     uint8_t rxdata = ems_uart.getc();
00032     
00033     if(rxdata == 0xEE){
00034         cnt = 50;
00035     }
00036 }
00037 
00038 void time() {
00039     if(dualshock_cmd_getflag & 0x02) {
00040         dualshock_cmd_getflag = 0;
00041         
00042         tx_data[1] = 0x00;
00043         tx_data[2] = 0x00;
00044         tx_data[3] = 0x00;
00045         tx_data[4] = 0x80;
00046         tx_data[5] = 0x80;
00047         tx_data[6] = 0x80;
00048         tx_data[7] = 0x80;
00049         
00050         dualshock_data[1] = 0x00;
00051         dualshock_data[2] = 0x00;
00052         dualshock_data[3] = 0x00;
00053         dualshock_data[4] = 0x80;
00054         dualshock_data[5] = 0x80;
00055         dualshock_data[6] = 0x80;
00056         dualshock_data[7] = 0x80;
00057         
00058         con_status = 0;
00059     }else
00060         dualshock_cmd_getflag |= 0x02;
00061 }
00062 
00063 //JETSON送信処理
00064 void send_tx_data(){
00065     usb_uart.putc('C');
00066     for(int i = 1; i < 9; i++){
00067         usb_uart.putc(tx_data[i]);
00068     }
00069     usb_uart.putc('E');
00070 }
00071 
00072 //コントローラー受信処理
00073 void read_controller_data() {
00074     unsigned char rxdata;
00075     
00076     rxdata = controller_uart.getc();
00077     
00078     if (dualshock_data_number == 0 && rxdata == 'S')
00079         dualshock_data_number++;
00080     else if (dualshock_data_number >= 1 && dualshock_data_number <= 7) {
00081         if (dualshock_data_number <= 3)
00082             dualshock_data[dualshock_data_number] = ~rxdata;
00083         else
00084             dualshock_data[dualshock_data_number] = rxdata;
00085         dualshock_data_number++;
00086     }
00087     else if (dualshock_data_number == 8 && rxdata == 'E') {
00088         dualshock_cmd_getflag = 0x01;
00089         for(int i = 0; i < 8; i++){
00090             tx_data[i] = dualshock_data[i];
00091         }
00092         con_status = 1;
00093         dualshock_data_number = 0;
00094     }
00095 }
00096 
00097 //main
00098 int main(){
00099     int c = 9;
00100     
00101     ZONE.mode(PullUp);
00102     PS1.mode(PullUp);
00103     PS2.mode(PullUp);
00104     TS1.mode(PullUp);
00105     TS2.mode(PullUp);
00106     TS3.mode(PullUp);
00107     TS4.mode(PullUp);
00108     
00109     timer.attach_us(&time, 100000);
00110     
00111     controller_uart.attach(&read_controller_data, Serial::RxIrq); //受信割り込み
00112     ems_uart.attach(&recieve_ems, Serial::RxIrq);
00113     
00114     while(1){
00115         if(cnt){
00116             EMS = 0;
00117             cnt--;
00118         }else{
00119             EMS = 1;
00120         }
00121         
00122         if(con_status){
00123             tx_data[8] |= 0x80;
00124         }
00125         if(!ZONE){
00126             tx_data[8] |= 0x40;
00127         }
00128         if(!PS1){
00129             tx_data[8] |= 0x20;
00130         }
00131         if(!PS2){
00132             tx_data[8] |= 0x10;
00133         }
00134         if(!TS1){
00135             tx_data[8] |= 0x08;
00136         }
00137         if(!TS2){
00138             tx_data[8] |= 0x04;
00139         }
00140         if(!TS3){
00141             tx_data[8] |= 0x02;
00142         }
00143         if(!TS4){
00144             tx_data[8] |= 0x01;
00145         }
00146         
00147         if(!cnt){
00148             send_tx_data();
00149             tx_data[8] = 0x00;
00150             c = 9;
00151         }else{
00152             c--;
00153         }
00154         
00155         wait_ms(10);
00156     }
00157 }