FC2ブログ

水雲風

とりあえず人生を記録と妄想の吐き出しの地

USB-IO2.0をVC6で動かしてみた(2012/02/21)

秋月電子通商から発売されているUSB-IO2.0をコマンドラインで操作するプログラムをVC6で作ってみました。
USB-IO2.0制御サンプルを参考にしています。
関連 : 水雲風 USB-IO2.0を使ってrubyからLEDをピカピカさせてみた

実行方法

usbio2ctrl.exe [ポート1に対する出力値]

開発環境

滅びかけの環境、、、。

作成コード

// usbio2ctrl.cpp
//

#include "stdafx.h"
#include "UsbIO2Ctrl1.h"

int main(int argc, char* argv[])
{
	if (argc != 2)
	{
		printf("usage: %s number\n", argv[0]);
		return 0;
	}
	char in1 = atoi(argv[1]);

	UsbIO2Ctrl ctrl;
	DWORD result = ctrl.initialize();
	if (result != NO_ERROR)
	{
		printf("error:%d\n", result);
		return -1;
	}

	result = ctrl.inout(in1, 0x00);
	if (result != NO_ERROR)
	{
		printf("error:%d\n", result);
		return -2;
	}

	return 0;
}
// UsbIO2Ctrl1.cpp: UsbIO2Ctrl 
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "UsbIO2Ctrl1.h"

namespace
{
	const USHORT VENDOR_ID = 0x1352;
	const USHORT PRODUCT_ID = 0x121;
}

UsbIO2Ctrl::UsbIO2Ctrl()
{
}

UsbIO2Ctrl::~UsbIO2Ctrl()
{
}

DWORD UsbIO2Ctrl::initialize()
{
	GUID hidGuid = {0};
	::HidD_GetHidGuid(&hidGuid);
	HDEVINFO deviceInfoSet = ::SetupDiGetClassDevs(&hidGuid, 
												   NULL, 
												   NULL, 
												   DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);

	DWORD memberIndex = 0;
	for (memberIndex = 0; ;memberIndex++)
	{
		SP_DEVICE_INTERFACE_DATA myDeviceInfoData = {0};
		myDeviceInfoData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
		BOOL result = ::SetupDiEnumDeviceInterfaces(deviceInfoSet, 
													NULL, 
													&hidGuid, 
													memberIndex, 
													&myDeviceInfoData);
		if (result == FALSE)
		{
			return ::GetLastError();
		}

		DWORD needed = 0;
		result = ::SetupDiGetDeviceInterfaceDetail(deviceInfoSet, 
												   &myDeviceInfoData, 
												   NULL,
												   0,
												   &needed,
												   NULL);
		boost::shared_array<char> detailData(new char[needed]);
		::memset(detailData.get(), 0, needed);
		PSP_DEVICE_INTERFACE_DETAIL_DATA detailDataPtr = 
			(PSP_DEVICE_INTERFACE_DETAIL_DATA)detailData.get();
		detailDataPtr->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
		DWORD length = 0;
		result = ::SetupDiGetDeviceInterfaceDetail(deviceInfoSet,
												   &myDeviceInfoData,
												   detailDataPtr,
												   needed,
												   &length,
												   NULL);
		if (result == FALSE)
		{
			return ::GetLastError();
		}

		SECURITY_ATTRIBUTES sa = {0};
		sa.nLength = sizeof(SECURITY_ATTRIBUTES);
		HANDLE hidDevice = ::CreateFile(detailDataPtr->DevicePath,
										GENERIC_READ | GENERIC_WRITE,
										FILE_SHARE_READ | FILE_SHARE_WRITE,
										&sa,
										OPEN_EXISTING,
										0,
										0);
		if (hidDevice == INVALID_HANDLE_VALUE)
		{
			continue;
		}
		m_hidDevice = boost::shared_ptr<void>(hidDevice, ::CloseHandle);

		HIDD_ATTRIBUTES deviceAttributes;
		BOOLEAN res = ::HidD_GetAttributes(hidDevice, &deviceAttributes);
		if (res == FALSE)
		{
			return ::GetLastError();
		}
		
		if ((deviceAttributes.VendorID != VENDOR_ID) || 
			(deviceAttributes.ProductID != PRODUCT_ID))
		{
			continue;
		}

		PHIDP_PREPARSED_DATA preparsedData = {0};
		::HidD_GetPreparsedData(hidDevice, &preparsedData);
		::HidP_GetCaps(preparsedData, &m_capabilities);

		return NO_ERROR;
	}

	return ERROR_DEVICE_NOT_AVAILABLE;
}

DWORD UsbIO2Ctrl::inout(char in1, char in2, char* out1, char* out2)
{
	boost::shared_array<char> sendData(new char[64]);
	::memset(sendData.get(), 0, 64);
	boost::shared_array<char> recvData(new char[64]);
	::memset(recvData.get(), 0, 64);

	sendData[0] = 0x20;
	sendData[1] = 0x01;
	sendData[2] = in1;
	sendData[3] = 0x02;
	sendData[4] = in2;
	sendData[63] = 0x00;

	DWORD result = sendRecv(sendData.get(), recvData.get());
	if (result != NO_ERROR)
	{
		return result;
	}

	if (out1 != NULL)
	{
		(*out1) = recvData.get()[1];
	}
	if (out2 != NULL)
	{
		(*out2) = recvData.get()[2];
	}

	return result;
}

DWORD UsbIO2Ctrl::sendRecv(char* sendData, char* recvData)
{
	boost::shared_array<char> writeData(new char[m_capabilities.OutputReportByteLength]);
	::memset(writeData.get(), 0, m_capabilities.OutputReportByteLength);
	boost::shared_array<char> readData(new char[m_capabilities.InputReportByteLength]);
	::memset(readData.get(), 0, m_capabilities.InputReportByteLength);

	for (int i = 0; i < 64; i++)
	{
		writeData.get()[i + 1] = sendData[i];
	}

	DWORD numberOfBytesWritten = 0;
	BOOL result = ::WriteFile(m_hidDevice.get(),
							  writeData.get(),
							  m_capabilities.OutputReportByteLength,
							  &numberOfBytesWritten,
							  NULL);
	if (result == FALSE)
	{
		return ::GetLastError();
	}

	do
	{
		DWORD numberOfBytesRead = 0;
		result = ::ReadFile(m_hidDevice.get(),
							readData.get(),
							m_capabilities.InputReportByteLength,
							&numberOfBytesRead,
							NULL);
		if (result == FALSE)
		{
			return ::GetLastError();
		}
	} while (writeData.get()[64] != readData.get()[64]);

	for (int j = 0; j < 64; j++)
	{
		recvData[j] = readData.get()[j + 1];
	}

	return NO_ERROR;
}
// UsbIO2Ctrl1.h: UsbIO2Ctrl 
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_USBIO2CTRL1_H__0E3080BB_4959_47D7_9C0F_F6A89A3232BD__INCLUDED_)
#define AFX_USBIO2CTRL1_H__0E3080BB_4959_47D7_9C0F_F6A89A3232BD__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

class UsbIO2Ctrl  
{
public:
	UsbIO2Ctrl();
	virtual ~UsbIO2Ctrl();
	DWORD initialize();
	DWORD inout(char in1, char in2, char* out1 = NULL, char* out2 = NULL);
	DWORD sendRecv(char* sendData, char* recvData);

private:
	boost::shared_ptr m_hidDevice;
	HIDP_CAPS m_capabilities;
};

#endif
#if !defined(AFX_STDAFX_H__4573BBF8_3077_496E_B522_436B91A60FEA__INCLUDED_)
#define AFX_STDAFX_H__4573BBF8_3077_496E_B522_436B91A60FEA__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#define WIN32_LEAN_AND_MEAN

#include <stdio.h>

#include <windows.h>
#include <boost/shared_ptr.hpp>
#include <boost/shared_array.hpp>
#include <setupapi.h>
extern "C" {
#include <Hidsdi.h>
}

#endif 



スポンサーサイト



  1. 2012/02/21(火) 20:57:08|
  2. 未分類
  3. | コメント:0

映画「クラバート」(2012/02/19)

ドイツ映画「クラバート」見ました。
みなしごのクラバートが粉挽き職人の見習いになり同時に魔法を勉強していくという話です。
ハリーポッターが好きな人にはおすすめできないですね。
ハーマイオニーのいない男だらけの嫌な感じの魔法学校の話です(笑)

面白かったです。
良い意味で展開が読めなくてドキドキしながら見れました。

原作忘れてて、映画見た後読んだんですが結構原作に忠実な感じですね。
うまいことエピソードを取捨選択してよくまとめてある感じです。
原作好きな人にとっては好き嫌いはあるでしょうが、これ以上うまくまとめるのは難しいのではと思いました。
丁寧に作られた良作だと思います。




  1. 2012/02/19(日) 21:42:49|
  2. 映像作品感想
  3. | トラックバック:0
  4. | コメント:0

水切りヨーグルト(2012/02/19)



水切りヨーグルト作ってみてます。
ヨーグルティア発売してるところで水切り容器売ってるの知って買ってみました。

結構食感が変わって面白いです。
見た目はサワークリームみたいな感じになり、食感はさっぱりしたサワークリームといった感じです。
最近は食パンに自作のジャムと一緒に塗ってるんですが結構美味しいです。
  1. 2012/02/19(日) 20:12:20|
  2. | トラックバック:0
  3. | コメント:0

ヨーグルティアで納豆(2012/02/19)



ヨーグルティアで納豆作ってみました。
基本は大豆を似て市販の納豆と混ぜて置いておくだけです。
初回は大豆焦がしちゃいましたが、味は普通に納豆でした。

でも、ヨーグルトと違ってコスト的には市販品とあまりかわりませんね。
楽天で1kg700円送料無料の大豆見つけて作ってます。
  1. 2012/02/19(日) 20:03:17|
  2. | トラックバック:0
  3. | コメント:0

智頭宿雪まつり(2012/02/05)

智頭宿雪まつりに行って来ました。
5時前についてぶらぶらしたましたが、だんだん暗くなってくるとあちこちに置いてあるローソクの明かりが綺麗でした。





「諏訪酒造」に併設された「梶屋茶屋」でうどん食べましたが、粕汁でうどんを作った感じで美味しかったです。



「諏訪酒造」の土産物売り場で生姜のコンフェチェール買いました。
チャイに入れてみましたが生姜の風味が美味しかったです。
あと、酒粕も買ってまずは酒粕の豚汁作ってみました。
これまた美味しかったです。

おまつりではうどん以外に振舞われていた豚汁、ポテト、甘酒を頂きました。
夜でとても寒かったでしたが、どれも美味しく温まりました。
行って良かったです。
地元の人が楽しそうに参加されていたのが印象的でした。

  1. 2012/02/05(日) 19:04:20|
  2. ラクダの王国
  3. | トラックバック:0
  4. | コメント:0

ヨーグルティアでヨーグルト(2012/02/05)

ヨーグルティアでヨーグルト作成してみました。

作るのはすごく簡単でした。
牛乳1本とプレーンヨーグルト1カップを混ぜて容器にいれてヨーグルティアにセットするだけ。
今回はヨーグルティアについてくるレシピ通りの40度6時間設定で作ってみました。





ヨーグルティアから冷蔵庫に移した直後は柔らかい感じだったですが、
一晩たってみると少し固くなってまさしくヨーグルトといった感じに。
味も普通に無糖のヨーグルトです。



発酵では菌が繁殖しやすい温度を管理することが重要ですが、ヨーグルティアはシンプルな操作で温度管理ができて良いですね。
付属のレシピを見ているといろいろなタイプのヨーグルトを作りたくなります。
内容器が2つ付いて来るのでローテーションしたりできるのも良いですね。
次は納豆あたりに挑戦したいです。



  1. 2012/02/05(日) 19:02:31|
  2. | トラックバック:0
  3. | コメント:0

プロフィール

おげれつ脱脂綿

カレンダー

01 | 2012/02 | 03
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 - - -

カテゴリー

月別アーカイブ(タブ)

最近の記事

最近のコメント

最近のトラックバック

ブロとも申請フォーム

この人とブロともになる

ブログ内検索

RSSフィード

全ての記事を表示する

全ての記事を表示する