“pBase没有定义”? pBase在包含的类中定义

时间:2017-03-01 22:57:34

标签: c++ wiimote

该程序应该从Wii遥控器读取加速度值,并根据这些值点亮LED。我得到的唯一阻止编译的错误是在main.cpp中没有定义pBase。 main.cpp包含ZedBoard.h和ZedBoard.cpp,其中定义了pBase,所以我没有在这里看到问题。我一直试图解决这个问题,我无法弄明白。

ZedBoard.h

#ifndef ZEDBOARD_H
#define ZEDBOARD_H

const int gpio_led1_offset = 0x12C;  // Offset for LED1
const int gpio_led2_offset = 0x130;  // Offset for LED2
const int gpio_led3_offset = 0x134;  // Offset for LED3
const int gpio_led4_offset = 0x138;  // Offset for LED4
const int gpio_led5_offset = 0x13C;  // Offset for LED5
const int gpio_led6_offset = 0x140;  // Offset for LED6
const int gpio_led7_offset = 0x144;  // Offset for LED7
const int gpio_led8_offset = 0x148;  // Offset for LED8

const int gpio_sw1_offset = 0x14C;  // Offset for Switch 1
const int gpio_sw2_offset = 0x150;  // Offset for Switch 2
const int gpio_sw3_offset = 0x154;  // Offset for Switch 3
const int gpio_sw4_offset = 0x158;  // Offset for Switch 4
const int gpio_sw5_offset = 0x15C;  // Offset for Switch 5
const int gpio_sw6_offset = 0x160;  // Offset for Switch 6
const int gpio_sw7_offset = 0x164;  // Offset for Switch 7
const int gpio_sw8_offset = 0x168;  // Offset for Switch 8

const int gpio_pbtnl_offset = 0x16C;  // Offset for left push button
const int gpio_pbtnr_offset = 0x170;  // Offset for right push button
const int gpio_pbtnu_offset = 0x174;  // Offset for up push button
const int gpio_pbtnd_offset = 0x178;  // Offset for down push button
const int gpio_pbtnc_offset = 0x17C;  // Offset for center push button


// Physical base address of GPIO
const unsigned gpio_address = 0x400d0000;

// Length of memory-mapped IO window
const unsigned gpio_size = 0xff;

// Class Definition
class ZedBoard {
private:
    char *pBase;    // virtual address where I/O was mapped
    int fd;         // file descriptor for dev memory
    int dummyValue; // for testing without a Zedboard
public:
    ZedBoard();             // Default Constructor
    ~ZedBoard();    // Destructor
    void RegisterWrite(char *pBase, int offset, int value);
    int RegisterRead(int offset);
    void Write1Led(char *pBase, int ledNum, int state);
    void WriteAllLeds(int value);
    int Read1Switch(int switchNum);
    int ReadAllSwitches();
};

#endif

ZedBoard.cpp

#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <iostream>
#include "ZedBoard.h"

using namespace std;

/**
 * Constructor Initialize general-purpose I/O
 *  - Opens access to physical memory /dev/mem
 *  - Maps memory at offset 'gpio_address' into virtual address space
 *
 * @param  None Default constructor does not need arguments.
 * @return      None Default constructor does not return anything.
 */
 ZedBoard::ZedBoard(){
    cout << "\nStarting...." << endl;
     // dummyValue = 99;
     // Uncomment this block of code when connected to the Zedboard
    fd = open( "/dev/mem", O_RDWR);
    pBase = (char *) mmap(NULL,gpio_size,PROT_READ | PROT_WRITE,
            MAP_SHARED,fd,gpio_address);
    // Check error
    if (pBase == MAP_FAILED)
    {
            cerr << "Mapping I/O memory failed - Did you run with 'sudo'?      \n";
            exit(1); // Returns 1 to the operating system;
    }

}
/**
 * Destructor to close general-purpose I/O.
 * - Uses virtual address where I/O was mapped.
 * - Uses file descriptor previously returned by 'open'.
 *
 * @param  None Destructor does not need arguments.
 * @return      None Destructor does not return anything.
 */
ZedBoard::~ZedBoard(){
         munmap(pBase, gpio_size);
}

/*
*   Write a 4-byte value at the specified general-purpose I/O location.
*
*      - Uses base address returned by 'mmap'.
*      @parem offset    Offset where device is mapped.
*      @param value             Value to be written.
*/
void ZedBoard::RegisterWrite(char *pBase, int offset, int value)
{
        * (int *) (pBase + offset) = value;
//      dummyValue = value;
}

/**
* Read a 4-byte value from the specified general-purpose I/O location.

 - Uses base address returned by 'mmap'.
 @param offset  Offset where device is mapped.
 @return                Value read.
*/
int ZedBoard::RegisterRead(int offset)
{
        return * (int *) (pBase + offset);
//      return dummyValue;
}

/*
Changes the state of an LED (ON or OFF)

- Uses base address of I/O
@param ledNum   LED number (0 to 7)
@param state    State to change to (ON or OFF)
*/

/*
Show lower 8 bits of integer value on LEDs
- Calls Write1Led() to set all LEDs
@param value    Value to show on LEDs
*/
void ZedBoard::WriteAllLeds(int value)
{
        cout << "\nWriting to all LEDs...." << endl;
                for(int i = 0; i < 8; i++) {// write to all LEDs
                        Write1Led(pBase, i, (value / (1<<i)) % 2);
                }
}

void ZedBoard::Write1Led(char *pBase, int ledNum, int state)
{
        cout << "\nWriting to LED " << ledNum << ": LED state = " << state << endl;
        if (ledNum == 1)
        {
                RegisterWrite(pBase, gpio_led1_offset, state);
        }
        else
        {
                RegisterWrite(pBase, gpio_led1_offset + (ledNum * 4), state);
        }
}

/*
Reads the value of a switch

- Uses base address of I/O
@param switchNum        Switch number (0 to 7)
@return         Switch value read
*/
int ZedBoard::Read1Switch(int switchNum)
{
        cout << "\nReading Switch " << switchNum << endl;
        //return RegisterRead(gpio_sw1_offset + (switchNum * 4));
        return switchNum;
}

/*
        Reads the switch values into a decimal integer

        - Calls Read1Switch() to read all switches
        @return         Switches' value read
*/
int ZedBoard::ReadAllSwitches()
{
        int switchValue = 0;
        cout << "\nReading all switches...." << endl;
        for(int i = 7; i >= 0; i--) {// read all switches
                switchValue = (switchValue << 1) + Read1Switch(i);
        }
        return switchValue;
}

WiimoteAccel.h

    #ifndef WIIMOTEACCEL_H
    #define WIIMOTEACCEL_H

    class WiimoteAccel{
    public:
            WiimoteAccel();
            ~WiimoteAccel();
            void Wiimote();
            void Listen();
            virtual void AccelerationEvent(int code, int acceleration);
    private:
            int fd;
    };

    #endif

WiimoteAccel.cpp

#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <iostream>
#include "ZedBoard.h"
#include "WiimoteAccel.h"

WiimoteAccel::WiimoteAccel()
{
}
WiimoteAccel::~WiimoteAccel()
{
}

void WiimoteAccel::Wiimote()
{
        fd = open("/dev/input/event0", O_RDONLY);
        if (fd == -1)
        {
                std::cerr << "Error: Could not open event file - forgot sudo?\n";
                exit(1);
        }
}

void WiimoteAccel::Listen()
{
        for (;;)
        {
                // Read a packet of 16 bytes from Wiimote
                char buffer[16];
                read(fd, buffer, 16);
                // Extract code (byte 10) and value (byte 12) from packet
                int code = buffer[10];
                short acceleration = * (short *) (buffer + 12);
                this->AccelerationEvent(code, acceleration);
        }
}

void WiimoteAccel::AccelerationEvent(int code, int acceleration)
{
        // Print them
        std::cout << "Code = " << code << ", acceleration = " << acceleration << '\n';
}

的main.cpp

#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <iostream>
#include "WiimoteAccel.h"
#include "ZedBoard.h"
#include "ZedBoard.cpp"

using namespace std;

class WiimoteToLed : public WiimoteAccel {
private:
        ZedBoard* zed_board;
public:
        WiimoteToLed(ZedBoard* zed_board);
        ~WiimoteToLed();
        void AccelerationEvent(int code, int acceleration)
        {
        int x = 0;
        for(;;)
        {
                if (code == 3)
                {
                        cout << "ACCELERATION IS "<< acceleration <<"!\n";

                        if(acceleration == 0)
                        {
                                x = 0;
                        }
                        else if(acceleration > -100 && acceleration <= -75)
                        {
                                x = 1;
                        }
                        else if(acceleration > -75 && acceleration <= -50)
                        {
                                x = 2;
                        }
                        else if(acceleration > -50 && acceleration <= -25)
                        {
                                x = 3;
                        }
                        else if(acceleration > -25 && acceleration > 0)
                        {
                                x = 4;
                        }
                        else if(acceleration < 0 && acceleration >= 25)
                        {
                                x = 5;
                        }
                        else if(acceleration < 25 && acceleration >= 50)
                        {
                                x = 6;
                        }
                        else if(acceleration < 50 && acceleration >= 75)
                        {
                                x = 7;
                        }
                        else if(acceleration < 75 && acceleration >= 100)
                        {
                            x = 8;
                        }


                    switch(x)
                    {

                    case 0:
                            cout << "Wiimote isn't moving\n";
                            zed_board->Write1Led(pBase,1,0);
                            zed_board->Write1Led(pBase,2,0);
                            zed_board->Write1Led(pBase,3,0);
                            zed_board->Write1Led(pBase,4,0);
                            zed_board->Write1Led(pBase,5,0);
                            zed_board->Write1Led(pBase,6,0);
                            zed_board->Write1Led(pBase,7,0);
                            zed_board->Write1Led(pBase,8,0);


                    case 1:

                            zed_board->Write1Led(pBase,1,1);
                            zed_board->Write1Led(pBase,2,0);
                            zed_board->Write1Led(pBase,3,0);
                            zed_board->Write1Led(pBase,4,0);
                            zed_board->Write1Led(pBase,5,0);
                            zed_board->Write1Led(pBase,6,0);
                            zed_board->Write1Led(pBase,7,0);
                            zed_board->Write1Led(pBase,8,0);


                    case 2:
                            zed_board->Write1Led(pBase,1,1);
                            zed_board->Write1Led(pBase,2,1);
                            zed_board->Write1Led(pBase,3,0);
                            zed_board->Write1Led(pBase,4,0);
                            zed_board->Write1Led(pBase,5,0);
                            zed_board->Write1Led(pBase,6,0);
                            zed_board->Write1Led(pBase,7,0);
                            zed_board->Write1Led(pBase,8,0);

                    case 3:
                            zed_board->Write1Led(pBase,1,1);
                            zed_board->Write1Led(pBase,2,1);
                            zed_board->Write1Led(pBase,3,1);
                            zed_board->Write1Led(pBase,4,0);
                            zed_board->Write1Led(pBase,5,0);
                            zed_board->Write1Led(pBase,6,0);
                            zed_board->Write1Led(pBase,7,0);
                            zed_board->Write1Led(pBase,8,0);
                    case 4:
                            zed_board->Write1Led(pBase,1,1);
                            zed_board->Write1Led(pBase,2,1);
                            zed_board->Write1Led(pBase,3,1);
                            zed_board->Write1Led(pBase,4,1);
                            zed_board->Write1Led(pBase,5,0);
                            zed_board->Write1Led(pBase,6,0);
                            zed_board->Write1Led(pBase,7,0);
                            zed_board->Write1Led(pBase,8,0);

                    case 5:

                            zed_board->Write1Led(pBase,1,1);
                            zed_board->Write1Led(pBase,2,1);
                            zed_board->Write1Led(pBase,3,1);
                            zed_board->Write1Led(pBase,4,1);
                            zed_board->Write1Led(pBase,5,1);
                            zed_board->Write1Led(pBase,6,0);
                            zed_board->Write1Led(pBase,7,0);
                            zed_board->Write1Led(pBase,8,0);

                    case 6:
                            zed_board->Write1Led(pBase,1,1);
                            zed_board->Write1Led(pBase,2,1);
                            zed_board->Write1Led(pBase,3,1);
                            zed_board->Write1Led(pBase,4,1);
                            zed_board->Write1Led(pBase,5,1);
                            zed_board->Write1Led(pBase,6,1);
                            zed_board->Write1Led(pBase,7,0);
                            zed_board->Write1Led(pBase,8,0);

                    case 7:
                            zed_board->Write1Led(pBase,1,1);
                            zed_board->Write1Led(pBase,2,1);
                            zed_board->Write1Led(pBase,3,1);
                            zed_board->Write1Led(pBase,4,1);
                            zed_board->Write1Led(pBase,5,1);
                            zed_board->Write1Led(pBase,6,1);
                            zed_board->Write1Led(pBase,7,1);
                            zed_board->Write1Led(pBase,8,0);

                    case 8:
                            zed_board->Write1Led(pBase,1,1);
                            zed_board->Write1Led(pBase,2,1);
                            zed_board->Write1Led(pBase,3,1);
                            zed_board->Write1Led(pBase,4,1);
                            zed_board->Write1Led(pBase,5,1);
                            zed_board->Write1Led(pBase,6,1);
                            zed_board->Write1Led(pBase,7,1);
                            zed_board->Write1Led(pBase,8,1);
default:

                                cout << "Code = " << code <<'\n';
                        }
                }

                else
                {
                        continue;
                }

        }
        }
};

WiimoteToLed::WiimoteToLed(ZedBoard* zed_board)
{
        Wiimote();
}

WiimoteToLed::~WiimoteToLed()
{

}

int main()
{
        // Instantiate ZedBoard object statically
        ZedBoard zed_board;
        // Instantiate WiimoteToLed object statically, passing a pointer to the
        // recently created ZedBoard object.
        WiimoteToLed wiimote_to_led(&zed_board);
        // Enter infinite loop listening to events. The overridden function
        // WiimoteToLed::AccelerationEvent() will be invoked when the user moves
        // the Wiimote.
        wiimote_to_led.Listen();
        // Unreachable code, previous function has an infinite loop
        return 0;
}

生成文件

WiimoteAccel: main.o WiimoteAccel.o
        g++ main.o WiimoteAccel.o -o WiimoteAccel

main.o: main.cpp WiimoteAccel.h
        g++ -g -Wall -c main.cpp

WiimoteAccel.o: WiimoteAccel.cpp WiimoteAccel.h
        g++ -g -Wall -c WiimoteAccel.cpp

clean:
        rm main.o WiimoteAccel.o WiimoteAccel

1 个答案:

答案 0 :(得分:2)

$.extend({},"June") 拨打电话

{
    "0": "J",
    "1": "u",
    "2": "n",
    "3": "e"
}

但未在此范围内声明function SyncDropdowns (selectedInput) { for(var i = 0; i < $scope.inputData.length ; i++) { var currInput=$scope.inputData[i]; if (currInput!=selectedInput){ currInput.selectedMonth=selectedInput.selectedMonth; } } } 。您拥有WiimoteToLed::AccelerationEvent的{​​{1}}成员,但这是另一个成员。