키보드로 입력할 때에는
메시지는 WM_KEYDOWN / WM_KEYUP 와 버츄얼 키는 VK_RETURN이 입력된다.

하지만 바코드로 입력할 때에는
메시지는 WM_CHAR / 버츄얼 키는 VK_RETURN 이 입력된다.


어떤 차이로 인해서 이렇게 다르게 인식을 하는지는 모르겠다...

[참고 : http://msdn.microsoft.com/en-us/library/ms646267(VS.85).aspx]
[참고 : http://web.lge.cn:8000/system/api/1241/page/3]

'모종의 음모 > 바코드 리더' 카테고리의 다른 글

바코드 리더 관련 프로그래밍 힌트  (0) 2009.06.22
바코드 폰트 (code 39)  (0) 2009.06.15
barcode reader - PS/2 type  (2) 2009.06.12
Posted by 구차니
Download the Code 39 truetype font package.
다운로드는 위에 링크를 클릭해주세요

Tips for Using the Barcode Font

  • Be sure to add an asterisk * character before and after your text. Example *YOURTEXTHERE*
  • Microsoft Word may adjust the character spacing and make the barcode unreadable. You may have more luck with Wordpad, found in the Windows Start Menu under Programs > Accessories.


폰트를 다운로드 받으면 두개가 나오는데, Free 3 of 9 Extended알파벳까지 적용된 폰트이다.
위에 빨간색 했듯이, 반드시 문자열 앞뒤로 *를 쳐주어야 한다.

개인적으로 16 사이즈로 출력해서 사용중
(작아 보인다고 32 포인트 했더니 스캐너가 인식 못하는 불상사가 -ㅁ-!)

[링크 : http://www.barcodesinc.com/free-barcode-font/]
Posted by 구차니
Posted by 구차니
LS1004-I100 이라는 모델의 PS/2 타입 바코드 핸드 스캐너를 사용할 일이 생겨서 데이터 시트를 찾는데..
영 안나온다.. OTL(요즘 따라 왜케 안나오는 일만 하는거지 .. OTL)

일단 데이터 포맷을 알아야 하기에 찾아봐도 안나오고
그냥 무책임하게 키보드 처럼 읽으면 되요~ 라고 하는 센스 ㄱ-

아무튼! 메모장과 frhed를 동원해서 캡쳐를 해보니

시리얼 넘버+ 엔터 + 엔터 이런식으로 날아 온다.
0x0D 0x0A 가 CR/LF 로 엔터 부분이고(DOS 타입인가..)


CR/LF 가 두번 있으니, 메모장 상에서는 엔터 두번 친것 처럼 한번 띄워진다.
(엔터 한번에 다음줄, 또 한번에 다음줄 이니 실질적으로 한줄의 공백이 생긴다.)


문제는, 일부 프로그램에서 Ctrl-A, Ctrl-M 단축키가 지정되어 있을 경우
전부 선택후 엔터, 전부 선택후 엔터로 인식을 하므로 아무런 문장도 입력되지 않을 수 있다.
(네이트온의 경우 Ctrl-M으로 인해 미니대화/일반대화 오가면서 데이터 소실)

0.01mg 정도의 도움을 준 문서
[PDF] Built-in Laser Barcode Scanner PROGRAMMING MANUAL
Klaser Series에 대한 메뉴얼이다. 바코드만 잔뜩 -ㅁ-! (아마 설정 바꾸는데 사용하는 것 같다.)

1088kb...pdf LS1004 User-Programmer Manual
[링크 : http://www.iepos.com/support/symbol-manuals.htm]


Posted by 구차니
HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM

의 내용을 enumrate 하면 된다는데..
아무튼 아래 링크의 프로젝트는 .net에서 생성된 c++ 기반 프로그램인 듯 하다.

[링크 : http://www.naughter.com/enumser.html]
[링크 : http://forum.sysinternals.com/forum_posts.asp?TID=4544]




다른 방법
그냥 for문으로 뱅글뱅글 open하고 open 되면 close 하고
open 안되면 패스하면 되고~ 생각대로 하면되고~ 응?
단, 일부 시리얼(USB)의 경우에는 10번대 까지 점프하니
넉넉하게 포트는 20번 정도 까지 해주는 센스?



2010.02.03 추가


Posted by 구차니
모종의 음모/Notepad22009. 5. 8. 13:22


간만에 백신을 돌려보았더니
notepad2를 실행하는 부분의 레지스트리가 바이러스로 검출이 되도록 패턴이 수정되었다.


...
어떻게 피해가야 하나 -ㅁ-?
Posted by 구차니
알파벳과 유사한것들이 있기에 VFD의 CGRAM을 이용하여 제한된 문자열 내에서
여러나라말을 지원해야 할 경우가 생겨 잠시 노가다를...

일단 A B E K H O ... 이러한 것들은 알파벳과 유사하게 생겼고,
제한된 크기인 5x7 에서 표시 할 수 없으므로(혹은 식별이 힘든 문자들이므로)
알파벳과 동일하게 사용한다면 상당히 문자의 갯수를 줄일 수 있다.

목표치는 총 64개에 러시아어를 출력할 수 있도록 맵핑을 해야 하므로
96개중 32개(대소문자 포함한다면 각 문자별 16개)의 문자를 제외하면 된다.

А В Е К М Н О Р С Т У Х Ѕ І Ј
а в е к м н о р с т у х ѕ і ј

총 30개의 알파벳과 유사하게 생긴 러시아어이다.
테이블의 총 92개의 문자중에 30개 제외 되므로 64보다 작은 62개가 된다.


iso8859 cyrillic used character
1 А 0x0410
33 а 0x0430
 


 

2 Б 0x0411
34 б 0x0431
65 Ё 0x0401
79 ё 0x0451
3 В 0x0412
35 в 0x0432
66 Ђ 0x0402
80 ђ 0x0452
4 Г 0x0413
36 г 0x0433
67 Ѓ 0x0403
81 ѓ 0x0453
5 Д 0x0414
37 д 0x0434
68 Є 0x0404
82 є 0x0454
6 Е 0x0415
38 е 0x0435
69 Ѕ 0x0405
83 ѕ 0x0455
7 Ж 0x0416
39 ж 0x0436
70 І 0x0406
84 і 0x0456
8 З 0x0417
40 з 0x0437
71 Ї 0x0407
85 ї 0x0457
9 И 0x0418
41 и 0x0438
72 Ј 0x0408
86 ј 0x0458
10 Й 0x0419
42 й 0x0439
73 Љ 0x0409
87 љ 0x0459
11 К 0x041A
43 к 0x043A
74 Њ 0x040A
88 њ 0x045A
12 Л 0x041B
44 л 0x043B
75 Ћ 0x040B
89 ћ 0x045B
13 М 0x041C
45 м 0x043C
76 Ќ 0x040C
90 ќ 0x045C
14 Н 0x041D
46 н 0x043D
 


 

15 О 0x041E
47 о 0x043E
77 Ў 0x040E
91 ў 0x045E
16 П 0x041F
48 п 0x043F
78 Џ 0x040F
92 џ 0x045F
17 Р 0x0420
49 р 0x0440







18 С 0x0421
50 с 0x0441







19 Т 0x0422
51 т 0x0442







20 У 0x0423
52 у 0x0443







21 Ф 0x0424
53 ф 0x0444







22 Х 0x0425
54 х 0x0445







23 Ц 0x0426
55 ц 0x0446







24 Ч 0x0427
56 ч 0x0447







25 Ш 0x0428
57 ш 0x0448







26 Щ 0x0429
58 щ 0x0449







27 Ъ 0x042A
59 ъ 0x044A







28 Ы 0x042B
60 ы 0x044B







29 Ь 0x042C
61 ь 0x044C







30 Э 0x042D
62 э 0x044D







31 Ю 0x042E
63 ю 0x044E







32 Я 0x042F
64 я 0x044F










Posted by 구차니
typedef struct 
{
	WORD wFormatTag;
	WORD  nChannels;
	DWORD nSamplesPerSec;
	DWORD nAvgBytesPerSec;
	WORD  nBlockAlign;
	WORD  wBitsPerSample;
	WORD  cbSize;
} WAVEFORMATEX;

wFormatTag

Waveform-audio format type. Format tags are registered with Microsoft Corporation for many compression algorithms. A complete list of format tags can be found in the Mmreg.h header file. For one- or two-channel PCM data, this value should be WAVE_FORMAT_PCM. When this structure is included in a WAVEFORMATEXTENSIBLE structure, this value must be WAVE_FORMAT_EXTENSIBLE.


nChannels

Number of channels in the waveform-audio data. Monaural data uses one channel and stereo data uses two channels.


nSamplesPerSec

Sample rate, in samples per second (hertz). If wFormatTag is WAVE_FORMAT_PCM, then common values for nSamplesPerSec are 8.0 kHz, 11.025 kHz, 22.05 kHz, and 44.1 kHz. For non-PCM formats, this member must be computed according to the manufacturer's specification of the format tag.


nAvgBytesPerSec

Required average data-transfer rate, in bytes per second, for the format tag. If wFormatTag is WAVE_FORMAT_PCM, nAvgBytesPerSec should be equal to the product of nSamplesPerSec and nBlockAlign. For non-PCM formats, this member must be computed according to the manufacturer's specification of the format tag.


nBlockAlign

Block alignment, in bytes. The block alignment is the minimum atomic unit of data for the wFormatTag format type. If wFormatTag is WAVE_FORMAT_PCM or WAVE_FORMAT_EXTENSIBLE, nBlockAlign must be equal to the product of nChannels and wBitsPerSample divided by 8 (bits per byte). For non-PCM formats, this member must be computed according to the manufacturer's specification of the format tag.

Software must process a multiple of nBlockAlign bytes of data at a time. Data written to and read from a device must always start at the beginning of a block. For example, it is illegal to start playback of PCM data in the middle of a sample (that is, on a non-block-aligned boundary).


wBitsPerSample

Bits per sample for the wFormatTag format type. If wFormatTag is WAVE_FORMAT_PCM, then wBitsPerSample should be equal to 8 or 16. For non-PCM formats, this member must be set according to the manufacturer's specification of the format tag. If wFormatTag is WAVE_FORMAT_EXTENSIBLE, this value can be any integer multiple of 8 and represents the container size, not necessarily the sample size; for example, a 20-bit sample size is in a 24-bit container. Some compression schemes cannot define a value for wBitsPerSample, so this member can be 0.


cbSize

Size, in bytes, of extra format information appended to the end of the WAVEFORMATEX structure. This information can be used by non-PCM formats to store extra attributes for the wFormatTag. If no extra information is required by the wFormatTag, this member must be set to 0. For WAVE_FORMAT_PCM formats (and only WAVE_FORMAT_PCM formats), this member is ignored. When this structure is included in a WAVEFORMATEXTENSIBLE structure, this value must be at least 22.


Remarks

An example of a format that uses extra information is the Microsoft Adaptive Delta Pulse Code Modulation (MS-ADPCM) format. The wFormatTag for MS-ADPCM is WAVE_FORMAT_ADPCM. The cbSize member will typically be set to 32. The extra information stored for WAVE_FORMAT_ADPCM is coefficient pairs required for encoding and decoding the waveform-audio data.



[링크 : http://msdn.microsoft.com/en-us/library/ms713497(VS.85).aspx]

'모종의 음모 > noise cancelling' 카테고리의 다른 글

WAVE format  (0) 2009.08.12
Active Noise Control - ANC  (0) 2009.08.12
음속  (0) 2009.03.30
waveInOpen() waveOutOpen()  (0) 2009.03.26
sampling rate 관련 의문  (2) 2009.03.26
Posted by 구차니
소리의 속도로 항상 고정된 값이 아닌 매질의 영향을 받는다.
1기압, 0도 에서 331.5m/s 이고 1도당 0.6m/s 증가


[링크  : http://enc.daum.net/dic100/contents.do?query1=b17a2486a]




뜬금없이 이녀석이 왜 있냐면은~!
sampling시에는 샘플링이 완료 된 후 데이터가 넘겨지기 때문에,
과거 시점의 파장이 녹음되어 있게 된다. 그렇기에 빛의 속도에 근접하게 전송되는 전기신호에 의해서
처리속도, sampling 속도 등을 감안해서 어느정도 거리에서 출력을 해주는 약간의 보정이 필요 하지 않을까? 라는
생각이 들어서 찾아 본것이다. (머 그렇다고 -ㅁ-)


44050Hz(=44kHz)에서 샘플링시 1회 샘플링 할 동안 소리가 진행하는 거리

1/44050*331.5(m) = 0.0075255391600454029511918274687855m
7.5255391600454029511918274687855mm >= 7.52mm

만약
플레이시에 딜레이가 없고,
반대파장을 만들어 내는데 시간이 걸리지 않는다고 가정하고,
전기가 흐르는 속도가 무한대라서 전파속도가 0라고 가정하고,
순수하게 녹음에 대한 딜레이만 존재한다고 할 때 스피커와 마이크는 대략 1cm 정도의 간격이 필요 하다
(다르게 말하면, 변환에 필요한 시간, 신호전달 시간을 감안하면 1cm 이상의 거리를 벌려놔야지
반대파장으로 소리가 중화될 수 있을 것으로 보인다)

'모종의 음모 > noise cancelling' 카테고리의 다른 글

Active Noise Control - ANC  (0) 2009.08.12
WAVEFORMATEX structure  (0) 2009.04.01
waveInOpen() waveOutOpen()  (0) 2009.03.26
sampling rate 관련 의문  (2) 2009.03.26
wav format 관련 문서  (0) 2009.03.26
Posted by 구차니
300번째 글 기념(응?)
완전 날로먹는 Bitmap 구조 분석하기 입니다 ^^;
Visual Studio C++ 6.0 프로젝트이며, 헤더만 있다면 다른 플랫폼도 이식 가능할 듯 합니다.


알림 : 네이버 블로그 / 구차니의 잡동사니 모음에서 같은 거 있는데! 라고 하시면..
        동일 인물입니다라고 밖에 답변을 해드릴게 없습니다 -ㅁ-!

typedef struct tagBITMAPFILEHEADER
{
  WORD  bfType;
  DWORD bfSize;
  WORD  bfReserved1;
  WORD  bfReserved2;
  DWORD bfOffBits;
} BITMAPFILEHEADER,  *PBITMAPFILEHEADER;
WORD bfType;          // 위의 첫 바이트 BM 으로 Bitmap 이라는 의미를 지닌 헤더
DWORD bfSize;         // 0x00075736 = 481078 bytes, 파일 전체 크기(헤더 포함한 전체 파일)
WORD bfReserved1;  // 0x0000 으로 사용하지 않는 부분
WORD bfReserved2;  // 0x0000 으로 사용하지 않는 부분
DWORD bfOffBits;      // 현재 위치로부터 실제 데이터가 존재하는 곳 까지의 거리

bfOffBits는 약간의 설명이 필요하다. 일단 256색상 이하의 비트맵은 indexed color 방식으로
팔레트를 이용하게 된다. 팔레트 이후에는 1pixel = 1byte로 연결된 인덱스들이 나열되어 있다.
그런 이유로, 팔레트에 저장된 색상의 갯수가 다르거나, 팔레트를 사용하지 않는다면 이 값은 상당히 다른 값을 보이게 된다.
자세한 내용은 아래의 팔레트를 참고하면 된다.

typedef struct tagBITMAPINFO { BITMAPINFOHEADER bmiHeader; RGBQUAD bmiColors[1]; } BITMAPINFO, *PBITMAPINFO;
256 색 이하의 이미지라면, RGBQUAD는 팔레트로 사용되고,
16bit 이상의 이미지라면 이 내용에 바로 pixel별 색상이 들어간다.

typedef struct tagBITMAPINFOHEADER
{
  DWORD biSize;
  LONG  biWidth;
  LONG  biHeight;
  WORD  biPlanes;
  WORD  biBitCount;
  DWORD biCompression;
  DWORD biSizeImage;
  LONG  biXPelsPerMeter;
  LONG  biYPelsPerMeter;
  DWORD biClrUsed;
  DWORD biClrImportant;
} BITMAPINFOHEADER,  *PBITMAPINFOHEADER;
DWORD biSize;                      // BITMAPINFO 헤더의 크기
LONG  biWidth;                      // 이미지의 넓이(화면상에 보이는 크기)
LONG  biHeight;                     // 이미지의 높이(화면상에 보이는 크기)
WORD  biPlanes;                    // 이미지의 장수(bitmap은 layer가 존재하지 않으므로 항상 1)
WORD  biBitCount;                  // 한 픽셀의 컬러 비트수(256컬러는 2^8 이므로 8이 표기됨)
DWORD biCompression;          // 비트맵이 압축이 되었는지 어떠한 방식으로 압축이 되었는지 표시
DWORD biSizeImage;
LONG  biXPelsPerMeter;
LONG  biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;

typedef struct tagRGBQUAD
{
  BYTE rgbBlue;
  BYTE rgbGreen;
  BYTE rgbRed;
  BYTE rgbReserved;
} RGBQUAD;

BYTE rgbBlue;            // RGB 중 파랑(Blue)에 대한 값
BYTE rgbGreen;          // RGB 중 녹색(Green)에 대한 값
BYTE rgbRed;             // RGB 중 빨강(Red)에 대한 값
BYTE rgbReserved;     // 사용하지 않음

---------------------------------------------------------------------------------------------------
1.
bitmap은 단순하게, 하나의 pixel에 대한 RGB 정보나 index 정보를 이용하여 이미지를 표시한다.
pixelPicture Element의 약자이며, 우리가 말하는 점 하나를 의미한다.

2.
비트맵은 4사분면을 기준 좌표로 사용하며,
좌상단이 (0.0)이다. 하지만 pc에서는 1사분면을 기준 좌표로 사용하므로 우하단이 (0,0)이다.
그런 이유로, 좌표대로 출력을 하면 비트맵은 상하가 뒤집힌 채로 나오게 된다.
(다르게 말하면, 저장시에 데이터는 상하가 뒤집힌 채로 저장되어 있다)

3.
비트맵은 특정 크기의 데이터를 한번에 전송하기 위해 DMA(Direct Memory Access)나 BLIT(Bit-Block Transfer)를
사용한다. 그런 이유로 특정 블럭을 맞추어 주어야 하고, 그렇기 때문에 이미지는 byte align이나 DWORD align
사용하게 된다(DWORD = 4bytes = 64bit) 이 방법은 몇 비트 이미지냐에 따라 달라지게 되는데,
기본적으로는 4byte align을 맞춰준다.

4.
256색 미만의 비트맵은 팔레트라는 것을 사용한다. (팔레트는 RGBQUAD 구조체 사용)
이러한 팔레트는 8bit로 표현이 가능하므로, 256가지의 색상을 팔레트로 주로 사용가능하다.
예를 들어

이러한 팔레트를 만들고, 번호만으로 각 픽셀별로 색상을 지정해준다. 그렇다면 상당한 저장 공간을 아낄 수 있다.
그런 이유로, 팔레트를 사용하는 경우에는 팔레트를 Lookup(참조) 하여 변환을 해야하는 작업이 추가되게 된다.
grayscale의 경우에는 256color RGBQUAD 구조체
팔레트가 없을 경우(jpeg 변환등) for(i=0;i<256;i++) ; 을 이용하여 생성하면 된다.

5.
이유는 모르겠지만, 24bit 비트맵의 경우는 RGBQUAD가 아닌 RGBTRIPLE이라는 구조를 사용한다.

6. 정리를 하자면
1bit - RGBQUAD 팔레트 2개 / 1byte = 8 pixel / 1byte align 4byte align(2009.10.12 windows 그림판 확인)
2bit -
RGBQUAD 팔레트 4개 / 1byte = 4 pixel / 1byte align
4bit - RGBQUAD 팔레트 16개 / 1byte = 2 pixel / 1byte align
8bit - RGBQUAD 팔레트 256개 / 1byte = 1 pixel / 4byte align
16bit - RGBTRIPLE / 2byte = 1 pixel / 4byte align
24bit - RGBTRIPLE / 3byte = 1 pixel / 4byte align (width * 3)을 한뒤 align
32bit - RGBQUAD  / 4byte = 1 pixel / 4byte align 픽셀이 이미 4의 배수이므로 align 안해도 상관없음

 BITMAPFILEINFO
 http://msdn.microsoft.com/en-us/library/dd183374(VS.85).aspx
 BITMAPINFO  http://msdn.microsoft.com/ko-kr/library/dd183375(en-us,VS.85).aspx
 BITMAPINFOHEADER  http://msdn.microsoft.com/ko-kr/library/dd183376(en-us,VS.85).aspx
 RGBQUAD  http://msdn.microsoft.com/ko-kr/library/dd162938(en-us,VS.85).aspx

 BITMAPCOREINFO  http://msdn.microsoft.com/en-us/library/dd183373(VS.85).aspx
 BITMAPCOREHEADER  http://msdn.microsoft.com/en-us/library/dd183372(VS.85).aspx
 RGBTRIPLE  http://msdn.microsoft.com/en-us/library/dd162939(VS.85).aspx

'모종의 음모 > Bitmap 조작' 카테고리의 다른 글

원하는 크기안에 꼭 맞는 크기얻기  (0) 2009.06.25
Posted by 구차니