2014-03-12 4 views
0

현재 저는 맞춤형 공압 로봇 암으로 작업 중이며 다른 작업을위한 대기열을 설계하려고했습니다. 대기열을 설계하는 과정에서 함수에 전달할 함수 포인터와 int를 저장하는 논리를 생각해 냈습니다. 대기열은 함수가 반환 될 때까지 함수를 대기열에서 계속 실행하려고 시도합니다. 기능 포인터의 기능을 가리키는 포인터

는 큐가 작동하는 기본 기능을 수행하는 동안,하지만, 다음과 같은 방법으로 그것을 구현하려고 할 때 그것은 실패

functionQueue.push(_lowerArm->waitForHoldingPosition, 100); // Lower Arm 100% 

오류 메시지 :

Arm.h:180: error: no matching function for call to 'Queue<bool (*)(int), 50>::push(<unresolved overloaded function type>, int)' 
/Queue.h:201: note: candidates are: bool Queue<T, queueMaxSize>::push(T, int) [with T = bool (*)(int), int queueMaxSize = 50] 

을 문제를 해결하기 위해 나는 _lowerArm->waitForHoldingPosition에 대한 참조를 시도했지만 성공하지 못했습니다. 누군가 내가 올바른 방향으로 나를 가리킬 수 있다면 크게 감사하겠습니다. 코드의

나머지 :

AirCylinder lowerArm(4, 13, 7, 1, false); //Green, White 
AirCylinder upperArm(10, 11, 6, 2, true); //Yellow, Orange 
AirCylinder wrist(8, 9, 5, 3, true); //Red, Blue 
Arm arm(&lowerArm, &upperArm, &wrist, SERVO_PIN); 

loop() { /* Do Core Stuff Here */ 

Arm.h

#include <Arduino.h> 
#include "Queue.h" 

#ifndef ARM_H 
#define ARM_H 

#define QUEUE_SIZE 50 

class Arm { 
    private: 
    AirCylinder* _lowerArm; 
    AirCylinder* _upperArm; 
    AirCylinder* _wrist; 
    byte _servoPin; 
    byte _servoPosition; 
    byte _currentRoutine; 
    boolean _doingRoutine; 
    Queue<bool(*)(int),QUEUE_SIZE> functionQueue; 

    void _setFingers(byte); 
    void _doRoutine(); 
    void _pickUpCone(); 
    void _scoreConeLow(); 
    void _scoreConeHigh(); 
    void _scoreConeeSideways(); 
    void _storeCone(); 
    void _rest(); 
    void _stabilize(); 


    public: 
    Arm(AirCylinder *lowerArm, AirCylinder *upperArm, AirCylinder *wrist, byte servoPin); 
    void stabilize(); 
    void openFingers()    { _setFingers(Arm::SERVO_OPEN); } 
    void closeFingers()   { _setFingers(Arm::SERVO_CLOSE); } 
    void setFingers(byte servoPos) { _setFingers(servoPos); } 
    void doRoutine(); 
    void doRoutine(byte); 
    void calibrateRoutine(byte); 

    static const byte SERVO_OPEN = 0; 
    static const byte SERVO_CLOSE = 180; 

    static const byte PICKUP_CONE = 0; 
    static const byte SCORE_CONE_LOW = 1; 
    static const byte SCORE_CONE_HIGH = 2; 
    static const byte SCORE_CONE_SIDEWAYS = 3; 
    static const byte STORE_CONE = 4; 
    static const byte RESTING = 5; 

}; 

Arm::Arm(AirCylinder *lowerArm, AirCylinder *upperArm, AirCylinder *wrist, byte servoPin) { 
    // Set a reference to all the arm cylinders 
    _lowerArm = lowerArm; 
    _upperArm = upperArm; 
    _wrist = wrist; 

    // Set the pin the servos are on 
    _servoPin = servoPin; 

    _doingRoutine = false; 
} 

void Arm::_scoreConeLow() { 
    // Grab cone from bot 
    // Lower Arm - 100% 
    // Upper Arm - 50% 
    // Wrist - 20% 
    // Lower Arm - 80% 

    // Put cone down 
    // Lower Arm - 100% 
    // Upper Arm - 75% 
    // Wrist - 0% 
    // Lower Arm - 70% 
    // Upper Arm - 60% 
    // Lower Arm - 40% 

    functionQueue.push(_upperArm->waitForHoldingPosition, 30); // Upper Arm 50% 
    functionQueue.push(_wrist->waitForHoldingPosition, 20); // Wrist 20% 
    functionQueue.push(_lowerArm->waitForHoldingPosition, 80); // Lower Arm 80% 

    functionQueue.push(_lowerArm->waitForHoldingPosition, 100); // Lower Arm 100% 
    functionQueue.push(_upperArm->waitForHoldingPosition, 75); // Upper Arm 75% 
    functionQueue.push(_wrist->waitForHoldingPosition, 0); // Wrist 0% 
    functionQueue.push(_lowerArm->waitForHoldingPosition, 70); // Lower Arm 70% 
    functionQueue.push(_upperArm->waitForHoldingPosition, 60); // Upper Arm 60% 
    functionQueue.push(_lowerArm->waitForHoldingPosition, 40); // Lower Arm 40% 
} 

AirCylinder.h

class AirCylinder { 
    private: 
    // Bunch of methods not used in this example 

    public: 
    /* Constructors */ 
    AirCylinder(); 
    AirCylinder(byte retractPin, byte extendPin, byte extendPressureHolderPin, byte potPin); 
    AirCylinder(byte retractPin, byte extendPin, byte extendPressureHolderPin, byte potPin, boolean isInverse); 

    /* Setters */ 

    /* Getters */ 

    /* Functions */ 
    bool waitForHoldingPosition(int position); 
}; 

/** 
    * waitForHoldingPosition 
    * 
    * Attempts to stablize the Air Cylider at the current Holding Position 
    * function returns true when the position is met 
    * 
    */ 
bool AirCylinder::waitForHoldingPosition(int position) { 
    setHoldingPosition(position); 
    if(abs(getCurrentPosition() - position) > THRESHOLD_PERCENT) { 
    // Cylinder is not within the threshold 
    return false; 
    } 
    return true; // Cylinder is within the threshold 
} 

답변

1

귀하의 waitForHoldingPosition 유형 bool (AirCylinder::*)(int)이다.

Queue 템플릿에는 bool (*)(int)이 필요합니다. 그들은 동일하지 않습니다.

귀하의 Queue해야한다 :

Queue<bool(AirCylinder::*)(int), QUEUE_SIZE> functionQueue; 
+0

는 일반적인 함수 포인터가 될 수 큐에 삽입 캐스팅 입력하는 방법이 있나요? 대기열에서 팔 클래스의 전용 함수도 처리하기를 원합니다. – Steven10172

+0

@ Steven10172 waitForHoldingPosition을 'static'으로 설정하면 도움이 될까요? –

+0

아닙니다. 각 공기 실린더마다 특정 작업을 수행해야합니다. bool Arm :: moveServo() 및 bool Arm :: hasCone()을 큐에 추가 할 수 있어야하므로 일반 함수 포인터에 캐스트를 입력 할 수 있어야합니다. – Steven10172

관련 문제