私は現在、ビーグルボーンの小さなプロジェクトに取り組んでいます。基本的な目標は、ビーグルボーンのストックjavaScriptフレームワークとは対照的に、c ++のフルパワーを提供するフレームワークを作成することですが、arduinoフレームワークと同じように開発者にとっても使いやすいものです。
私が構築したものの1つは、ボタンやロータリーエンコーダーなどのさまざまなタイプの単純なGPIO割り込み用の事前に作成されたクラスです。したがって、開発者はボタンを定義し、接続されているビーグルボーンのどのGPIOピンも指定する必要があります。
今のところ、割り込みオブジェクトのpollInterupt()関数をメインループに手動で追加して、プログラムが突然発生したGPIOピンの状態を繰り返しチェックできるようにする必要があります。
問題は次のとおりです。ボタンのクラスコンストラクター関数にコードを追加します。このコードを定義すると、バックグラウンドで割り込みハンドラーに自動的に渡され、新しいオブジェクトのpollInterupt()関数が繰り返し実行されるため、開発者はこれを行う必要がありません。ボタンを定義するよりも複雑なもの。
でもレンガの壁にぶつかっているようです。エンドユーザーにとってフレームワークをシンプルにしようとすることは、舞台裏のコードがばかげて複雑になっていることを意味します。定義された割り込みオブジェクトを自動的に処理することを考えることができる最良の方法は、リンクリストです。これは、現在のプロトタイプコードの外観です。
#include <iostream>
class interuptButton;
class interuptHandler;
class interuptHandler{
public:
class node{
public:
node *next;
node *prev;
public:
void *interupt;
};
node *first;
node *last;
node *current;
node *temp;
public:
interuptHandler(){
first = new node;
last = new node;
first -> prev = NULL;
first -> next = last;
last -> prev = first;
last -> next = NULL;
}
void add(void *_interupt){
temp = new node;
current = last -> prev;
current -> next = temp;
temp -> prev = current;
temp -> next = last;
last -> prev = temp;
temp -> interupt = _interupt;
}
void run(){
current = first -> next;
while(current -> next != NULL){
std::cout << current -> interupt << std::endl;
// std::cout << current -> interupt -> pin << std::endl;
// current->interupt->pollInterupt();
// std::cout << reinterpret_cast < interuptButton* > (current->interupt)->pin << std::endl;
current = current -> next;
}
}
}handler;
class interuptButton{
public:
int pin;
bool value;
public:
interuptButton(int _pin){
pin = _pin;
handler.add(this);
}
void pollInterupt(){
std::cout << "check pin " << pin << " to see if the GPIO has changed" << std::endl;
}
};
int main(int argc, char **argv){
interuptButton buttonA(41);
interuptButton buttonB(45);
interuptButton buttonC(43);
handler.run();
return 0;
}
システムは機能しているようで、interuptButtonコンストラクターは新しく作成されたオブジェクトをinteruptHandlerのリンクリストに正常に渡します。このリンクリストは、run()関数のメモリアドレスを出力とともに出力できます。
bin/./test
0x7fff5fbff9e0
0x7fff5fbff9d0
0x7fff5fbff9c0
問題は、run()の他の行のコメントを外すと、ポインタオブジェクトの変数または関数にアクセスしようとすると、g++がエラーをスローし始めることです。
最初の2行は次のようになります。
src/main.cpp: In member function ‘void interuptHandler::run()’:
src/main.cpp:47: error: ‘void*’ is not a pointer-to-object type
make: *** [all] Error 1
3行目は次のようになります。
src/main.cpp:49: error: invalid use of incomplete type ‘struct interuptButton’
src/main.cpp:4: error: forward declaration of ‘struct interuptButton’
make: *** [all] Error 1
それらのオブジェクトの変数と関数にそれらのポインターを介してアクセスする方法についてのアドバイスをいただければ幸いです。
さらに良いことに、舞台裏のイベントハンドラーにオブジェクトを自動的に送信するためのより良い方法があれば、私はすべての耳です。