Advertisement
Guest User

main.c

a guest
May 28th, 2018
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 13.29 KB | None | 0 0
  1. /*
  2.  * To change this license header, choose License Headers in Project Properties.
  3.  * To change this template file, choose Tools | Templates
  4.  * and open the template in the editor.
  5.  */
  6.  
  7. /*
  8.  * File:   main.c
  9.  * Author: Umut KAZANÇ
  10.  *
  11.  * Created on 12 Nisan 2017 Çarşamba, 18:40
  12.  */
  13.  
  14. #include <stdio.h>
  15. #include <stdlib.h>
  16. #include <netdb.h>
  17. #include <netinet/in.h>
  18. #include <string.h>
  19. #include <arpa/inet.h>  /* for sockaddr_in and inet_ntoa() */
  20. #include <wiringPi.h>
  21. #include <softPwm.h>
  22. #include <stdint.h>
  23. #include <unistd.h>
  24.  
  25.  
  26. //prg versiyon
  27. #define PrgVer       "1.0.1"
  28.  
  29. //pinler
  30. #define Motor1_1    0
  31. #define Motor1_2    1
  32. #define Motor2_1    2
  33. #define Motor2_2    3
  34. #define Motor1_E    4
  35. #define Motor2_E    5
  36. #define LedSag      21
  37. #define LedSol      22
  38. #define LedOnFar    23
  39. #define LedArkaFar  24
  40. #define LED1        25
  41. #define TRIG        13
  42. #define ECHO        12
  43. #define Servo1      11
  44.  
  45. //komut str
  46. #define cmd_ileri       "<ileri>"
  47. #define cmd_geri        "<geri>"
  48. #define cmd_sag         "<sag>"
  49. #define cmd_sol         "<sol>"
  50. #define cmd_dur         "<dur>"
  51. #define cmd_close       "<close>"
  52. #define cmd_temp        "<temp>"
  53. #define cmd_hiz         "&hiz="
  54. #define cmd_servo1      "servo1="
  55. #define cmd_info        "info=?"
  56. #define cmd_onfar       "onfar=ok"
  57. #define HTTP_OK         "HTTP/1.1 200 OK\r\n\r\n"
  58.  
  59. #define ForntMinDist    25  //cm
  60. #define Servo1MaxVal    22  //servo motorum max pwm
  61. #define Servo1MinVal    5   //servo motorum min pwm
  62.  
  63. #define DIST_KEY    0
  64.  
  65. //tcp
  66. int sockfd, newsockfd, portno, clilen;
  67. char buffer[256];
  68. char TXbuffer[256];
  69. struct sockaddr_in serv_addr, cli_addr;
  70. int  n;
  71.  
  72. //temp
  73. char CPUtempfile[] = {"/sys/class/thermal/thermal_zone0/temp"};
  74. char DStempfile[] = {"/sys/devices/w1_bus_master1/28-041502394cff/w1_slave"};
  75.  
  76. //değiskenler
  77. uint16_t    CPUTemp=0;
  78. uint16_t    DSTemp=0;
  79. char        *ptr1;
  80. char        *ptr2;
  81. uint8_t     strsize;
  82. uint8_t     MotorHiz=50;
  83. char        HizStr[5];
  84. int         FrontDist=0;
  85. uint8_t     FrontDistAlert=0;
  86. uint8_t     ileriEN=0;
  87. uint8_t     geriEN=0;
  88. uint8_t     sagEN=0;
  89. uint8_t     solEN=0;
  90. uint8_t     Servo1Val=50;
  91. char        Servo1ValStr[5];
  92. uint8_t     Servo1ValYed;
  93. uint16_t    Servo1Delay;
  94.  
  95.  
  96.  
  97. //prototip
  98. int getForntCM();
  99. uint16_t  GetCPUTemp();
  100. uint16_t  GetDSTemp();
  101. void MultiThreading_init(void);
  102. void LedToggle(void);
  103. void Gpio_init(void);
  104. void TCPserver_init(void);
  105. void Motor_ileri(void);
  106. void Motor_geri(void);
  107. void Motor_sag(void);
  108. void Motor_sol(void);
  109. void Motor_dur(void);
  110. void Servo1_Kontrol(void);
  111. void ServoShow(void);
  112. void OnFarToggle(void);
  113.  
  114.  
  115.  
  116. int main(int argc, char** argv)
  117. {
  118.     //init
  119.    
  120.     printf("\r\n------------------------------\r\n");
  121.     printf("RC CAR Uygulamasi DEMO test...\r\n");
  122.    
  123.     wiringPiSetup();
  124.     Gpio_init();
  125.     MultiThreading_init();
  126.     TCPserver_init();
  127.     ServoShow();
  128.    
  129.     delay(50);
  130.  
  131.     //main while
  132.     while(1)
  133.     {
  134.         //MultiThreading olduğu için main boş kalacak :)
  135.         delay(250);
  136.     }
  137.  
  138.     return (EXIT_SUCCESS);
  139. }
  140.  
  141. ///////////////////MultiThreading/////////////////////
  142. PI_THREAD (TCPserver)
  143. {
  144.     while(1)
  145.     {
  146.  
  147.         if((newsockfd = accept(sockfd, (struct sockaddr *)&cli_addr, &clilen))>=0)
  148.         {
  149.             n = read( newsockfd,buffer,sizeof(buffer));
  150.             buffer[n] = '\0';
  151.             printf("\r\nGelen Data:(%d) %s\r\n",n,buffer);
  152.            
  153.             //------Gelen Komutların Pars Edilmesi---------
  154.             if(strstr(buffer, cmd_info)!= NULL)
  155.             {
  156.                 CPUTemp = GetCPUTemp();
  157.                 DSTemp = GetDSTemp();
  158.                 sprintf(TXbuffer,"%sINFO: Temp(uC:%5.3f°C, DS:%5.3f°C), DIST(%dcm), PrgVer(%s)\r\n",HTTP_OK,(float) CPUTemp / 1000,(float) DSTemp / 1000,FrontDist,PrgVer);
  159.                 write(newsockfd,TXbuffer,strlen(TXbuffer));
  160.                 printf("Komut > INFO\r\n");
  161.             }
  162.             if(strstr(buffer, cmd_onfar)!= NULL)
  163.             {
  164.                 OnFarToggle();
  165.                 sprintf(TXbuffer,"%sOn Far Toggle\r\n",HTTP_OK);
  166.                 write(newsockfd,TXbuffer,strlen(TXbuffer));
  167.                 printf("Komut > On Far Toggle\r\n");
  168.             }
  169.             if(strstr(buffer, cmd_servo1)!= NULL)
  170.             {
  171.                 Servo1_Kontrol();
  172.             }
  173.             if(strstr(buffer, cmd_hiz)!= NULL)
  174.             {
  175.                 ptr1 = strstr(buffer, "&hiz=");
  176.                 ptr2 = strstr(buffer, " HTTP");
  177.                 ptr1 = ptr1 + 5;
  178.                 strsize = (ptr2 - ptr1);
  179.                 if(ptr1 != NULL && ptr2 != NULL && strsize < sizeof(HizStr))
  180.                 {
  181.                     memcpy(HizStr, ptr1, strsize);
  182.                     HizStr[strsize] = '\0';
  183.                     MotorHiz = atoi(HizStr);
  184.                 }
  185.             }
  186.             if(strstr(buffer, cmd_ileri)!= NULL)
  187.             {
  188.                 if(FrontDist>ForntMinDist)
  189.                 {
  190.                     Motor_ileri();
  191.                 }
  192.                 else
  193.                 {
  194.                     sprintf(TXbuffer,"%sMesafeYetersiz(%dcm)\r\n",HTTP_OK,FrontDist);
  195.                     write(newsockfd,TXbuffer,strlen(TXbuffer));
  196.                     printf("Komut > ileri (mesafe yetersiz)\r\n");
  197.                 }
  198.             }
  199.             if(strstr(buffer, cmd_geri)!= NULL)
  200.             {
  201.                 Motor_geri();
  202.             }
  203.             if(strstr(buffer, cmd_sag)!= NULL)
  204.             {
  205.                 Motor_sag();
  206.             }
  207.             if(strstr(buffer, cmd_sol)!= NULL)
  208.             {
  209.                 Motor_sol();
  210.             }  
  211.             if(strstr(buffer, cmd_dur)!= NULL)
  212.             {
  213.                 Motor_dur();
  214.             }
  215.             //------------------------------------
  216.            
  217.             close(newsockfd);
  218.         }
  219.  
  220.         delay(10);
  221.     }
  222.     close(sockfd);
  223. }
  224.  
  225.  
  226. PI_THREAD (FrontDistance)
  227. {
  228.     (void)piHiPri (10) ;    // Set this thread to be high priority
  229.    
  230.     while(1)
  231.     {
  232.         piLock (DIST_KEY) ;
  233.         FrontDist = getForntCM();
  234.         piUnlock (DIST_KEY) ;
  235.        
  236.         if((FrontDist<=ForntMinDist) && (FrontDistAlert==0))
  237.         {
  238.             FrontDistAlert=1;
  239.             Motor_dur();
  240.         }
  241.         if(FrontDist>ForntMinDist)
  242.         {
  243.             FrontDistAlert=0;
  244.         }
  245.         delay(75);
  246.     }
  247. }
  248.  
  249. PI_THREAD (LEDflash)
  250. {
  251.     while(1)
  252.     {
  253.     LedToggle();
  254.     delay(250);
  255.     }
  256. }
  257.  
  258.  
  259.  
  260. void Servo1_Kontrol(void)
  261. {
  262.     ptr1 = strstr(buffer, "servo1=");
  263.     ptr2 = strstr(buffer, " HTTP");
  264.     ptr1 = ptr1 + 7;
  265.     strsize = (ptr2 - ptr1);
  266.     if(ptr1 != NULL && ptr2 != NULL && strsize < sizeof(Servo1ValStr))
  267.     {
  268.         memcpy(Servo1ValStr, ptr1, strsize);
  269.         Servo1ValStr[strsize] = '\0';
  270.         Servo1ValYed = Servo1Val;
  271.         Servo1Val = atoi(Servo1ValStr);
  272.        
  273.         if(Servo1Val>Servo1ValYed)
  274.         {
  275.             Servo1Delay = Servo1Val - Servo1ValYed;
  276.         }
  277.         else
  278.         {
  279.             Servo1Delay = Servo1ValYed - Servo1Val;
  280.         }
  281.         Servo1Delay = Servo1Delay * 100;
  282.                    
  283.         if((Servo1Val>=5) && (Servo1Val<=22))
  284.         {
  285.             softPwmWrite (Servo1, Servo1Val);
  286.             delay(Servo1Delay);
  287.             softPwmWrite (Servo1, 0);
  288.             sprintf(TXbuffer,"%sKamera Kontrol(%d)\r\n",HTTP_OK,Servo1Val);
  289.             write(newsockfd,TXbuffer,strlen(TXbuffer));
  290.             printf("Komut > Kamera Kontrol\r\n");
  291.         }
  292.         else
  293.         {
  294.             sprintf(TXbuffer,"%sHatali deger...(%d)\r\n",HTTP_OK,Servo1Val);
  295.             write(newsockfd,TXbuffer,strlen(TXbuffer));
  296.             printf("Komut > Kamera Kontrol > Hatali deger...\r\n");
  297.         }
  298.  
  299.     }  
  300. }
  301.  
  302. void Motor_ileri(void)
  303. {
  304.     digitalWrite (Motor1_1, HIGH);
  305.     digitalWrite (Motor1_2, LOW);
  306.     digitalWrite (Motor2_1, LOW);
  307.     digitalWrite (Motor2_2, HIGH);
  308.  
  309.     softPwmWrite (Motor1_E, MotorHiz);
  310.     softPwmWrite (Motor2_E, MotorHiz);
  311.  
  312.     sprintf(TXbuffer,"%sileri\r\n",HTTP_OK);
  313.     write(newsockfd,TXbuffer,strlen(TXbuffer));
  314.     printf("Komut > ileri\r\n");
  315. }
  316. void Motor_geri(void)
  317. {
  318.     digitalWrite (Motor1_1, LOW);
  319.     digitalWrite (Motor1_2, HIGH);
  320.     digitalWrite (Motor2_1, HIGH);
  321.     digitalWrite (Motor2_2, LOW);
  322.                
  323.     softPwmWrite (Motor1_E, MotorHiz);
  324.     softPwmWrite (Motor2_E, MotorHiz);
  325.    
  326.     digitalWrite (LedArkaFar, HIGH);
  327.                
  328.     sprintf(TXbuffer,"%sgeri\r\n",HTTP_OK);
  329.     write(newsockfd,TXbuffer,strlen(TXbuffer));
  330.     printf("Komut > geri\r\n");
  331. }
  332. void Motor_sag(void)
  333. {
  334.     digitalWrite (Motor1_1, LOW);
  335.     digitalWrite (Motor1_2, LOW);
  336.     digitalWrite (Motor2_1, LOW);
  337.     digitalWrite (Motor2_2, HIGH);
  338.                
  339.     softPwmWrite (Motor1_E, 0);
  340.     softPwmWrite (Motor2_E, MotorHiz);
  341.    
  342.     digitalWrite (LedSag, HIGH);
  343.                
  344.     sprintf(TXbuffer,"%ssag\r\n",HTTP_OK);
  345.     write(newsockfd,TXbuffer,strlen(TXbuffer));
  346.     printf("Komut > sag\r\n");
  347. }
  348. void Motor_sol(void)
  349. {
  350.     digitalWrite (Motor1_1, HIGH);
  351.     digitalWrite (Motor1_2, LOW);
  352.     digitalWrite (Motor2_1, LOW);
  353.     digitalWrite (Motor2_2, LOW);
  354.                
  355.     softPwmWrite (Motor1_E, MotorHiz);
  356.     softPwmWrite (Motor2_E, 0);
  357.    
  358.     digitalWrite (LedSol, HIGH);
  359.                
  360.     sprintf(TXbuffer,"%ssol\r\n",HTTP_OK);
  361.     write(newsockfd,TXbuffer,strlen(TXbuffer));
  362.     printf("Komut > sol\r\n");
  363. }
  364. void Motor_dur(void)
  365. {
  366.     digitalWrite (Motor1_1, LOW);
  367.     digitalWrite (Motor1_2, LOW);
  368.     digitalWrite (Motor2_1, LOW);
  369.     digitalWrite (Motor2_2, LOW);
  370.                
  371.     softPwmWrite (Motor1_E, 0);
  372.     softPwmWrite (Motor2_E, 0);
  373.    
  374.     digitalWrite (LedSag, LOW);
  375.     digitalWrite (LedSol, LOW);
  376.     digitalWrite (LedArkaFar, LOW);
  377.                
  378.     sprintf(TXbuffer,"%sdur\r\n",HTTP_OK);
  379.     write(newsockfd,TXbuffer,strlen(TXbuffer));
  380.     printf("Komut > dur\r\n");
  381. }
  382.  
  383. /////////////////////////////////////////////////////
  384. void TCPserver_init(void)
  385. {
  386.     sockfd = socket(AF_INET, SOCK_STREAM, 0);
  387.     if (sockfd < 0)
  388.     {
  389.         perror("ERROR opening socket");
  390.         exit(1);
  391.     }
  392.  
  393.     bzero((char *) &serv_addr, sizeof(serv_addr));
  394.     portno = 5001;
  395.  
  396.     serv_addr.sin_family = AF_INET;
  397.     serv_addr.sin_addr.s_addr = INADDR_ANY;
  398.     serv_addr.sin_port = htons(portno);
  399.  
  400.     if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
  401.     {
  402.         perror("ERROR on binding");
  403.         exit(1);
  404.     }
  405.  
  406.  
  407.     if(listen(sockfd,5)==0)
  408.     {
  409.         printf("TCP Server OK (%s:%d) ...\r\n",inet_ntoa(cli_addr.sin_addr),portno);
  410.     }
  411.     else
  412.     {
  413.     printf("TCP Server HATA ...\r\n");
  414.     }
  415.  
  416.     clilen = sizeof(cli_addr);
  417.  
  418.  
  419. }
  420.  
  421.  
  422. void MultiThreading_init(void)
  423. {
  424.     piThreadCreate (TCPserver);
  425.     piThreadCreate (FrontDistance);
  426.     piThreadCreate (LEDflash);
  427.     printf("Multi Threading OK ...\r\n");
  428. }
  429.  
  430. void Gpio_init(void)
  431. {
  432.     //ledler
  433.     pinMode (LED1, OUTPUT);
  434.     pinMode (LedSag, OUTPUT);
  435.     pinMode (LedSol, OUTPUT);
  436.     pinMode (LedOnFar, OUTPUT);
  437.     pinMode (LedArkaFar, OUTPUT);
  438.     digitalWrite (LED1, LOW);
  439.     digitalWrite (LedSag, LOW);
  440.     digitalWrite (LedSol, LOW);
  441.     digitalWrite (LedOnFar, LOW);
  442.     digitalWrite (LedArkaFar, LOW);
  443.    
  444.     //motor pinler
  445.     softPwmCreate (Motor1_E, 0, 100);
  446.     softPwmCreate (Motor2_E, 0, 100);
  447.     softPwmCreate (Servo1, 0, 1000);
  448.     pinMode (Motor1_1, OUTPUT);
  449.     pinMode (Motor1_2, OUTPUT);
  450.     pinMode (Motor2_1, OUTPUT);
  451.     pinMode (Motor2_2, OUTPUT);
  452.    
  453.     //motor pwm baslangic degerleri
  454.     softPwmWrite (Motor1_E, 0);
  455.     softPwmWrite (Motor2_E, 0);
  456.     digitalWrite (Motor1_1, LOW);
  457.     digitalWrite (Motor1_2, LOW);
  458.     digitalWrite (Motor2_1, LOW);
  459.     digitalWrite (Motor2_2, LOW);
  460.    
  461.     //Distance
  462.     pinMode(TRIG, OUTPUT);
  463.     pinMode(ECHO, INPUT);
  464.     digitalWrite(TRIG, LOW);
  465.    
  466.     printf("Gpio OK ...\n");
  467. }
  468.  
  469. void LedToggle(void)
  470. {
  471.     //led1 flash
  472.     if(digitalRead(LED1))
  473.     {
  474.         digitalWrite (LED1, LOW);
  475.     }
  476.     else
  477.     {
  478.         digitalWrite (LED1, HIGH);
  479.     }
  480. }
  481.  
  482. void OnFarToggle(void)
  483. {
  484.     //led1 flash
  485.     if(digitalRead(LedOnFar))
  486.     {
  487.         digitalWrite (LedOnFar, LOW);
  488.     }
  489.     else
  490.     {
  491.         digitalWrite (LedOnFar, HIGH);
  492.     }
  493. }
  494.  
  495. void ServoShow(void)
  496. {
  497.     digitalWrite (LedSag, HIGH);
  498.     digitalWrite (LedSol, HIGH);
  499.     digitalWrite (LedOnFar, HIGH);
  500.     digitalWrite (LedArkaFar, HIGH);
  501.    
  502.     softPwmWrite (Servo1, 12);
  503.     delay(1500);
  504.     softPwmWrite (Servo1, 22);
  505.     delay(1500);
  506.     softPwmWrite (Servo1, 17);
  507.     delay(750);
  508.     softPwmWrite (Servo1, 0);
  509.    
  510.     digitalWrite (LedSag, LOW);
  511.     digitalWrite (LedSol, LOW);
  512.     digitalWrite (LedOnFar, LOW);
  513.     digitalWrite (LedArkaFar, LOW);
  514. }
  515.  
  516. int getForntCM()
  517. {
  518.     //Send trig pulse
  519.     digitalWrite(TRIG, HIGH);
  520.     delayMicroseconds(20);
  521.     digitalWrite(TRIG, LOW);
  522.  
  523.     //Wait for echo start
  524.     while(digitalRead(ECHO) == LOW);
  525.  
  526.     //Wait for echo end
  527.     long startTime = micros();
  528.     while(digitalRead(ECHO) == HIGH);
  529.     long travelTime = micros() - startTime;
  530.  
  531.     //Get distance in cm
  532.     int distance = travelTime / 58;
  533.  
  534.     return distance;
  535. }
  536. uint16_t  GetCPUTemp()
  537. {
  538.     FILE *fp;
  539.     char filebuffer[100];
  540.  
  541.     if((fp=fopen(CPUtempfile,"r")) == NULL)
  542.     {
  543.         printf("Dosya açma hatası!\r\n(%s) Bulunamadı ...\r\n",CPUtempfile);
  544.         exit(1);
  545.     }
  546.     fread(filebuffer, sizeof(filebuffer), 1, fp);
  547.     fclose(fp);
  548.     return atoi(filebuffer);
  549. }
  550.  
  551. uint16_t  GetDSTemp()
  552. {
  553.     FILE *fp;
  554.     char filebuffer[100];
  555.  
  556.     if((fp=fopen(DStempfile,"r")) == NULL)
  557.     {
  558.         printf("Dosya açma hatası!\r\n(%s) Bulunamadı ...\r\n",DStempfile);
  559.         exit(1);
  560.     }
  561.     fread(filebuffer, sizeof(filebuffer), 1, fp);
  562.     fclose(fp);
  563.     ptr1 = strstr(filebuffer, "t=");
  564.     ptr1 = ptr1 + 2;
  565.     return atoi(ptr1);
  566. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement