<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>JL&#039;s blog &#187; Reverse engineering</title>
	<atom:link href="http://john.5070.info/category/reverse-engineering/feed/" rel="self" type="application/rss+xml" />
	<link>http://john.5070.info</link>
	<description>:-)</description>
	<lastBuildDate>Sun, 06 Dec 2009 17:11:56 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Reverse-engineering сердечного ритма</title>
		<link>http://john.5070.info/2008/03/reverse-engineering-%d1%81%d0%b5%d1%80%d0%b4%d0%b5%d1%87%d0%bd%d0%be%d0%b3%d0%be-%d1%80%d0%b8%d1%82%d0%bc%d0%b0/</link>
		<comments>http://john.5070.info/2008/03/reverse-engineering-%d1%81%d0%b5%d1%80%d0%b4%d0%b5%d1%87%d0%bd%d0%be%d0%b3%d0%be-%d1%80%d0%b8%d1%82%d0%bc%d0%b0/#comments</comments>
		<pubDate>Sat, 29 Mar 2008 15:46:38 +0000</pubDate>
		<dc:creator>John Lepikhin</dc:creator>
				<category><![CDATA[Reverse engineering]]></category>
		<category><![CDATA[Железо]]></category>
		<category><![CDATA[Цэ]]></category>

		<guid isPermaLink="false">http://john.5070.info/?p=19</guid>
		<description><![CDATA[Купил себе вот такой приборчик:

Мониторинг сердечного ритма Beurer PM55. С креплением на руль велосипеда, с USB-портом и прочими прелестями.
Игрушка замечательная, но идущий в комплекте софт оказался вне конкуренции: под Wine&#8217;ом конечно же не завёлся, под Vista тоже. Поставил в виртуальной машине WinXP &#8211; и только там я что-то увидел. Но на этом приключения с ним [...]]]></description>
			<content:encoded><![CDATA[<p>Купил себе вот такой приборчик:</p>
<p><span id="more-19"></span><a href="http://john.5070.info/wp-content/uploads/2008/03/tmp1.JPG" title="Мониторинг сердечного ритма"><img src="http://john.5070.info/wp-content/uploads/2008/03/tmp1.JPG" ilo-full-src="http://john.5070.info/wp-content/uploads/2008/03/tmp1.JPG" alt="Мониторинг сердечного ритма" /></a></p>
<p>Мониторинг сердечного ритма Beurer PM55. С креплением на руль велосипеда, с USB-портом и прочими прелестями.</p>
<p>Игрушка замечательная, но идущий в комплекте софт оказался вне конкуренции: под Wine&#8217;ом конечно же не завёлся, под Vista тоже. Поставил в виртуальной машине WinXP &#8211; и только там я что-то увидел. Но на этом приключения с ним не закончились. Софт оказался локализован на английский с немецкого максимум наполовину(!). Умеет сохранять данные только в свой закрытый и  очень странный формат (10 однобайтовых записей тренировки в файле заняли каких-то 130Kb), интерфейс с закосом под MacOS, но до дикости неудобный.</p>
<p>В общем, создатели сами меня подвели к мысли о написании своей софтины. Почитал в инете &#8211; всё не так уж и сложно. Поднял ядрёный модуль usbmon, помониторил что там софтина в прибор пихает. Часа за 3 разобрался с форматом, ещё за 5 часов вспомнил что такое Цэ. Результатом деятельности стала утилита с рабочим названием catbeat (&#8221;избиватель кошек&#8221; :) Работает в userspace, требует libusb. Лицензия? Ну, пусть будет GPLv3.</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;usb.h&gt;</span>
<span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;string.h&gt;</span>
&nbsp;
<span style="color: #339933;">#define BSIZE 4000</span>
<span style="color: #339933;">#define CHUNK_SIZE 50</span>
&nbsp;
<span style="color: #993333;">char</span> rdata<span style="color: #009900;">&#91;</span>BSIZE<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">void</span> perr <span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> <span style="color: #339933;">*</span>err<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> ecode<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	fprintf <span style="color: #009900;">&#40;</span>stderr<span style="color: #339933;">,</span> err<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ecode<span style="color: #009900;">&#41;</span> exit <span style="color: #009900;">&#40;</span>ecode<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> strange2string <span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> n<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>d<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> f <span style="color: #339933;">=</span> n <span style="color: #339933;">&gt;&gt;</span> <span style="color: #0000dd;">4</span><span style="color: #339933;">;</span>
	sprintf <span style="color: #009900;">&#40;</span>d<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;%i%i&quot;</span><span style="color: #339933;">,</span> f<span style="color: #339933;">,</span> n<span style="color: #339933;">-</span>f<span style="color: #339933;">*</span><span style="color: #0000dd;">16</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">static</span> <span style="color: #993333;">struct</span> usb_device <span style="color: #339933;">*</span>findDev<span style="color: #009900;">&#40;</span>uint16_t vendor<span style="color: #339933;">,</span> uint16_t product<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #993333;">struct</span> usb_bus <span style="color: #339933;">*</span>bus<span style="color: #339933;">;</span>
  <span style="color: #993333;">struct</span> usb_device <span style="color: #339933;">*</span>dev<span style="color: #339933;">;</span>
  <span style="color: #993333;">struct</span> usb_bus <span style="color: #339933;">*</span>busses<span style="color: #339933;">;</span>
&nbsp;
  usb_init<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  usb_find_busses<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  usb_find_devices<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  busses <span style="color: #339933;">=</span> usb_get_busses<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>bus <span style="color: #339933;">=</span> busses<span style="color: #339933;">;</span> bus<span style="color: #339933;">;</span> bus <span style="color: #339933;">=</span> bus<span style="color: #339933;">-&gt;</span>next<span style="color: #009900;">&#41;</span>
		<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>dev <span style="color: #339933;">=</span> bus<span style="color: #339933;">-&gt;</span>devices<span style="color: #339933;">;</span> dev<span style="color: #339933;">;</span> dev <span style="color: #339933;">=</span> dev<span style="color: #339933;">-&gt;</span>next<span style="color: #009900;">&#41;</span>
			<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>dev<span style="color: #339933;">-&gt;</span>descriptor.<span style="color: #202020;">idVendor</span> <span style="color: #339933;">==</span> vendor<span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span>dev<span style="color: #339933;">-&gt;</span>descriptor.<span style="color: #202020;">idProduct</span> <span style="color: #339933;">==</span> product<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #b1b100;">return</span> dev<span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">return</span> NULL<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> sendData <span style="color: #009900;">&#40;</span>usb_dev_handle <span style="color: #339933;">*</span>hdl<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>data<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	usb_control_msg<span style="color: #009900;">&#40;</span>hdl<span style="color: #339933;">,</span> <span style="color: #208080;">0xc0</span><span style="color: #339933;">,</span> <span style="color: #208080;">0x04</span><span style="color: #339933;">,</span> <span style="color: #208080;">0x500d</span><span style="color: #339933;">,</span> <span style="color: #208080;">0x0000</span><span style="color: #339933;">,</span> rdata<span style="color: #339933;">,</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">2000</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	usb_control_msg<span style="color: #009900;">&#40;</span>hdl<span style="color: #339933;">,</span> <span style="color: #208080;">0x40</span><span style="color: #339933;">,</span> <span style="color: #208080;">0x04</span><span style="color: #339933;">,</span> <span style="color: #208080;">0x5001</span><span style="color: #339933;">,</span> <span style="color: #208080;">0x0000</span><span style="color: #339933;">,</span> data<span style="color: #339933;">,</span> <span style="color: #0000dd;">5</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">1000</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #993333;">int</span> r<span style="color: #339933;">;</span>
	<span style="color: #993333;">int</span> rv <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		r <span style="color: #339933;">=</span> usb_control_msg<span style="color: #009900;">&#40;</span>hdl<span style="color: #339933;">,</span> <span style="color: #208080;">0xc0</span><span style="color: #339933;">,</span> <span style="color: #208080;">0x04</span><span style="color: #339933;">,</span> <span style="color: #208080;">0x5002</span><span style="color: #339933;">,</span> <span style="color: #208080;">0x0000</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>rdata<span style="color: #009900;">&#91;</span>rv<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> CHUNK_SIZE<span style="color: #339933;">,</span> <span style="color: #0000dd;">5000</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>r <span style="color: #339933;">&lt;=</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
		rv <span style="color: #339933;">+=</span> r<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">return</span> rv<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> readLoop <span style="color: #009900;">&#40;</span>usb_dev_handle <span style="color: #339933;">*</span>hdl<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">char</span> s1<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">5</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> s2<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">5</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> s3<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">5</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #993333;">int</span> rv <span style="color: #339933;">=</span> sendData <span style="color: #009900;">&#40;</span>hdl<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;<span style="color: #660099; font-weight: bold;">\xa1</span><span style="color: #660099; font-weight: bold;">\x01</span><span style="color: #660099; font-weight: bold;">\x00</span><span style="color: #660099; font-weight: bold;">\x03</span><span style="color: #660099; font-weight: bold;">\xa5</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #993333;">int</span> loop <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #993333;">char</span> tdata<span style="color: #009900;">&#91;</span>BSIZE<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>rv <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">13</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
&nbsp;
		rv <span style="color: #339933;">=</span> sendData <span style="color: #009900;">&#40;</span>hdl<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;<span style="color: #660099; font-weight: bold;">\xa1</span><span style="color: #660099; font-weight: bold;">\x01</span><span style="color: #660099; font-weight: bold;">\x00</span><span style="color: #660099; font-weight: bold;">\x02</span><span style="color: #660099; font-weight: bold;">\xa4</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		strange2string <span style="color: #009900;">&#40;</span>rdata<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">5</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> s1<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		strange2string <span style="color: #009900;">&#40;</span>rdata<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> s2<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #993333;">char</span> tm<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">6</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		sprintf <span style="color: #009900;">&#40;</span>tm<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;%s:%s&quot;</span><span style="color: #339933;">,</span> s1<span style="color: #339933;">,</span> s2<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #993333;">int</span> i<span style="color: #339933;">,</span> j<span style="color: #339933;">;</span>
		<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i<span style="color: #339933;">=</span><span style="color: #0000dd;">8</span><span style="color: #339933;">;</span> i<span style="color: #339933;">&lt;</span>rv<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			tdata<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">-</span><span style="color: #0000dd;">8</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> rdata<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		j <span style="color: #339933;">=</span> rv<span style="color: #339933;">-</span><span style="color: #0000dd;">8</span><span style="color: #339933;">;</span>
&nbsp;
		rv <span style="color: #339933;">=</span> sendData <span style="color: #009900;">&#40;</span>hdl<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;<span style="color: #660099; font-weight: bold;">\xa1</span><span style="color: #660099; font-weight: bold;">\x01</span><span style="color: #660099; font-weight: bold;">\x00</span><span style="color: #660099; font-weight: bold;">\x04</span><span style="color: #660099; font-weight: bold;">\xa6</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		strange2string <span style="color: #009900;">&#40;</span>rdata<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">7</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> s1<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		strange2string <span style="color: #009900;">&#40;</span>rdata<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">8</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> s2<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		strange2string <span style="color: #009900;">&#40;</span>rdata<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">9</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> s3<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000066;">printf</span> <span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;N%i training started at %s/%s/20%s %s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> loop<span style="color: #339933;">,</span> s1<span style="color: #339933;">,</span> s2<span style="color: #339933;">,</span> s3<span style="color: #339933;">,</span> tm<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i<span style="color: #339933;">&lt;</span>j<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000066;">printf</span> <span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;N%i minute %i, rate %i<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> loop<span style="color: #339933;">,</span> i<span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span><span style="color: #009900;">&#41;</span>tdata<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		rv <span style="color: #339933;">=</span> sendData <span style="color: #009900;">&#40;</span>hdl<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;<span style="color: #660099; font-weight: bold;">\xa1</span><span style="color: #660099; font-weight: bold;">\x01</span><span style="color: #660099; font-weight: bold;">\x00</span><span style="color: #660099; font-weight: bold;">\x06</span><span style="color: #660099; font-weight: bold;">\xa8</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		loop <span style="color: #339933;">++;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
usb_dev_handle <span style="color: #339933;">*</span>open_device <span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> usb_device <span style="color: #339933;">*</span>dev<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	usb_dev_handle <span style="color: #339933;">*</span>hdl<span style="color: #339933;">;</span>
&nbsp;
	hdl <span style="color: #339933;">=</span> usb_open <span style="color: #009900;">&#40;</span>dev<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #993333;">int</span> open_status <span style="color: #339933;">=</span> usb_set_configuration <span style="color: #009900;">&#40;</span>hdl<span style="color: #339933;">,</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	open_status <span style="color: #339933;">=</span> usb_claim_interface <span style="color: #009900;">&#40;</span>hdl<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	open_status <span style="color: #339933;">=</span> usb_set_altinterface <span style="color: #009900;">&#40;</span>hdl<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	usb_control_msg<span style="color: #009900;">&#40;</span>hdl<span style="color: #339933;">,</span> <span style="color: #208080;">0x40</span><span style="color: #339933;">,</span> <span style="color: #208080;">0x0c</span><span style="color: #339933;">,</span> <span style="color: #208080;">0x5003</span><span style="color: #339933;">,</span> <span style="color: #208080;">0x00f0</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;<span style="color: #660099; font-weight: bold;">\x10</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">1000</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
	usb_control_msg<span style="color: #009900;">&#40;</span>hdl<span style="color: #339933;">,</span> <span style="color: #208080;">0x40</span><span style="color: #339933;">,</span> <span style="color: #208080;">0x0c</span><span style="color: #339933;">,</span> <span style="color: #208080;">0x5003</span><span style="color: #339933;">,</span> <span style="color: #208080;">0xffff</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;<span style="color: #660099; font-weight: bold;">\xd0</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">1000</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
&nbsp;
	<span style="color: #b1b100;">return</span> hdl<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> close_device <span style="color: #009900;">&#40;</span>usb_dev_handle <span style="color: #339933;">*</span>hdl<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>usb_close <span style="color: #009900;">&#40;</span>hdl<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		perr <span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Cannot close USB device!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> readData <span style="color: #009900;">&#40;</span>usb_dev_handle <span style="color: #339933;">*</span>hdl<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	sendData <span style="color: #009900;">&#40;</span>hdl<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;<span style="color: #660099; font-weight: bold;">\x91</span><span style="color: #660099; font-weight: bold;">\x01</span><span style="color: #660099; font-weight: bold;">\x00</span><span style="color: #660099; font-weight: bold;">\x01</span><span style="color: #660099; font-weight: bold;">\x93</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	sendData <span style="color: #009900;">&#40;</span>hdl<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;<span style="color: #660099; font-weight: bold;">\xa1</span><span style="color: #660099; font-weight: bold;">\x01</span><span style="color: #660099; font-weight: bold;">\x00</span><span style="color: #660099; font-weight: bold;">\x01</span><span style="color: #660099; font-weight: bold;">\xa3</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	readLoop <span style="color: #009900;">&#40;</span>hdl<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> deleteData <span style="color: #009900;">&#40;</span>usb_dev_handle <span style="color: #339933;">*</span>hdl<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	usb_control_msg<span style="color: #009900;">&#40;</span>hdl<span style="color: #339933;">,</span> <span style="color: #208080;">0xc0</span><span style="color: #339933;">,</span> <span style="color: #208080;">0x04</span><span style="color: #339933;">,</span> <span style="color: #208080;">0x500d</span><span style="color: #339933;">,</span> <span style="color: #208080;">0x0000</span><span style="color: #339933;">,</span> rdata<span style="color: #339933;">,</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">2000</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
	sendData <span style="color: #009900;">&#40;</span>hdl<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;<span style="color: #660099; font-weight: bold;">\xa1</span><span style="color: #660099; font-weight: bold;">\x01</span><span style="color: #660099; font-weight: bold;">\x00</span><span style="color: #660099; font-weight: bold;">\x00</span><span style="color: #660099; font-weight: bold;">\xa2</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> main <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> argc<span style="color: #339933;">,</span> <span style="color: #993333;">char</span><span style="color: #339933;">**</span> argv<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">struct</span> usb_device <span style="color: #339933;">*</span>dev<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>argc <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		perr <span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Should be called with one argument: 'read' or 'delete'<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>dev <span style="color: #339933;">=</span> findDev<span style="color: #009900;">&#40;</span><span style="color: #208080;">0x0e6a</span><span style="color: #339933;">,</span> <span style="color: #208080;">0x0101</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> NULL<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			perr <span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Waiting for device...<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		usleep <span style="color: #009900;">&#40;</span><span style="color: #0000dd;">300000</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	usb_dev_handle <span style="color: #339933;">*</span>hdl <span style="color: #339933;">=</span> open_device <span style="color: #009900;">&#40;</span>dev<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>strcmp<span style="color: #009900;">&#40;</span>argv<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;read&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		readData <span style="color: #009900;">&#40;</span>hdl<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>strcmp<span style="color: #009900;">&#40;</span>argv<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;delete&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		deleteData <span style="color: #009900;">&#40;</span>hdl<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
		perr <span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Invalid command line argument.<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	close_device <span style="color: #009900;">&#40;</span>hdl<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Ну и стандартная отмазка: последний раз в руки брал Цэ в 2002-м году, так что за кривоту извиняйте.</p>
<p>Update: сходил в воскресенье на лыжах через Байкал. Пример представления данных в GNUplot:</p>
<p><img src="http://john.5070.info/wp-content/uploads/2008/03/heart_rate.png" alt="Переезд-Слюдянка: мой пульс" /></p>
]]></content:encoded>
			<wfw:commentRss>http://john.5070.info/2008/03/reverse-engineering-%d1%81%d0%b5%d1%80%d0%b4%d0%b5%d1%87%d0%bd%d0%be%d0%b3%d0%be-%d1%80%d0%b8%d1%82%d0%bc%d0%b0/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
