Thinkpad
Thinkpad
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に表示したいのですが、どなたか教えていただけますか?
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
これは、そう難しくないので自力で調べてみたほうが良いと思います。C#の勉強になりますよ。
ただし無限ループになっている部分は、タイマで一定周期で処理するなどの工夫は必要ですね。 ← ここだけは注意。
ただし無限ループになっている部分は、タイマで一定周期で処理するなどの工夫は必要ですね。 ← ここだけは注意。
Re:Thinkpad
こうしてみたのですが、動きませんでした。
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の値";
}
}
}
基本的なことを間違っているかもしれませんが、
なにかアドバイス等いただけると、うれしいです
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
APS.AccData data = new APS.AccData();
ここで構造体の実体を作成して。
APS.ShockproofGetAccelerometerData(ref data);
このメソッドで構造体の中身を取得してるっぽいので、現状のコードでは空っぽの入れ物を用意しただけで中身が入ってない状態ですね。
ここで構造体の実体を作成して。
APS.ShockproofGetAccelerometerData(ref data);
このメソッドで構造体の中身を取得してるっぽいので、現状のコードでは空っぽの入れ物を用意しただけで中身が入ってない状態ですね。
Re:Thinkpad
ありがとうございます。
たしかにこのままだと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 はハンドルされませんでした。
保護されているメモリに読み取りまたは書き込み操作を行おうとしました。
他のメモリが壊れていることが考えられます。」
というエラーが出ました。
どうしてなのでしょうか?
たしかにこのままだと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
あとはタイマーイベントが呼ばれるたびに生成している構造体をメンバに変更してみるくらいかな?パッと見でのコンソール版との違いはそのくらいだと思います。
ただ、フォームクラスの中でAPSクラスを実装しているのも間違いではないにしても、ちょっとトリッキーだよね。理由があってしているのかもしれないけど…
ただ、フォームクラスの中でAPSクラスを実装しているのも間違いではないにしても、ちょっとトリッキーだよね。理由があってしているのかもしれないけど…
Re:Thinkpad
>フォームクラスの中で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の値";
}
}
こうしてもだめでした。
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
1つ確認して欲しいのが、構造体にデータが入っているのかいないのかです。ブレイクポイントを使って確認してください。
data.x.ToString();
ってしなくてもコンパイル通りましたっけ?(^_^;)
data.x.ToString();
ってしなくてもコンパイル通りましたっけ?(^_^;)
Re:Thinkpad
>data.x.ToString(); ってしなくてもコンパイル通りましたっけ?
はい。"xの値="+data.x としているので通りましたが、ややこしいのでToStringで
string strx = data.x.ToString();
ShockproofGetAccelerometerData(ref data);
label1.Text = strx;
にしときます。
>ブレイクポイントを使って
label1.Text = strx;
のところにブレークポイントを挿入すると、strxにはちゃんと数値が入っていました。
ですが、ブレークポイントを削除してデバッグすると、
今度はなぜか新しいエラーが出てきました。
エラー↓
NullReferenceExeption はハンドルされませんでした。
オブジェクト参照がオブジェクト インスタンスに設定されていません。
はい。"xの値="+data.x としているので通りましたが、ややこしいのでToStringで
string strx = data.x.ToString();
ShockproofGetAccelerometerData(ref data);
label1.Text = strx;
にしときます。
>ブレイクポイントを使って
label1.Text = strx;
のところにブレークポイントを挿入すると、strxにはちゃんと数値が入っていました。
ですが、ブレークポイントを削除してデバッグすると、
今度はなぜか新しいエラーが出てきました。
エラー↓
NullReferenceExeption はハンドルされませんでした。
オブジェクト参照がオブジェクト インスタンスに設定されていません。

Re:Thinkpad
私の書き方が悪かったですね(^_^;)
ブレイクポイントを使って確認してほしかったのは…
ShockproofGetAccelerometerData(ref data);
のあとのdataの中身です。
ブレイクポイントを使って確認してほしかったのは…
ShockproofGetAccelerometerData(ref data);
のあとのdataの中身です。
Re:Thinkpad
うーん、これだけの情報では推測でしか言えないんですよね。いっそのこと、動く状態のプロジェクト(コンソール版)と、そうでないプロジェクト(フォーム版)の両方をアップされてはいかがでしょうか?
Re:Thinkpad
ここにアップしました。
コンソールの方↓
http://www6.puny.jp/uploader/download/1287295779.zip
ダウンロードパス : think1
フォームの方↓
http://www6.puny.jp/uploader/download/1287296074.zip
ダウンロードパス : think2
コンソールの方↓
http://www6.puny.jp/uploader/download/1287295779.zip
ダウンロードパス : think1
フォームの方↓
http://www6.puny.jp/uploader/download/1287296074.zip
ダウンロードパス : think2
Re:Thinkpad
ソースを見る限りでは特に気になる箇所は見当たらないので、もっと根本的な箇所で間違っている可能性がなくはないです。
構造体の定義とか、使用されているメソッドが違うとか…
もう、そのくらいしか思い付かないですね(^_^;)
構造体の定義とか、使用されているメソッドが違うとか…
もう、そのくらいしか思い付かないですね(^_^;)
Re:Thinkpad
環境を持っていないので検証はできませんが、AccDataが完全では無くて、
ShockproofGetAccelerometerDataの呼び出し時にスタックを破壊しているような気がします。
ThinkPadの加速度センサ
http://homepage3.nifty.com/TeaPot/Accelerometer.htm
きまぐれテクニカルノート(仮 :: Category Archives: C#
http://blog.livedoor.jp/take23per/archi ... 25466.html
ShockproofGetAccelerometerDataの呼び出し時にスタックを破壊しているような気がします。
ThinkPadの加速度センサ
http://homepage3.nifty.com/TeaPot/Accelerometer.htm
きまぐれテクニカルノート(仮 :: Category Archives: C#
http://blog.livedoor.jp/take23per/archi ... 25466.html
Re:Thinkpad
Justyさんが載せているリンク先の記事は御覧になりましたか?
black_catさんの書かれたソースとは、構造体のプロパティの数が全く違うように見えるのですが…
これが原因ではないのですか?(^_^;)
※もし、これが原因だったのならば、コンソール版が動いているというのは「たまたま」だということでしょう。
black_catさんの書かれたソースとは、構造体のプロパティの数が全く違うように見えるのですが…
これが原因ではないのですか?(^_^;)
※もし、これが原因だったのならば、コンソール版が動いているというのは「たまたま」だということでしょう。
Re:Thinkpad
>バグさん
そうですか。たまたまでしたか...
>Justyさん
参考になりそうなリンクですね。ありがとうございます。
どうなるかは分かりませんが、とりあえず見ながらがんばってみます。
そうですか。たまたまでしたか...
>Justyさん
参考になりそうなリンクですね。ありがとうございます。
どうなるかは分かりませんが、とりあえず見ながらがんばってみます。
Re:Thinkpad
みなさん、ありがとうございました。
おかげでフォームアプリケーションで値の表示ができました。
いま最高にうれしいです!(>_<)
「きまぐれテクニカルノート(仮 :: Category Archives: C#」
の方がとても役に立ちました。
これからもいろいろお聞きさせていただくと思いますが、
またその時はよろしくお願いします。

おかげでフォームアプリケーションで値の表示ができました。
いま最高にうれしいです!(>_<)
「きまぐれテクニカルノート(仮 :: Category Archives: C#」
の方がとても役に立ちました。
これからもいろいろお聞きさせていただくと思いますが、
またその時はよろしくお願いします。
