Thinkpad

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら

Thinkpad

#1

投稿記事 by » 15年前

Thinkpadの加速度センサーの値を取得するためのコードを見つけたのですが、コンソールアプリケーション用なので、使い方が分かりません。
WindowsFormApplicationで使いたいです。

コード↓


//C# code
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Threading;

namespace ThinkPadSensor
{
class APS
{
[DllImport("sensor.dll")]
public static extern void ShockproofGetAccelerometerData(ref AccData accData);

[StructLayout(LayoutKind.Sequential)]
public struct AccData
{
internal int status;
internal short x;
internal short y;
}
}


class Program
{
const int CENTER_X = 508;
const int CENTER_Y = 514;
static void Main(string[/url] args)
{
APS.AccData data = new APS.AccData();
while (true)
{
APS.ShockproofGetAccelerometerData(ref data);
System.Console.WriteLine("[{0},{1},{2}]", data.x - CENTER_X, data.y - CENTER_Y, data.status);
System.Threading.Thread.Sleep(100);
}
}
}
}


とりあえずlabelに表示したいのですが、どなたか教えていただけますか?

softya

Re:Thinkpad

#2

投稿記事 by softya » 15年前

これは、そう難しくないので自力で調べてみたほうが良いと思います。C#の勉強になりますよ。
ただし無限ループになっている部分は、タイマで一定周期で処理するなどの工夫は必要ですね。 ← ここだけは注意。

Re:Thinkpad

#3

投稿記事 by » 15年前

ありがとうございます。

わかりました。がんばってみます!

Re:Thinkpad

#4

投稿記事 by » 15年前

こうしてみたのですが、動きませんでした。


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Threading;


namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}


class APS
{
[DllImport("sensor.dll")]
public static extern void ShockproofGetAccelerometerData(ref AccData accData);

[StructLayout(LayoutKind.Sequential)]
public struct AccData
{
internal int status;
internal short x;
internal short y;

}
}

public void Form1_Load(object sender, EventArgs e)
{
timer1.Interval = 500;
timer1.Enabled = true;
}

private void timer1_Tick(object sender, EventArgs e)
{
APS.AccData data = new APS.AccData();
label1.Text = data.x+"= xの値";
}



}




}

基本的なことを間違っているかもしれませんが、
なにかアドバイス等いただけると、うれしいです

Re:Thinkpad

#5

投稿記事 by » 14年前

すいません。

相互リンクです。

http://detail.chiebukuro.yahoo.co.jp/qa ... 1448740634

バグ

Re:Thinkpad

#6

投稿記事 by バグ » 14年前

APS.AccData data = new APS.AccData();

ここで構造体の実体を作成して。

APS.ShockproofGetAccelerometerData(ref data);

このメソッドで構造体の中身を取得してるっぽいので、現状のコードでは空っぽの入れ物を用意しただけで中身が入ってない状態ですね。

Re:Thinkpad

#7

投稿記事 by » 14年前

ありがとうございます。
たしかにこのままだとlabelには「0=の値」としか出てきません。

そこで、


private void timer1_Tick(object sender, EventArgs e)
{
APS.AccData data = new APS.AccData();
APS.ShockproofGetAccelerometerData(ref data); //ここを追加

label1.Text = data.x+"= xの値";
}
としてみたのですが、デバッグすると、

「AccessViolationException はハンドルされませんでした。
保護されているメモリに読み取りまたは書き込み操作を行おうとしました。
他のメモリが壊れていることが考えられます。」

というエラーが出ました。

どうしてなのでしょうか?

バグ

Re:Thinkpad

#8

投稿記事 by バグ » 14年前

APSというクラスがprivate属性だからではないかな?多分(^_^;)

Re:Thinkpad

#9

投稿記事 by » 14年前

class APS の前に public をつけてデバッグしても、変わりませんでした。

難しいです... 画像

バグ

Re:Thinkpad

#10

投稿記事 by バグ » 14年前

あとはタイマーイベントが呼ばれるたびに生成している構造体をメンバに変更してみるくらいかな?パッと見でのコンソール版との違いはそのくらいだと思います。
ただ、フォームクラスの中でAPSクラスを実装しているのも間違いではないにしても、ちょっとトリッキーだよね。理由があってしているのかもしれないけど…

Re:Thinkpad

#11

投稿記事 by » 14年前

>フォームクラスの中でAPSクラスを実装しているのも間違いではないにしても、ちょっとトリッキーだよね。
APSクラスを使っているのは、よくわからないのでそのままにしているからです。


>メンバに変更してみるくらいかな?

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}


// public class APS
// {
[DllImport("sensor.dll")]
public static extern void ShockproofGetAccelerometerData(ref AccData accData);

[StructLayout(LayoutKind.Sequential)]
public struct AccData
{
internal int status;
internal short x;
internal short y;

}
// }

public void Form1_Load(object sender, EventArgs e)
{

timer1.Interval = 500;
timer1.Enabled = true;
}
AccData data = new AccData();
private void timer1_Tick(object sender, EventArgs e)
{

ShockproofGetAccelerometerData(ref data);
label1.Text = data.x + "= xの値";
}



}


こうしてもだめでした。 画像

バグ

Re:Thinkpad

#12

投稿記事 by バグ » 14年前

1つ確認して欲しいのが、構造体にデータが入っているのかいないのかです。ブレイクポイントを使って確認してください。


data.x.ToString();
ってしなくてもコンパイル通りましたっけ?(^_^;)

Re:Thinkpad

#13

投稿記事 by » 14年前

>data.x.ToString(); ってしなくてもコンパイル通りましたっけ?
はい。"xの値="+data.x としているので通りましたが、ややこしいのでToStringで

string strx = data.x.ToString();
ShockproofGetAccelerometerData(ref data);
label1.Text = strx;

にしときます。


>ブレイクポイントを使って
label1.Text = strx;
のところにブレークポイントを挿入すると、strxにはちゃんと数値が入っていました。

ですが、ブレークポイントを削除してデバッグすると、
今度はなぜか新しいエラーが出てきました。

エラー↓
NullReferenceExeption はハンドルされませんでした。
オブジェクト参照がオブジェクト インスタンスに設定されていません。 画像

バグ

Re:Thinkpad

#14

投稿記事 by バグ » 14年前

私の書き方が悪かったですね(^_^;)

ブレイクポイントを使って確認してほしかったのは…

ShockproofGetAccelerometerData(ref data);

のあとのdataの中身です。

Re:Thinkpad

#15

投稿記事 by » 14年前

画像のようにdataの中身がないみたいです。

コンソールの時はちゃんと動いていたのですが...

バグ

Re:Thinkpad

#16

投稿記事 by バグ » 14年前

うーん、これだけの情報では推測でしか言えないんですよね。いっそのこと、動く状態のプロジェクト(コンソール版)と、そうでないプロジェクト(フォーム版)の両方をアップされてはいかがでしょうか?

Re:Thinkpad

#17

投稿記事 by » 14年前

どうやってアップすればいいのですか?

バグ

Re:Thinkpad

#18

投稿記事 by バグ » 14年前

圧縮して添付できるサイズならばそのまま、無理ならば適当なアップローダーを使うといいと思います。

Re:Thinkpad

#19

投稿記事 by » 14年前

ここにアップしました。

コンソールの方↓
http://www6.puny.jp/uploader/download/1287295779.zip
ダウンロードパス : think1



フォームの方↓
http://www6.puny.jp/uploader/download/1287296074.zip
ダウンロードパス : think2

バグ

Re:Thinkpad

#20

投稿記事 by バグ » 14年前

私の環境ではsensor.dllがないので両方とも動きませんでした(^_^;)

Re:Thinkpad

#21

投稿記事 by » 14年前

そうですよね...

では困りましたね。どうしましょうか?

バグ

Re:Thinkpad

#22

投稿記事 by バグ » 14年前

ソースを見る限りでは特に気になる箇所は見当たらないので、もっと根本的な箇所で間違っている可能性がなくはないです。

構造体の定義とか、使用されているメソッドが違うとか…

もう、そのくらいしか思い付かないですね(^_^;)

Re:Thinkpad

#23

投稿記事 by » 14年前

そうですか。
うーん、これが出来ないと作りたいものが途中で止ってしまうんです。
どうしましょう...

Justy

Re:Thinkpad

#24

投稿記事 by Justy » 14年前

 環境を持っていないので検証はできませんが、AccDataが完全では無くて、
ShockproofGetAccelerometerDataの呼び出し時にスタックを破壊しているような気がします。

ThinkPadの加速度センサ
http://homepage3.nifty.com/TeaPot/Accelerometer.htm

きまぐれテクニカルノート(仮 :: Category Archives: C#
http://blog.livedoor.jp/take23per/archi ... 25466.html

Re:Thinkpad

#25

投稿記事 by » 14年前

Justyさん、お久しぶりです。

なにか対策みたいなものはあるのでしょうか? 画像

バグ

Re:Thinkpad

#26

投稿記事 by バグ » 14年前

Justyさんが載せているリンク先の記事は御覧になりましたか?
black_catさんの書かれたソースとは、構造体のプロパティの数が全く違うように見えるのですが…
これが原因ではないのですか?(^_^;)

※もし、これが原因だったのならば、コンソール版が動いているというのは「たまたま」だということでしょう。

Re:Thinkpad

#27

投稿記事 by » 14年前

>バグさん
そうですか。たまたまでしたか...

>Justyさん
参考になりそうなリンクですね。ありがとうございます。
どうなるかは分かりませんが、とりあえず見ながらがんばってみます。

Re:Thinkpad

#28

投稿記事 by » 14年前

みなさん、ありがとうございました。
おかげでフォームアプリケーションで値の表示ができました。
いま最高にうれしいです!(>_<)

「きまぐれテクニカルノート(仮 :: Category Archives: C#」
の方がとても役に立ちました。

これからもいろいろお聞きさせていただくと思いますが、
またその時はよろしくお願いします。


画像

閉鎖

“C言語何でも質問掲示板” へ戻る