test

Dependencies:   mbed BufferedSerial LS7366LIB2 FastPWM

Committer:
lsh2205
Date:
Thu Apr 23 00:38:16 2020 +0000
Revision:
0:e12eb40b9fef
test;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lsh2205 0:e12eb40b9fef 1 #ifndef _PC_SERIAL_H_
lsh2205 0:e12eb40b9fef 2 #define _PC_SERIAL_H_
lsh2205 0:e12eb40b9fef 3
lsh2205 0:e12eb40b9fef 4 #define debug1 0
lsh2205 0:e12eb40b9fef 5 #define debug2 0
lsh2205 0:e12eb40b9fef 6 #define Start_com 1
lsh2205 0:e12eb40b9fef 7
lsh2205 0:e12eb40b9fef 8 Serial pc(USBTX, USBRX);
lsh2205 0:e12eb40b9fef 9
lsh2205 0:e12eb40b9fef 10 char check_pitch[6];
lsh2205 0:e12eb40b9fef 11 char rx_buffer[100]={0,};
lsh2205 0:e12eb40b9fef 12 char command[100]={0,};
lsh2205 0:e12eb40b9fef 13 char tx_buffer[100]="txdat32768,32768,32768,32768,32768,32768\n";
lsh2205 0:e12eb40b9fef 14 int tx_index = 0;
lsh2205 0:e12eb40b9fef 15 int rx_index = 0;
lsh2205 0:e12eb40b9fef 16 bool rx_flag = false;
lsh2205 0:e12eb40b9fef 17
lsh2205 0:e12eb40b9fef 18 long data_recive=0;
lsh2205 0:e12eb40b9fef 19
lsh2205 0:e12eb40b9fef 20 long bool_cnt=0;
lsh2205 0:e12eb40b9fef 21
lsh2205 0:e12eb40b9fef 22 double set_data[100] = {0x00, };
lsh2205 0:e12eb40b9fef 23
lsh2205 0:e12eb40b9fef 24 unsigned int cmd_roll, cmd_pitch, cmd_heave, cmd_sway, cmd_surge, cmd_yaw;
lsh2205 0:e12eb40b9fef 25
lsh2205 0:e12eb40b9fef 26 void Start_Command();
lsh2205 0:e12eb40b9fef 27 void Set_Arrangement();
lsh2205 0:e12eb40b9fef 28
lsh2205 0:e12eb40b9fef 29 bool data_error_check();
lsh2205 0:e12eb40b9fef 30 void char_save_arr(char c);
lsh2205 0:e12eb40b9fef 31 //void Rx_Interrupt();
lsh2205 0:e12eb40b9fef 32 void READ_and_SAVE();
lsh2205 0:e12eb40b9fef 33 void Serial_Init();
lsh2205 0:e12eb40b9fef 34 void Rx_Buffer_Clear();
lsh2205 0:e12eb40b9fef 35
lsh2205 0:e12eb40b9fef 36
lsh2205 0:e12eb40b9fef 37
lsh2205 0:e12eb40b9fef 38 void comunication()
lsh2205 0:e12eb40b9fef 39 {
lsh2205 0:e12eb40b9fef 40
lsh2205 0:e12eb40b9fef 41
lsh2205 0:e12eb40b9fef 42 for(int i=0;i<6;i++)
lsh2205 0:e12eb40b9fef 43 {
lsh2205 0:e12eb40b9fef 44 Speed_Pgain[i]=set_data[(i+1)*10+0];
lsh2205 0:e12eb40b9fef 45 Speed_Igain[i]=set_data[(i+1)*10+1];
lsh2205 0:e12eb40b9fef 46 position_Pgain[i]=set_data[(i+1)*10+2];
lsh2205 0:e12eb40b9fef 47 Position_input_filter[i]=set_data[(i+1)*10+3];
lsh2205 0:e12eb40b9fef 48 Speed_I_input_filter[i]=set_data[(i+1)*10+4];
lsh2205 0:e12eb40b9fef 49 offset[i]=set_data[(i+1)*10+5];
lsh2205 0:e12eb40b9fef 50 }
lsh2205 0:e12eb40b9fef 51
lsh2205 0:e12eb40b9fef 52
lsh2205 0:e12eb40b9fef 53 READ_and_SAVE();
lsh2205 0:e12eb40b9fef 54 //pc.printf("%s,",command);
lsh2205 0:e12eb40b9fef 55 Set_Arrangement();
lsh2205 0:e12eb40b9fef 56 Start_Command();
lsh2205 0:e12eb40b9fef 57
lsh2205 0:e12eb40b9fef 58 }
lsh2205 0:e12eb40b9fef 59
lsh2205 0:e12eb40b9fef 60 void Start_Command()
lsh2205 0:e12eb40b9fef 61 {
lsh2205 0:e12eb40b9fef 62 bool com_error=false;
lsh2205 0:e12eb40b9fef 63
lsh2205 0:e12eb40b9fef 64 unsigned int temp=0;
lsh2205 0:e12eb40b9fef 65
lsh2205 0:e12eb40b9fef 66 unsigned int data1=32768;
lsh2205 0:e12eb40b9fef 67 unsigned int data2=32768;
lsh2205 0:e12eb40b9fef 68 unsigned int data3=32768;
lsh2205 0:e12eb40b9fef 69 unsigned int data4=32768;
lsh2205 0:e12eb40b9fef 70 unsigned int data5=32768;
lsh2205 0:e12eb40b9fef 71 unsigned int data6=32768;
lsh2205 0:e12eb40b9fef 72
lsh2205 0:e12eb40b9fef 73 com_error=data_error_check();
lsh2205 0:e12eb40b9fef 74
lsh2205 0:e12eb40b9fef 75 if(com_error==false)
lsh2205 0:e12eb40b9fef 76 if((command[0] == 'S') && (command[1] == 't') && (command[2] == 'a') && (command[3] == 'r') && (command[4] == 't'))
lsh2205 0:e12eb40b9fef 77 {
lsh2205 0:e12eb40b9fef 78
lsh2205 0:e12eb40b9fef 79 int num=0;
lsh2205 0:e12eb40b9fef 80 for(int i=5; i<100;i++)
lsh2205 0:e12eb40b9fef 81 {
lsh2205 0:e12eb40b9fef 82
lsh2205 0:e12eb40b9fef 83 if(command[i]==',')
lsh2205 0:e12eb40b9fef 84 {
lsh2205 0:e12eb40b9fef 85 if(num==0)
lsh2205 0:e12eb40b9fef 86 data1=temp;
lsh2205 0:e12eb40b9fef 87 if(num==1)
lsh2205 0:e12eb40b9fef 88 data2=temp;
lsh2205 0:e12eb40b9fef 89 if(num==2)
lsh2205 0:e12eb40b9fef 90 data3=temp;
lsh2205 0:e12eb40b9fef 91 if(num==3)
lsh2205 0:e12eb40b9fef 92 data4=temp;
lsh2205 0:e12eb40b9fef 93 if(num==4)
lsh2205 0:e12eb40b9fef 94 data5=temp;
lsh2205 0:e12eb40b9fef 95
lsh2205 0:e12eb40b9fef 96 temp=0;
lsh2205 0:e12eb40b9fef 97 num++;
lsh2205 0:e12eb40b9fef 98 }
lsh2205 0:e12eb40b9fef 99 else if(command[i]=='\n')
lsh2205 0:e12eb40b9fef 100 {
lsh2205 0:e12eb40b9fef 101 if(num==5)
lsh2205 0:e12eb40b9fef 102 data6=temp;
lsh2205 0:e12eb40b9fef 103 }else
lsh2205 0:e12eb40b9fef 104 temp=temp*10+command[i]-0x30;
lsh2205 0:e12eb40b9fef 105 }
lsh2205 0:e12eb40b9fef 106
lsh2205 0:e12eb40b9fef 107 cmd_roll = data1;
lsh2205 0:e12eb40b9fef 108 cmd_pitch = data2;
lsh2205 0:e12eb40b9fef 109 cmd_heave = data3;
lsh2205 0:e12eb40b9fef 110 cmd_sway = data4;
lsh2205 0:e12eb40b9fef 111 cmd_surge = data5;
lsh2205 0:e12eb40b9fef 112 cmd_yaw = data6;
lsh2205 0:e12eb40b9fef 113
lsh2205 0:e12eb40b9fef 114 /*
lsh2205 0:e12eb40b9fef 115 pc.printf("%d,",cmd_roll);
lsh2205 0:e12eb40b9fef 116 pc.printf("%d,",cmd_pitch);
lsh2205 0:e12eb40b9fef 117 pc.printf("%d,",cmd_heave);
lsh2205 0:e12eb40b9fef 118 pc.printf("%d,",cmd_sway);
lsh2205 0:e12eb40b9fef 119 pc.printf("%d,",cmd_surge);
lsh2205 0:e12eb40b9fef 120 pc.printf("%d,",cmd_yaw);
lsh2205 0:e12eb40b9fef 121 pc.printf("\n");
lsh2205 0:e12eb40b9fef 122 */
lsh2205 0:e12eb40b9fef 123 }
lsh2205 0:e12eb40b9fef 124
lsh2205 0:e12eb40b9fef 125 }
lsh2205 0:e12eb40b9fef 126
lsh2205 0:e12eb40b9fef 127 bool data_error_check() // ,아스키코드 44 숫자 아스키코드 0x30, 0x39
lsh2205 0:e12eb40b9fef 128 {
lsh2205 0:e12eb40b9fef 129 bool error=false;
lsh2205 0:e12eb40b9fef 130
lsh2205 0:e12eb40b9fef 131
lsh2205 0:e12eb40b9fef 132 if(!((command[0] == 'S') && (command[1] == 't') && (command[2] == 'a') && (command[3] == 'r') && (command[4] == 't')))
lsh2205 0:e12eb40b9fef 133 error=true;
lsh2205 0:e12eb40b9fef 134
lsh2205 0:e12eb40b9fef 135 for(int i=5; i<41;i++)
lsh2205 0:e12eb40b9fef 136 {
lsh2205 0:e12eb40b9fef 137 if( command[i]>0x39 || command[i]<0x30 )
lsh2205 0:e12eb40b9fef 138 {
lsh2205 0:e12eb40b9fef 139 if((command[i]=='\n'))
lsh2205 0:e12eb40b9fef 140 break;
lsh2205 0:e12eb40b9fef 141
lsh2205 0:e12eb40b9fef 142 if(!(command[i]==0x2C))
lsh2205 0:e12eb40b9fef 143 {
lsh2205 0:e12eb40b9fef 144 error=true;
lsh2205 0:e12eb40b9fef 145 break;
lsh2205 0:e12eb40b9fef 146 }
lsh2205 0:e12eb40b9fef 147 }
lsh2205 0:e12eb40b9fef 148 }
lsh2205 0:e12eb40b9fef 149
lsh2205 0:e12eb40b9fef 150 for(int i=41;i<100;i++)
lsh2205 0:e12eb40b9fef 151 {
lsh2205 0:e12eb40b9fef 152 if(command[i]!=0)
lsh2205 0:e12eb40b9fef 153 error=true;
lsh2205 0:e12eb40b9fef 154 break;
lsh2205 0:e12eb40b9fef 155 }
lsh2205 0:e12eb40b9fef 156
lsh2205 0:e12eb40b9fef 157 for(int i=0;i<17;i++)
lsh2205 0:e12eb40b9fef 158 {
lsh2205 0:e12eb40b9fef 159 if(command[i]==0)
lsh2205 0:e12eb40b9fef 160 error=true;
lsh2205 0:e12eb40b9fef 161 break;
lsh2205 0:e12eb40b9fef 162 }
lsh2205 0:e12eb40b9fef 163
lsh2205 0:e12eb40b9fef 164 return error;
lsh2205 0:e12eb40b9fef 165 }
lsh2205 0:e12eb40b9fef 166
lsh2205 0:e12eb40b9fef 167
lsh2205 0:e12eb40b9fef 168 // Set arrangement function
lsh2205 0:e12eb40b9fef 169 void Set_Arrangement()
lsh2205 0:e12eb40b9fef 170 {
lsh2205 0:e12eb40b9fef 171 bool set_error = false;
lsh2205 0:e12eb40b9fef 172 bool set_point = false;
lsh2205 0:e12eb40b9fef 173 int set_index = 0;
lsh2205 0:e12eb40b9fef 174 double set_num = 0;
lsh2205 0:e12eb40b9fef 175 double square_root = 0.1;
lsh2205 0:e12eb40b9fef 176
lsh2205 0:e12eb40b9fef 177 if((command[0] == 'S') && (command[1] == 'E') && (command[2] == 'T') && (command[5] == '='))
lsh2205 0:e12eb40b9fef 178 {
lsh2205 0:e12eb40b9fef 179 for(int i = 3; i < 5; i++)
lsh2205 0:e12eb40b9fef 180 {
lsh2205 0:e12eb40b9fef 181 if(command[i] < '0' || command[i] > '9')
lsh2205 0:e12eb40b9fef 182 {
lsh2205 0:e12eb40b9fef 183 set_error = true;
lsh2205 0:e12eb40b9fef 184 break;
lsh2205 0:e12eb40b9fef 185 }
lsh2205 0:e12eb40b9fef 186 }
lsh2205 0:e12eb40b9fef 187 if(set_error == false)
lsh2205 0:e12eb40b9fef 188 {
lsh2205 0:e12eb40b9fef 189 set_index = ((command[3] - 0x30) * 10) + (command[4] - 0x30);
lsh2205 0:e12eb40b9fef 190
lsh2205 0:e12eb40b9fef 191 for(int i = 6; i < 100; i++)
lsh2205 0:e12eb40b9fef 192 {
lsh2205 0:e12eb40b9fef 193 // Error check
lsh2205 0:e12eb40b9fef 194 if(command[i] != '.' && (command[i] < '0' || command[i] > '9'))
lsh2205 0:e12eb40b9fef 195 {
lsh2205 0:e12eb40b9fef 196 if(command[i] != '\n')
lsh2205 0:e12eb40b9fef 197 {
lsh2205 0:e12eb40b9fef 198 set_error = true;
lsh2205 0:e12eb40b9fef 199 }
lsh2205 0:e12eb40b9fef 200 break;
lsh2205 0:e12eb40b9fef 201 }
lsh2205 0:e12eb40b9fef 202
lsh2205 0:e12eb40b9fef 203 // Operation source
lsh2205 0:e12eb40b9fef 204 else if(command[i] == '.' && set_point == false)
lsh2205 0:e12eb40b9fef 205 {
lsh2205 0:e12eb40b9fef 206 set_point = true;
lsh2205 0:e12eb40b9fef 207 }
lsh2205 0:e12eb40b9fef 208 else if(set_point == false)
lsh2205 0:e12eb40b9fef 209 {
lsh2205 0:e12eb40b9fef 210 set_num = (set_num * 10) + (command[i] - 0x30);
lsh2205 0:e12eb40b9fef 211 }
lsh2205 0:e12eb40b9fef 212 else if(set_point == true)
lsh2205 0:e12eb40b9fef 213 {
lsh2205 0:e12eb40b9fef 214 set_num = set_num + ((command[i] - 0x30) * square_root);
lsh2205 0:e12eb40b9fef 215 square_root = square_root * 0.1;
lsh2205 0:e12eb40b9fef 216 }
lsh2205 0:e12eb40b9fef 217 }
lsh2205 0:e12eb40b9fef 218 }
lsh2205 0:e12eb40b9fef 219 if((set_error == false) && (set_data[set_index] != set_num))
lsh2205 0:e12eb40b9fef 220 {
lsh2205 0:e12eb40b9fef 221 set_data[set_index] = set_num;
lsh2205 0:e12eb40b9fef 222 Erase_Flash();
lsh2205 0:e12eb40b9fef 223 Write_Flash('F');
lsh2205 0:e12eb40b9fef 224 Write_Flash('L');
lsh2205 0:e12eb40b9fef 225 Write_Flash('A');
lsh2205 0:e12eb40b9fef 226 Write_Flash('S');
lsh2205 0:e12eb40b9fef 227 Write_Flash('H');
lsh2205 0:e12eb40b9fef 228 for(int i = 0; i < 100; i++)
lsh2205 0:e12eb40b9fef 229 {
lsh2205 0:e12eb40b9fef 230 Write_Flash((uint32_t)set_data[i]);
lsh2205 0:e12eb40b9fef 231 }
lsh2205 0:e12eb40b9fef 232 pc.printf("SET%02d=%10.5f\n",set_index,set_data[set_index]);
lsh2205 0:e12eb40b9fef 233 }
lsh2205 0:e12eb40b9fef 234 }
lsh2205 0:e12eb40b9fef 235
lsh2205 0:e12eb40b9fef 236 }
lsh2205 0:e12eb40b9fef 237
lsh2205 0:e12eb40b9fef 238
lsh2205 0:e12eb40b9fef 239 bool tx_done=false;
lsh2205 0:e12eb40b9fef 240 void READ_and_SAVE()
lsh2205 0:e12eb40b9fef 241 {
lsh2205 0:e12eb40b9fef 242
lsh2205 0:e12eb40b9fef 243 at_spi_cs = 1;
lsh2205 0:e12eb40b9fef 244 char c;
lsh2205 0:e12eb40b9fef 245 tx_done=false;
lsh2205 0:e12eb40b9fef 246 for(int i=0; i<64; i++)
lsh2205 0:e12eb40b9fef 247 {
lsh2205 0:e12eb40b9fef 248 wait_us(20);
lsh2205 0:e12eb40b9fef 249 c = spi1.write(255);
lsh2205 0:e12eb40b9fef 250
lsh2205 0:e12eb40b9fef 251 if(c==255)
lsh2205 0:e12eb40b9fef 252 {
lsh2205 0:e12eb40b9fef 253 break;
lsh2205 0:e12eb40b9fef 254 }
lsh2205 0:e12eb40b9fef 255 else
lsh2205 0:e12eb40b9fef 256 {
lsh2205 0:e12eb40b9fef 257 //pc.printf("%d\r\n",c);
lsh2205 0:e12eb40b9fef 258 char_save_arr(c);
lsh2205 0:e12eb40b9fef 259 }
lsh2205 0:e12eb40b9fef 260 }
lsh2205 0:e12eb40b9fef 261 at_spi_cs = 0;
lsh2205 0:e12eb40b9fef 262
lsh2205 0:e12eb40b9fef 263 }
lsh2205 0:e12eb40b9fef 264
lsh2205 0:e12eb40b9fef 265
lsh2205 0:e12eb40b9fef 266 void char_save_arr(char c)
lsh2205 0:e12eb40b9fef 267 {
lsh2205 0:e12eb40b9fef 268 rx_buffer[rx_index]=c;
lsh2205 0:e12eb40b9fef 269 rx_index++;
lsh2205 0:e12eb40b9fef 270 if(rx_index>99)
lsh2205 0:e12eb40b9fef 271 rx_index=99;
lsh2205 0:e12eb40b9fef 272 if(c=='\n')
lsh2205 0:e12eb40b9fef 273 {
lsh2205 0:e12eb40b9fef 274 data_recive++;
lsh2205 0:e12eb40b9fef 275 for(int i =0; i<100;i++)
lsh2205 0:e12eb40b9fef 276 command[i]=rx_buffer[i];
lsh2205 0:e12eb40b9fef 277
lsh2205 0:e12eb40b9fef 278 Rx_Buffer_Clear();
lsh2205 0:e12eb40b9fef 279 }
lsh2205 0:e12eb40b9fef 280 }
lsh2205 0:e12eb40b9fef 281
lsh2205 0:e12eb40b9fef 282
lsh2205 0:e12eb40b9fef 283
lsh2205 0:e12eb40b9fef 284
lsh2205 0:e12eb40b9fef 285 // Interrupt functions
lsh2205 0:e12eb40b9fef 286 /*
lsh2205 0:e12eb40b9fef 287 void Rx_Interrupt()
lsh2205 0:e12eb40b9fef 288 {
lsh2205 0:e12eb40b9fef 289 if(pc.readable())
lsh2205 0:e12eb40b9fef 290 {
lsh2205 0:e12eb40b9fef 291 char c = pc.getc();
lsh2205 0:e12eb40b9fef 292 rx_buffer[rx_index] = c;
lsh2205 0:e12eb40b9fef 293 if(rx_buffer[rx_index] == '\n')
lsh2205 0:e12eb40b9fef 294 {
lsh2205 0:e12eb40b9fef 295 rx_flag = true;
lsh2205 0:e12eb40b9fef 296 }
lsh2205 0:e12eb40b9fef 297 rx_index++;
lsh2205 0:e12eb40b9fef 298 if(rx_index > 99)
lsh2205 0:e12eb40b9fef 299 {
lsh2205 0:e12eb40b9fef 300 rx_index = 99;
lsh2205 0:e12eb40b9fef 301 }
lsh2205 0:e12eb40b9fef 302 }
lsh2205 0:e12eb40b9fef 303 return;
lsh2205 0:e12eb40b9fef 304 }
lsh2205 0:e12eb40b9fef 305 */
lsh2205 0:e12eb40b9fef 306 // Basic serial communication functions
lsh2205 0:e12eb40b9fef 307
lsh2205 0:e12eb40b9fef 308 void Serial_Init()
lsh2205 0:e12eb40b9fef 309 {
lsh2205 0:e12eb40b9fef 310 pc.format(8, Serial::None, 1);
lsh2205 0:e12eb40b9fef 311 pc.baud(500000);
lsh2205 0:e12eb40b9fef 312
lsh2205 0:e12eb40b9fef 313 //pc2.format(8, Serial::None, 1);
lsh2205 0:e12eb40b9fef 314 //pc2.baud(115200);
lsh2205 0:e12eb40b9fef 315 //pc.attach(&Rx_Interrupt, Serial::RxIrq);
lsh2205 0:e12eb40b9fef 316 }
lsh2205 0:e12eb40b9fef 317
lsh2205 0:e12eb40b9fef 318
lsh2205 0:e12eb40b9fef 319 void Rx_Buffer_Clear()
lsh2205 0:e12eb40b9fef 320 {
lsh2205 0:e12eb40b9fef 321 for(int i = 0; i < 100; i++)
lsh2205 0:e12eb40b9fef 322 {
lsh2205 0:e12eb40b9fef 323 rx_buffer[i] = 0x00;
lsh2205 0:e12eb40b9fef 324 }
lsh2205 0:e12eb40b9fef 325 rx_index=0;
lsh2205 0:e12eb40b9fef 326 }
lsh2205 0:e12eb40b9fef 327
lsh2205 0:e12eb40b9fef 328
lsh2205 0:e12eb40b9fef 329 /*
lsh2205 0:e12eb40b9fef 330 if(com_error==false)
lsh2205 0:e12eb40b9fef 331 {
lsh2205 0:e12eb40b9fef 332 cmd_roll = data1;
lsh2205 0:e12eb40b9fef 333 cmd_pitch = data2;
lsh2205 0:e12eb40b9fef 334 cmd_heave = data3;
lsh2205 0:e12eb40b9fef 335 cmd_sway = data4;
lsh2205 0:e12eb40b9fef 336 cmd_surge = data5;
lsh2205 0:e12eb40b9fef 337 cmd_yaw = data6;
lsh2205 0:e12eb40b9fef 338 }
lsh2205 0:e12eb40b9fef 339 */
lsh2205 0:e12eb40b9fef 340
lsh2205 0:e12eb40b9fef 341 #endif