C++ klasa przekazywanie danych metody do 2 metody

czyli wszystko w mbed dla zgodnych płytek
ODPOWIEDZ
Awatar użytkownika
foreste
Administrator
Posty: 27
Rejestracja: 08 paź 2017, 5:32
Lokalizacja: Vault 13

C++ klasa przekazywanie danych metody do 2 metody

Post autor: foreste » 21 paź 2018, 17:07

Witam jak przekazać &left_sensor_push do metody _clicker.attach_deasserted(); poprzez argument jakis_argument w metodzie intro() ?
  1. #include <mbed.h>
  2. #include "ArduinoMotorShield.hpp"
  3. #include "ultrasonic.h"
  4. #include "PinDetect.h"
  5. /*
  6. DigitalOut F_Left(D12);
  7. DigitalOut F_Right(D13);
  8. DigitalOut B_Left(D8);
  9. DigitalOut B_Right(D9);
  10. DigitalOut start_Left(D11);
  11. DigitalOut start_Right(D4);
  12. */
  13. Timer count , count2, coun3 ;
  14. //ArduinoMotorShield engine;
  15. AnalogIn sensor_light(PC_3);
  16. Serial Bluetooth(PC_4, PC_5);
  17. PinDetect left_sensor(PC_6);
  18. PinDetect right_sensor(PC_8);
  19. static int left_sensor_state = 0;
  20. static int right_sensor_state = 0;
  21. #define on 1
  22. #define off 0
  23. bool lock = true;
  24.  
  25. class Gear
  26. {
  27. public:
  28.     void manoeuvre(float step_left, float step_right)
  29.     {
  30.         _driver.SetMotorPower(ArduinoMotorShield::MOTOR_A, step_left);        
  31.         _driver.SetMotorPower(ArduinoMotorShield::MOTOR_B, step_right);
  32.     }
  33.  
  34.     void cramp(int brake_left, int brake_right)
  35.     {
  36.         _driver.SetBrake(ArduinoMotorShield::MOTOR_A, brake_left);
  37.         _driver.SetBrake(ArduinoMotorShield::MOTOR_B, brake_right);
  38.     }
  39. private:
  40.     ArduinoMotorShield _driver;
  41. };
  42. class Miernik
  43. {
  44.    
  45. public:
  46.     Miernik(PinName pin)
  47.         : _analog(pin)
  48.     {
  49.     }
  50.     float xx()
  51.     {
  52.         return _analog.read();
  53.     }
  54. private:
  55.     AnalogIn  _analog;
  56.    
  57. };
  58. class connector
  59. {
  60. public:
  61.     connector(PinName pin)
  62.         : _pin(pin)
  63.     {
  64.         _pin = 0;
  65.     }
  66.     void state(int s)
  67.     {
  68.         _pin = s;
  69.     }
  70.     void toggle()
  71.     {
  72.         _pin = !_pin;
  73.        
  74.     }
  75. private:
  76.     DigitalOut _pin;
  77. };
  78.  
  79. class bumper
  80. {
  81. public:
  82.     bumper(PinName pin)
  83.         : _clicker(pin)
  84.     {
  85.        
  86.     }
  87.     void intro(jakis_argument)
  88.     {
  89.         _clicker.attach_deasserted(jakis_argument);
  90.     }
  91. private:
  92.     PinDetect  _clicker;
  93. };
  94.  
  95. connector Led_front_right(PB_15);
  96. connector Led_front_left(PB_1);
  97. connector Led_back_right(PB_2);
  98. connector Led_back_left(PB_11);
  99. connector Buzzer(PB_12);
  100. Miernik pomiar(PC_3);
  101. Gear engine;
  102. bumper zderzak(PC_5)
  103. void(*bips)();
  104. /*
  105. void collision_sensor()
  106. {
  107.     if (right_sensor_state == 1)
  108.     {
  109.         lock = false;
  110.         coun3.start();
  111.         engine.SetBrake(ArduinoMotorShield::MOTOR_A, 0);
  112.         engine.SetBrake(ArduinoMotorShield::MOTOR_B, 0);
  113.         engine.SetMotorPower(ArduinoMotorShield::MOTOR_A, -0.6);
  114.         engine.SetMotorPower(ArduinoMotorShield::MOTOR_B, -0.3);
  115.         if (coun3.read() >= 5)
  116.         {
  117.             right_sensor_state = 0;
  118.             lock = true;
  119.             coun3.stop();
  120.             coun3.reset();
  121.         }
  122.     }
  123.    
  124.     if (left_sensor_state == 1)
  125.     {
  126.         lock = false;
  127.         coun3.start();
  128.         engine.SetBrake(ArduinoMotorShield::MOTOR_A, 0);
  129.         engine.SetBrake(ArduinoMotorShield::MOTOR_B, 0);
  130.         engine.SetMotorPower(ArduinoMotorShield::MOTOR_A, -0.3);
  131.         engine.SetMotorPower(ArduinoMotorShield::MOTOR_B, -0.6);
  132.         if (coun3.read() >= 5)
  133.         {
  134.             left_sensor_state = 0;
  135.             lock = true;
  136.             coun3.stop();
  137.             coun3.reset();
  138.         }
  139.     }
  140. }
  141. */
  142. void dist(int distance)
  143.    
  144. {  
  145.     /*
  146.     if (lock == true)
  147.     {
  148.        
  149.         if ((distance <= 30) && (distance >= 0))
  150.         {
  151.             engine.SetBrake(ArduinoMotorShield::MOTOR_A, 1);
  152.             engine.SetBrake(ArduinoMotorShield::MOTOR_B, 1);
  153.             bips();
  154.             engine.SetMotorPower(ArduinoMotorShield::MOTOR_A, 0.0);
  155.             engine.SetMotorPower(ArduinoMotorShield::MOTOR_B, 0.0);
  156.             count2.start();
  157.             if (count2.read_ms() >= 3000)
  158.             {
  159.                 engine.SetBrake(ArduinoMotorShield::MOTOR_A, 0);
  160.                 engine.SetBrake(ArduinoMotorShield::MOTOR_B, 0);
  161.                 engine.SetMotorPower(ArduinoMotorShield::MOTOR_A, -0.6);
  162.                 engine.SetMotorPower(ArduinoMotorShield::MOTOR_B, -0.6);
  163.                 if (count2.read_ms() >= 5000)
  164.                 {
  165.                     engine.SetMotorPower(ArduinoMotorShield::MOTOR_A, -0.6);
  166.                     engine.SetMotorPower(ArduinoMotorShield::MOTOR_B, 0.6);
  167.                 }
  168.            
  169.                 if ((count2.read_ms() >= 7000) && (distance <= 50))
  170.                 {
  171.                     count2.stop();
  172.                     count2.reset();
  173.                 }
  174.             }
  175.         }
  176.         else    if (distance <= 50)
  177.         {
  178.        
  179.             engine.SetMotorPower(ArduinoMotorShield::MOTOR_A, 0.2);
  180.             engine.SetMotorPower(ArduinoMotorShield::MOTOR_B, 0.2);
  181.         }
  182.         else if (distance <= 60)
  183.         {
  184.             engine.SetMotorPower(ArduinoMotorShield::MOTOR_A, 0.3);
  185.             engine.SetMotorPower(ArduinoMotorShield::MOTOR_B, 0.3);
  186.         }
  187.         else if (distance <= 70)
  188.         {
  189.             engine.SetMotorPower(ArduinoMotorShield::MOTOR_A, 0.4);
  190.             engine.SetMotorPower(ArduinoMotorShield::MOTOR_B, 0.4);
  191.         }
  192.         else if (distance <= 80)
  193.         {
  194.             engine.SetMotorPower(ArduinoMotorShield::MOTOR_A, 0.5);
  195.             engine.SetMotorPower(ArduinoMotorShield::MOTOR_B, 0.5);
  196.         }
  197.         else if (distance <= 90)
  198.         {
  199.             engine.SetMotorPower(ArduinoMotorShield::MOTOR_A, 0.6);
  200.             engine.SetMotorPower(ArduinoMotorShield::MOTOR_B, 0.6);
  201.         }
  202.         else if (distance <= 100)
  203.         {
  204.             engine.SetMotorPower(ArduinoMotorShield::MOTOR_A, 0.7);
  205.             engine.SetMotorPower(ArduinoMotorShield::MOTOR_B, 0.7);
  206.         }
  207.    
  208.         else
  209.         {
  210.             engine.SetMotorPower(ArduinoMotorShield::MOTOR_A, 0.8);
  211.             engine.SetMotorPower(ArduinoMotorShield::MOTOR_B, 0.8);
  212.             engine.SetBrake(ArduinoMotorShield::MOTOR_A, 0);
  213.             engine.SetBrake(ArduinoMotorShield::MOTOR_B, 0);
  214.         }
  215.         */
  216.         Bluetooth.printf("Distance %d mm\r\n", distance);
  217.  
  218. }
  219.  
  220. void right_sensor_push()
  221. {
  222.     right_sensor_state = 1;
  223. }
  224.  
  225. void left_sensor_push()
  226. {
  227.     left_sensor_state = 1;
  228. }
  229.  
  230. ultrasonic sensor(PB_13, PB_14, .1, 1, &dist);
  231. void bip()
  232. {
  233.     count.start();
  234.     if (count.read_ms() >= 500)
  235.     {
  236.         Led_back_left.toggle();
  237.         Buzzer.toggle();
  238.         count.stop();
  239.         count.reset();
  240.     }
  241. }
  242.  
  243.  
  244.  
  245. int main()
  246. {
  247. zderzak.intro(&left_sensor_push);
  248.     /*
  249.     //engine.SetMotorPolarity(ArduinoMotorShield::MOTOR_A, ArduinoMotorShield::MOTOR_FORWARD);
  250.     //engine.SetMotorPolarity(ArduinoMotorShield::MOTOR_B, ArduinoMotorShield::MOTOR_FORWARD);
  251.     bips = &bip;
  252.     left_sensor.mode(PullUp);
  253.     left_sensor.attach_deasserted( &left_sensor_push);
  254.     left_sensor.setSampleFrequency();
  255.    
  256.    
  257.     right_sensor.mode(PullUp);
  258.     right_sensor.attach_deasserted(&right_sensor_push);
  259.     right_sensor.setSampleFrequency();
  260.     sensor.startUpdates();
  261.     */
  262.     for (;;)
  263.     {
  264.        
  265.         sensor.checkDistance();
  266.         engine.cramp(off, off);
  267.         //bip();
  268.         //collision_sensor();
  269.         Led_front_right.state(0);
  270.         Led_front_left.state(0);
  271.         Led_back_right.state(0);
  272.         //Led_back_left.state(1);
  273.         engine.manoeuvre(-0.3, 0.3);
  274.         wait(1);
  275.         engine.cramp(on,on);
  276.         Bluetooth.printf("This program runs since %1.2fv seconds.\n", pomiar.xx());
  277.        
  278.     }
  279. }
Obrazek

Awatar użytkownika
foreste
Administrator
Posty: 27
Rejestracja: 08 paź 2017, 5:32
Lokalizacja: Vault 13

Re: C++ klasa przekazywanie danych metody do 2 metody

Post autor: foreste » 23 paź 2018, 20:04

  1.  void attach_deasserted(void (*function)(void)) {
  2.         _callbackDeasserted.attach( function );
  3.     }
  4.    
  5.     /** Attach a callback object/method
  6.      *
  7.      * @code
  8.      *
  9.      * class Bar {
  10.      *   public:
  11.      *     void myCallback( void ) { led1 = 0; }
  12.      * };
  13.      *
  14.      * DigitalOut led1( LED1 );
  15.      * PinDetect pin( p30 );
  16.      * Bar bar;
  17.      *
  18.      * main() {
  19.      *     pin.attach_deasserted( &bar, &Bar::myCallback );
  20.      * }
  21.      *
  22.      * @endcode
  23.      *
  24.      * Call this function when a pin is deasserted.
  25.      * @param object An object that conatins the callback method.
  26.      * @param method The method within the object to call.
  27.      */
  28.     template<typename T>
  29.     void attach_deasserted(T *object, void (T::*member)(void)) {
  30.         _callbackDeasserted.attach( object, member );        
  31.     }
Dodaje kawałek kodu biblioteki związany z attach_deasserted() może w ten sposób nakieruje o co mi biega:).
Obrazek

ODPOWIEDZ