jihad al akl
/
atests_car
-include wait_with_jihad_s -a mini ai that need interrupt
main.cpp
- Committer:
- vjixy
- Date:
- 2020-03-03
- Revision:
- 1:202a0e209b73
- Parent:
- 0:b00ca4083336
File content as of revision 1:202a0e209b73:
#include "mbed.h" #include "Servo.h" //CONNCTION OF PIXY WITH FRDM #define mosiPin PTD3 #define misoPin PTD2 #define clockPin PTD1 #define sspin PTD0 #define speed_Limit 10 #define PIXY_SPI_CLOCKRATE 2000000 //first bytes of pixy 2 packets with/without checksum packets; #define hex_no_Checksum_First_Byte 0xAE #define hex_no_Checksum_Second_Byte 0xC1 #define hex_Checksum_First_Byte 0xAF //type #define hex_Set_Lamp_Request 0X16//set Lamp request #define hex_Get_Main_Features_Request 0X30//Get Main_Features request #define hex_Get_Main_Features_Response 0X31//Get Main_Features response #define hex_Set_Mode_Request 0X36//Set Mode request #define hex_Set_Next_Turn_Request 0X3A//Set Next Turn request #define hex_Set_Default_Turn_Request 0X3C//Set Default Turn request #define hex_Set_Vector_Request 0X38//Set Vector request #define hex_Revese_Vector_Request 0X3E//Reverse Vector request #define PIXY_TYPE_REQUEST_CHANGE_PROG 0x02//request program change #define PIXY_MAX_PROGNAME 0x21//change programe #define LINE_MAX_INTERSECTION_LINES 30 //the Feature is set with an or request -->3->Vectors+ Intersection #define FeatureVector 1 #define FeatureIntersection 2 #define FeatureBarcode 4 struct Vector { uint8_t m_x0; uint8_t m_y0; uint8_t m_x1; uint8_t m_y1; uint8_t m_index; uint8_t m_flags; }; struct IntersectionLine { uint8_t m_index; uint8_t m_reserved; int16_t m_angle; }; struct Intersection { void print() { char buf[64]; uint8_t i; sprintf(buf, "intersection: (%d %d)", m_x, m_y); printf("%s\n", buf); for (i = 0; i < m_n; i++) { sprintf(buf, " %d: index: %d angle: %d", i, m_intLines[i].m_index, m_intLines[i].m_angle); printf("%s\n", buf); } } uint8_t m_x; uint8_t m_y; uint8_t m_n; uint8_t m_reserved; IntersectionLine m_intLines[LINE_MAX_INTERSECTION_LINES]; }; struct Barcode { void print() { char buf[64]; sprintf(buf, "Barcode: (%d %d), val: %d flags: %d", m_x, m_y, m_code, m_flags); printf("%s\n", buf); } uint8_t m_x; uint8_t m_y; uint8_t m_flags; uint8_t m_code; }; uint8_t Buffer[40]; Vector vectors[20]; Intersection intersections[10]; Barcode barcodes[10]; int length = 0; int numberOfVector = 0; int numberOfIntersections = 0; int numberOfbarcodes = 0; double angle = 0; int biggest_nb; int biggest_y; int speed; SPI spi(mosiPin, misoPin, clockPin);//mosi,miso,clock DigitalOut ssPin(sspin, 1);//pin for slave selection Servo motorLeft(PTE20); Servo motorRight(PTE21); Servo myservo(PTE29); bool cheksumValidation(uint8_t *Buff, uint8_t len) { if (len < 6) { printf("Len <6"); return false; } uint16_t Checksum = Buff[5] << 8 | Buff[4]; uint16_t sum = 0x0000; for (int i = 6; i < len; i++) sum += Buff[i]; return sum == Checksum; } void clearBuffer(uint8_t *buff) { for (int i = 0; i < 40; i++) buff[i] = 0x00; } int16_t recv(uint8_t *buf) { uint16_t *cs = NULL; if (cs) *cs = 0; uint8_t len; uint8_t i; ssPin = 0; bool frst = false; for (i = 0; i < 4; i++) { if (i == 0) do { buf[i] = spi.write(0x00); if (cs) *cs += buf[i]; if (buf[i] == 0xaf) frst = true; } while (!frst); else { buf[i] = spi.write(0x00); if (cs) *cs += buf[i]; } } if (buf[0] == hex_Checksum_First_Byte) len = 2 + buf[3]; else len = buf[3]; for (i = 0; i < 35; i++) { buf[i + 4] = spi.write(0x00); } len += 4; ssPin = 1; return len; } int16_t send(uint8_t *buf, uint8_t len) { uint8_t i; ssPin = 0; for (i = 0; i < len; i++) spi.write(buf[i]); ssPin = 1; return len; } void getMainFeaturesHandler(uint8_t *buf, uint8_t len) { numberOfVector = 0; numberOfbarcodes = 0; numberOfIntersections = 0; printf("CHecking Features\n"); for (int i = 6; i < len; i++) { switch (buf[i]) { case FeatureVector: ++i; printf("found vector\n"); vectors[numberOfVector].m_x0 = buf[++i]; vectors[numberOfVector].m_y0 = buf[++i]; vectors[numberOfVector].m_x1 = buf[++i]; vectors[numberOfVector].m_y1 = buf[++i]; vectors[numberOfVector].m_index = buf[++i]; vectors[numberOfVector].m_flags = buf[++i]; numberOfVector++; break; case FeatureIntersection: ++i; intersections[numberOfIntersections].m_x = buf[++i]; intersections[numberOfIntersections].m_y = buf[++i]; intersections[numberOfIntersections].m_n = buf[++i]; intersections[numberOfIntersections].m_reserved = buf[++i]; for (int j = 0; j < LINE_MAX_INTERSECTION_LINES; j++) { intersections[numberOfIntersections].m_intLines->m_index = buf[++i]; intersections[numberOfIntersections].m_intLines->m_reserved = buf[++i]; intersections[numberOfIntersections].m_intLines->m_angle = buf[++i]; } break; case FeatureBarcode: i++; barcodes[numberOfbarcodes].m_x = buf[++i]; barcodes[numberOfbarcodes].m_y = buf[++i]; barcodes[numberOfbarcodes].m_flags = buf[++i]; barcodes[numberOfbarcodes].m_code = buf[++i]; break; } } } void setLamp(uint8_t value1, uint8_t value2) { clearBuffer(Buffer); Buffer[0] = hex_no_Checksum_First_Byte; Buffer[1] = hex_no_Checksum_Second_Byte; Buffer[2] = hex_Set_Lamp_Request; Buffer[3] = 0x02; Buffer[4] = value1; Buffer[5] = value2; printf("V1:%d,V2:%d\n\r", value1, value2); int16_t len = send(Buffer, 6); len = recv(Buffer); } void getFeatures(uint8_t type, uint8_t Features) { clearBuffer(Buffer); Buffer[0] = hex_no_Checksum_First_Byte; Buffer[1] = hex_no_Checksum_Second_Byte; Buffer[2] = hex_Get_Main_Features_Request; Buffer[3] = 0x02; Buffer[4] = type; Buffer[5] = Features; int16_t len = send(Buffer, 6); printf("Getting features\n"); len = recv(Buffer); getMainFeaturesHandler(Buffer, len); } void changeProg(const char *prog) { clearBuffer(Buffer); Buffer[0] = hex_no_Checksum_First_Byte; Buffer[1] = hex_no_Checksum_Second_Byte; Buffer[2] = PIXY_TYPE_REQUEST_CHANGE_PROG; Buffer[3] = strlen(prog); length = send(Buffer, Buffer[3] + 4); length = recv(Buffer); } void Print(int i) { char buf[64]; sprintf(buf, "vector: (%d %d) (%d %d) index: %d flags %d", vectors[i].m_x0, vectors[i].m_y0, vectors[i].m_x1, vectors[i].m_y1, vectors[i].m_index, vectors[i].m_flags); printf("%s\n", buf); } void setSpeed(int speed) { printf("CHanged Speed\n"); double var=speed*speed_Limit/100; var = var/100 +0.5; motorLeft = var; motorRight = var; } void arm()//arm the esc { motorLeft = 0.0; motorRight = 0.0; wait(0.5); //detects signal //Required ESC Calibration/Arming sequence //sends longest and shortest PWM pulse to learn and arm at power on motorLeft = 1.0; //send longest PWM motorRight = 1.0; wait(2); motorLeft = 0.0; //send shortest PWM motorRight = 0.0; wait(2); //ESC now operational using standard servo PWM signals for (float p = 0; p <= 0.5; p += 0.025) { printf("Arming underway\n"); motorLeft = p; motorRight = p; wait_ms(100); } printf("leaving arming"); } void loop() { //Serial.println(angle); int8_t i; getFeatures(0x01, 0x07); if (numberOfVector > 0) { biggest_nb = 0; biggest_y = vectors[0].m_y1 - vectors[0].m_y0; for (i = 0; i < numberOfVector; i++) { if ((vectors[i].m_y1 - vectors[i].m_y0) > biggest_y) { biggest_y = vectors[i].m_y1 - vectors[i].m_y0; biggest_nb = i; } } // for (i = 0; i < numberOfVector; i++) // { Print(biggest_nb); int x0 = vectors[biggest_nb].m_x0; int x1 = vectors[biggest_nb].m_x1; int x = x0 - x1; int y0 = vectors[biggest_nb].m_y0; int y1 = vectors[biggest_nb].m_y1; int y = y0 - y1; if (y < 0)y *= -1; double param= y / x; angle = atan(param) * 180/3.14; printf("angle:%d\n", angle); if (angle > -40 || angle < 40) { myservo.position(angle); setSpeed(30); } else { myservo.position(0); setSpeed(50); } wait_ms(100); } else { myservo.position(angle); setSpeed(0); wait_ms(50); } } /*******************************start part for jihad*******************************/ bool Part1=false;bool cou3_3al_yamin=false; bool Part2=false;bool cou3_3al_chmel=false; bool msalbiye_detected=false; bool the_end=false; void check_the_end(); void rouh_chmel(); void rouh_yamin(); void cawi3_yamin(); void cawi3_chmel(); void Check_msalbiye(); void Check_vector_left(Vector v); void Check_vector_right(Vector v); void check_lines(); void J_loop(); void Check_intersections(); void jihad_tester_loop(); void Check_cwe3(Vector v); void wait_with_jihad(double i); bool jihad_timer_s=false; Ticker tick; Timer t; /**********************************end part for jihad******************************/ int main() { spi.format(8, 0); spi.frequency(PIXY_SPI_CLOCKRATE); myservo.calibrate(0.001, 90); myservo.write(0.5); //call the esc arming function arm(); // while(1) //{ motorLeft =0.8; // motorRight =0.8;} //printf("process started"); // setSpeed(100); //printf("process started"); changeProg("line"); printf("process started"); //setSpeed(50); jihad_tester_loop(); //printf("process started"); // J_loop(); //while(1){ // // myservo.position(40); // wait(3); // myservo.position(-40); // wait(3); // myservo.position(0); // wait(3); // // } } /*******************************start AI of jihad*******************************/ void wait_with_jihad_s(double i){ jihad_time=true; int j=0; i*=1000; while(jihad_timer){ wait_ms(1); j++; if(j>=i)jihad_timer=false; } } void jihad_tester_loop(){ setSpeed(60); while (1) { int8_t i; getFeatures(0x01, 0x07); for (int i = 0; i < numberOfVector; i++) { Check_cwe3(vectors[i]); } if(!cou3_3al_chmel&&!cou3_3al_yamin) myservo.position(0); if(cou3_3al_chmel) cawi3_chmel(); if(cou3_3al_yamin) cawi3_yamin(); //wait_ms(50); cou3_3al_chmel=false; cou3_3al_yamin=false; Part1=false; Part2=false; } } //myservo.position(0); void Check_cwe3(Vector v){ if(v.m_y0<35&&v.m_y1>15&&v.m_x0<35&&v.m_x1>35) cou3_3al_chmel=true; if(v.m_y1<35&&v.m_y0>15&&v.m_x1<35&&v.m_x0>35) cou3_3al_chmel=true; if(v.m_y0<35&&v.m_y1>15&&v.m_x0>35&&v.m_x1<35) cou3_3al_yamin=true; if(v.m_y1<35&&v.m_y0>15&&v.m_x1>35&&v.m_x0<35) cou3_3al_yamin=true; } void check_the_end(){ int three_nb=0; for(int i = 0; i < numberOfVector; i++) { if ( (vectors[i].m_x0<65&&vectors[i].m_x0>10)||(vectors[i].m_x1<65&&vectors[i].m_x1>10)) if ( (vectors[i].m_y0>10&&vectors[i].m_y0<20)||(vectors[i].m_y1>10&&vectors[i].m_y1<20)) three_nb++; } if(three_nb>=3){ wait_ms(500); the_end=true; setSpeed(0); } } void rouh_chmel(){ myservo.position(-45); wait_ms(50); //myservo.position(0); } void rouh_yamin(){ myservo.position(45); wait_ms(50); //myservo.position(0); } void cawi3_yamin(){ myservo.position(40); // wait_ms(1000); // myservo.position(0); } void cawi3_chmel(){ myservo.position(-40); // wait_ms(1000); // wait(1.5); // myservo.position(0); } void Check_msalbiye(){ if(numberOfIntersections>=4){ Part1=true; Part2=true; wait(1);} } void Check_intersections(){ bool cou3_yamin=false; bool cou3_chmel=false; bool mata3mel_chi=false; for(int i=0;i<numberOfIntersections;i++){ if(intersections[i].m_y<15) if(intersections[i].m_x<20) cou3_yamin=true; if(intersections[i].m_y<15) if(intersections[i].m_x>68) cou3_chmel=true; } if(cou3_chmel&&cou3_yamin) mata3mel_chi=true; if(!mata3mel_chi){ if(cou3_chmel) cawi3_chmel(); if(cou3_yamin) cawi3_yamin(); } } void Check_vector_left(Vector v){ if(v.m_y0<16&&v.m_y1>45&&v.m_x0<35&&v.m_x1<35) Part1=true; if(v.m_y1<16&&v.m_y0>45&&v.m_x0<35&&v.m_x1<35) Part1=true; } void Check_vector_right(Vector v){ printf("check_vect_right"); if(v.m_y0<16&&v.m_y1>30&&v.m_x0>35&&v.m_x1>35) Part2=true; if(v.m_y1<16&&v.m_y0>30&&v.m_x0>35&&v.m_x1>35) Part2=true; } void check_lines(){ for (int i = 0; i < numberOfVector; i++) { Print(i); Check_vector_left(vectors[i]); Check_vector_right(vectors[i]); } } void J_loop(){ //motorLeft =0.8; //motorRight =0.8; // printf("entering_jihad loop"); setSpeed(50); while(!the_end){ int8_t i; getFeatures(0x01, 0x07); //if(numberOfVector >= 5) // check_the_end(); if (numberOfVector > 0) { check_lines(); } // Check_msalbiye(); // if(!Part1) // rouh_chmel(); // if(!Part2) // rouh_yamin(); if(Part2&&Part1) myservo.position(0); // if(numberOfIntersections>=2) // Check_intersections(); Part1=false; Part2=false; } //setSpeed(0); }