BASIC4MCU | 질문게시판 | 바코드 센서 질문드립니다.
페이지 정보
작성자 준빵 작성일2020-04-17 15:23 조회7,154회 댓글3건본문
#include <usbhid.h>
#include <usbhub.h>
#include <hiduniversal.h>
#include <hidboot.h>
#include <SPI.h>
int BS;
class MyParser : public HIDReportParser {
public:
MyParser();
void Parse(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf);
protected:
uint8_t KeyToAscii(bool upper, uint8_t mod, uint8_t key);
virtual void OnKeyScanned(bool upper, uint8_t mod, uint8_t key);
virtual void OnScanFinished();
};
MyParser::MyParser() {}
void MyParser::Parse(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf) {
// If error or empty, return
if (buf[2] == 1 || buf[2] == 0) return;
for (uint8_t i = 7; i >= 2; i--) {
// If empty, skip
if (buf[i] == 0) continue;
// If enter signal emitted, scan finished
if (buf[i] == UHS_HID_BOOT_KEY_ENTER) {
OnScanFinished();
}
// If not, continue normally
else {
// If bit position not in 2, it's uppercase words
OnKeyScanned(i > 2, buf, buf[i]);
}
return;
}
}
uint8_t MyParser::KeyToAscii(bool upper, uint8_t mod, uint8_t key) {
// Letters
if (VALUE_WITHIN(key, 0x04, 0x1d)) {
if (upper) return (key - 4 + 'A');
else return (key - 4 + 'a');;;;;
}
// Numbers
else if (VALUE_WITHIN(key, 0x1e, 0x27)) {
return ((key == UHS_HID_BOOT_KEY_ZERO) ? '0' : key - 0x1e + '1');
}
return 0;
}
void MyParser::OnKeyScanned(bool upper, uint8_t mod, uint8_t key) {
uint8_t ascii = KeyToAscii(upper, mod, key);
Serial.print((char)ascii);
BS=ascii;
}
void MyParser::OnScanFinished() {
Serial.println(" - Finished");
}
USB Usb;
USBHub Hub(&Usb);
HIDUniversal Hid(&Usb);
MyParser Parser;
void setup() {
Serial.begin( 115200 );
if (Usb.Init() == -1) {
Serial.println("OSC did not start.");
}
delay( 200 );
Hid.SetReportParser(0, &Parser);
}
void loop() {
Usb.Task();
}
위 코드가 바코드샘플 코드인데 이렇게 작성하여 동작시키면 버튼을 누를때 한번만 찍히고 계속 누르고있어도 찍히지않습니다.
프로그램상으로 바코드인식을 끊기지않게 계속할수있는 방법이 있을까요??
(마치 대형마트에 가서 계산대에 있는것처럼요)
댓글 3
조회수 7,154master님의 댓글
master 작성일
라이브러리 설치하면 예제가 함께 설치됩니다.
원하는 동작에 가장 가까운 예제를 찾아보시고
만약 원하는 동작이 없다면 라이브러리를 공부해서 수정해서 사용해야 합니다.
그런 경우를 대비해서 라이브러리를 오픈소스로 공개하고 있는 것이죠
준빵님의 댓글
준빵
예제를 가지고 나름 해석해가며 1주일을 보냈는데 답을 못찾았습니다...
on key scanned 부분과 finished부분에 for문을 사용하며 고쳐보았는데 동작이 잘 되지않습니다,,
master님의 댓글
master
일주일로 부족하면 시간을 더 써서 분석하셔야합니다.
완전히 분석해서 이해해야지 수정이 가능하게 됩니다.
//
아두이노 라이브러리 분석은 왕초보자에게는 넘사벽일 수도 있습니다.
분석에 실패 하더라도 분석 경험은 큰 교훈을 알려줄 것입니다.