ページ 1 / 1
Thinkpad
Posted: 2010年10月13日(水) 18:06
by 2³
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に表示したいのですが、どなたか教えていただけますか?
Re:Thinkpad
Posted: 2010年10月13日(水) 19:20
by softya
これは、そう難しくないので自力で調べてみたほうが良いと思います。C#の勉強になりますよ。
ただし無限ループになっている部分は、タイマで一定周期で処理するなどの工夫は必要ですね。 ← ここだけは注意。
Re:Thinkpad
Posted: 2010年10月13日(水) 22:28
by 2³
ありがとうございます。
わかりました。がんばってみます!
Re:Thinkpad
Posted: 2010年10月13日(水) 23:08
by 2³
こうしてみたのですが、動きませんでした。
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
Posted: 2010年10月16日(土) 00:20
by 2³
Re:Thinkpad
Posted: 2010年10月16日(土) 07:11
by バグ
APS.AccData data = new APS.AccData();
ここで構造体の実体を作成して。
APS.ShockproofGetAccelerometerData(ref data);
このメソッドで構造体の中身を取得してるっぽいので、現状のコードでは空っぽの入れ物を用意しただけで中身が入ってない状態ですね。
Re:Thinkpad
Posted: 2010年10月16日(土) 08:01
by 2³
ありがとうございます。
たしかにこのままだと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
Posted: 2010年10月16日(土) 09:51
by バグ
APSというクラスがprivate属性だからではないかな?多分(^_^;)
Re:Thinkpad
Posted: 2010年10月16日(土) 11:11
by 2³
class APS の前に public をつけてデバッグしても、変わりませんでした。
難しいです...

Re:Thinkpad
Posted: 2010年10月16日(土) 12:44
by バグ
あとはタイマーイベントが呼ばれるたびに生成している構造体をメンバに変更してみるくらいかな?パッと見でのコンソール版との違いはそのくらいだと思います。
ただ、フォームクラスの中でAPSクラスを実装しているのも間違いではないにしても、ちょっとトリッキーだよね。理由があってしているのかもしれないけど…
Re:Thinkpad
Posted: 2010年10月16日(土) 13:01
by 2³
>フォームクラスの中で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
Posted: 2010年10月16日(土) 13:27
by バグ
1つ確認して欲しいのが、構造体にデータが入っているのかいないのかです。ブレイクポイントを使って確認してください。
data.x.ToString();
ってしなくてもコンパイル通りましたっけ?(^_^;)
Re:Thinkpad
Posted: 2010年10月16日(土) 16:05
by 2³
>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
Posted: 2010年10月16日(土) 16:25
by バグ
私の書き方が悪かったですね(^_^;)
ブレイクポイントを使って確認してほしかったのは…
ShockproofGetAccelerometerData(ref data);
のあとのdataの中身です。
Re:Thinkpad
Posted: 2010年10月16日(土) 18:43
by 2³
画像のようにdataの中身がないみたいです。
コンソールの時はちゃんと動いていたのですが...
Re:Thinkpad
Posted: 2010年10月17日(日) 08:32
by バグ
うーん、これだけの情報では推測でしか言えないんですよね。いっそのこと、動く状態のプロジェクト(コンソール版)と、そうでないプロジェクト(フォーム版)の両方をアップされてはいかがでしょうか?
Re:Thinkpad
Posted: 2010年10月17日(日) 14:23
by 2³
どうやってアップすればいいのですか?
Re:Thinkpad
Posted: 2010年10月17日(日) 14:49
by バグ
圧縮して添付できるサイズならばそのまま、無理ならば適当なアップローダーを使うといいと思います。
Re:Thinkpad
Posted: 2010年10月17日(日) 15:07
by 2³
Re:Thinkpad
Posted: 2010年10月17日(日) 20:12
by バグ
私の環境ではsensor.dllがないので両方とも動きませんでした(^_^;)
Re:Thinkpad
Posted: 2010年10月17日(日) 23:09
by 2³
そうですよね...
では困りましたね。どうしましょうか?
Re:Thinkpad
Posted: 2010年10月17日(日) 23:17
by バグ
ソースを見る限りでは特に気になる箇所は見当たらないので、もっと根本的な箇所で間違っている可能性がなくはないです。
構造体の定義とか、使用されているメソッドが違うとか…
もう、そのくらいしか思い付かないですね(^_^;)
Re:Thinkpad
Posted: 2010年10月17日(日) 23:33
by 2³
そうですか。
うーん、これが出来ないと作りたいものが途中で止ってしまうんです。
どうしましょう...
Re:Thinkpad
Posted: 2010年10月17日(日) 23:57
by Justy
環境を持っていないので検証はできませんが、AccDataが完全では無くて、
ShockproofGetAccelerometerDataの呼び出し時にスタックを破壊しているような気がします。
ThinkPadの加速度センサ
http://homepage3.nifty.com/TeaPot/Accelerometer.htm
きまぐれテクニカルノート(仮 :: Category Archives: C#
http://blog.livedoor.jp/take23per/archi ... 25466.html
Re:Thinkpad
Posted: 2010年10月18日(月) 07:30
by 2³
Justyさん、お久しぶりです。
なにか対策みたいなものはあるのでしょうか?

Re:Thinkpad
Posted: 2010年10月18日(月) 08:58
by バグ
Justyさんが載せているリンク先の記事は御覧になりましたか?
black_catさんの書かれたソースとは、構造体のプロパティの数が全く違うように見えるのですが…
これが原因ではないのですか?(^_^;)
※もし、これが原因だったのならば、コンソール版が動いているというのは「たまたま」だということでしょう。
Re:Thinkpad
Posted: 2010年10月19日(火) 00:40
by 2³
>バグさん
そうですか。たまたまでしたか...
>Justyさん
参考になりそうなリンクですね。ありがとうございます。
どうなるかは分かりませんが、とりあえず見ながらがんばってみます。
Re:Thinkpad
Posted: 2010年10月19日(火) 13:46
by 2³
みなさん、ありがとうございました。
おかげでフォームアプリケーションで値の表示ができました。
いま最高にうれしいです!(>_<)
「きまぐれテクニカルノート(仮 :: Category Archives: C#」
の方がとても役に立ちました。
これからもいろいろお聞きさせていただくと思いますが、
またその時はよろしくお願いします。
