ラズパイでのgccコマンド
受付中
回答 1
投稿
- 評価
- クリップ 0
- VIEW 2,145
/*
* scanir.c
*/
#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <sys/time.h>
#include <lcd.h>
int readable = 1; // 非同期でイベントが発生した場合、コールバックにより0に設定される
int read_pin = 7; // 入力ピン番号(wiringpiの番号)
int interval = 10; // 継続時間判定の間隔(us)
int max_wait = 5000;// 最大継続時間(us)
int hp = 101; //HP
int fd;
char *GameOver = "aplay GameOver.wav";
void signalCallBackHandler(int sig)
{
readable = 0;
}
double getMoment()
{
struct timeval tv;
gettimeofday(&tv, NULL);
return ((double)(tv.tv_sec) * 1000000 + (double)(tv.tv_usec));
}
int main(int argc, char *argv[])
{
int result;
fd = lcdInit(2,16,4,4,5,0,1,2,3,0,0,0,0);
// スキャンデータを書きだすファイルのポインタを取得
FILE *fp;
char *fileName = "ir.data";
if(argc >= 2){ fileName = argv[1]; }
if((fp = fopen(fileName, "w")) == NULL){
printf("can't open file : %s\n", fileName);
exit(1);
}
printf("write file: %s\n", fileName);
// signal関数は、シグナル(非同期イベント)が発生したときに、
// そのシグナルを受信して、シグナル特有の処理を行うシグナル処理関数(シグナルハンドラ)を登録します。
if(signal(SIGINT, signalCallBackHandler) == SIG_ERR){
printf("can't set signal\n");
exit(1);
}
// wiringpiのセットアップ
if(wiringPiSetup() == -1){
printf("error wiringPi setup\n");
exit(1);
}
max_hp();
// 読み取りピン番号
if(argc >= 3){
read_pin = atoi(argv[2]);
}
pinMode(read_pin, INPUT);
printf("scaning pin: %d (wiringpi)\n", read_pin);
// 最大継続時間
if(argc >= 4){
max_wait = atoi(argv[3]) * 1000;
}
printf("max keep time: %d(ms)\n", max_wait/1000);
// 準備完了argcarg
printf("Infrared LED scanning start.\n");
printf("Pressed Ctrl+C, this program will exit.\n");
while(1){
// スキャン開始
result = scan(fp);
fclose(fp);
if(result || !readable){
printf("\n\n!!! could not scanning. quit.\n\n");
} else {
printf("\nScanning has been done.\n\n");
}
if(hp == 0){break;}
}
return 0;
}
int scan(FILE *fp)
{
system(GameOver);
// 受光モジュールは受光するとLOWになる
if(!digitalRead(read_pin)){ return 1; }
int on, off;
int p = 0;
while(hp >= 1){
// 送信が開始されるまで待機
while( readable && digitalRead(read_pin) ){}
// 解析開始
while( readable ){
on = getTime(0);
off = getTime(1);
fprintf(fp, "%6d %6d\n", on, off);
printf("%d\n",on);
//printf("%s\n", off);
lcddisplay();
break;
}
}
//最大継時間同じ状態が続いたら送信は終了していると判断
//if(off > max_wait){ break; }
return 0;
}
int getTime(int status)
{
int count = 0;
int max = max_wait / interval;
double start, end;
start = getMoment();
while( digitalRead(read_pin) == status )
{
delayMicroseconds(interval);
count++;
//最大継続時間同じ状態が続いたら送信は終了していると判断
if(count > max){ break; }
}
end = getMoment();
return getInterval(start, end);
}
int getInterval(double t1, double t2)
{
return (int)(t2-t1);
}
int lcddisplay(int fd) {
int p;
lcdClear(fd);
lcdPuts(fd,"HP /100");
if(hp >= 100){
p = 3;
}if(hp >= 11){
p = 4;
}else{p = 5;}
lcdPosition(fd,p,0);
char sNum[100];
hp -= 10;
sprintf(sNum,"%d",hp);
lcdPuts(fd,sNum);
lcdPosition(fd,0,1);
lcdPuts(fd,"BULLET [ ]");
}
int max_hp(int fd) {
int p;
lcdClear(fd);
lcdPuts(fd,"HP 100/100");
lcdPosition(fd,0,1);
lcdPuts(fd,"BULLET [ ]");
}
こちらを
sudo gcc scanir.c -o scanir -l wiringPi
というコマンドでコンパイルしようとしたのですが
/tmp/ccSiaCr5.o: 関数 main' 内:
scanir.c:(.text+0xec):
lcdInit' に対する定義されていない参照です
/tmp/ccSiaCr5.o: 関数 lcddisplay' 内:
scanir.c:(.text+0x53c):
lcdClear' に対する定義されていない参照です
scanir.c:(.text+0x548): lcdPuts' に対する定義されていない参照です
scanir.c:(.text+0x594):
lcdPosition' に対する定義されていない参照です
scanir.c:(.text+0x5d4): lcdPuts' に対する定義されていない参照です
scanir.c:(.text+0x5e4):
lcdPosition' に対する定義されていない参照です
scanir.c:(.text+0x5f0): lcdPuts' に対する定義されていない参照です
/tmp/ccSiaCr5.o: 関数
max_hp' 内:
scanir.c:(.text+0x624): lcdClear' に対する定義されていない参照です
scanir.c:(.text+0x630):
lcdPuts' に対する定義されていない参照です
scanir.c:(.text+0x640): lcdPosition' に対する定義されていない参照です
scanir.c:(.text+0x64c):
lcdPuts' に対する定義されていない参照です
collect2: error: ld returned 1 exit status
このように表示されてうまくいきません。
何が悪いのかわかりません。。すいません教えていただけないでしょうか。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.10%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる