2017-03-01 14 views
-1

該程序應該根據這些值從Wii遙控器讀取加速度值並點亮LED。唯一的錯誤,我得到,防止編譯是pBase沒有在main.cpp中定義。 main.cpp包含ZedBoard.h和ZedBoard.cpp,其中定義了pBase,所以我沒有看到這個問題。我一直試圖解決這一段時間,我無法弄清楚。「pBase not defined」? 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; 
} 

的makefile

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

滾動條溢出..請嘗試刪除不相關的東西。 (請參見[mcve]) – user463035818

+1

在'WiimoteToLed :: AccelerationEvent'裏面使用'pBase',它沒有被定義 –

+0

'RegisterWrite'中的'pBase'參數究竟是什麼?你有意使用匹配的參數名稱來隱藏類成員嗎?爲什麼'RegisterRead'(使用類成員)和'RegisterWrite'(使用參數)之間的這種不一致? – AnT

回答

2

WiimoteToLed::AccelerationEvent你叫

zed_board->Write1Led(pBase,1,1); 

pBase並不在此範圍內聲明。您有 的成員,但這是一個不同的。

+0

有沒有一種方法可以從zed_board調用該pBase?我試過使用zed_board.pBase和zed_board-> pBase,但都沒有工作。 –

+0

@BenG。當它是一個成員變量時,爲什麼要將它作爲參數傳遞? – user463035818