📄 barcodereader.cpp
字号:
#include "BarCodeReader.hpp"
#define BARCODE_READHEIGHT 10
BarCodeReader::BarCodeReader(Void) : _status(CAMERASTATUS_NOT_INITIALIZED), _reference(null), _spp(null)
{
_barcode.SetHeight(BARCODE_READHEIGHT);
}
BarCodeReader::~BarCodeReader(Void)
{
Terminate();
}
/*
Void BarCodeReader::Suspend(Void)
{
if (_status != CAMERASTATUS_NOT_INITIALIZED) {
_camera.Suspend();
}
}
SFCError BarCodeReader::Resume(Void)
{
SFCError result(SFERR_NO_ERROR);
if (_status == CAMERASTATUS_ACTIVE) {
result = _camera.Resume();
if (result == SFERR_NO_ERROR) {
result = _camera.Preview();
}
}
if (_status != CAMERASTATUS_NOT_INITIALIZED && result != SFERR_NO_ERROR) {
_status = CAMERASTATUS_READY;
}
return result;
}
*/
SFCError BarCodeReader::Initialize(SFXRectangleConstRef rect, BarCodeReader::NotifySPP spp, VoidPtr reference)
{
SFCError result(_camera.Initialize(rect, OnCameraSHP, this));
if (result == SFERR_NO_ERROR) {
_previewrect = rect;
_spp = spp;
_reference = reference;
_status = CAMERASTATUS_READY;
}
else {
_spp = null;
_reference = null;
_status = CAMERASTATUS_NOT_INITIALIZED;
}
return result;
}
Void BarCodeReader::OnCameraSHP(SGXCamera::StatusEnum status, SFCError error, VoidPtr reference)
{
BarCodeReaderPtr p(static_cast<BarCodeReaderPtr>(reference));
p->OnCamera(status, error);
}
Void BarCodeReader::OnCamera(SGXCamera::StatusEnum status, SFCError error)
{
unused(error);
if (status == SGXCamera::STATUS_FRAME) {
#ifdef TARGET_ENVIRONMENT_SIMULATOR
static int count = 0;
++count; // 僄儈儏儗乕僞偱偼 25夞偵1夞丄擣幆偵惉岟偟偨傕偺偲傒側偡
if (count % 25 == 0) {
_isbn = "4844319477"; //
_spp(STATUS_GOTBARCODE, _reference);
}
#else
// 嶣塭偝傟偨夋憸傪僶乕僐乕僪偲偟偰庢傝崌偊偢撉傒庢偭偰傒傞
_barcode.Read(_camera.GetBitmap(), (_previewrect.GetHeight() - BARCODE_READHEIGHT) / 2);
//_barcode.Read(_camera.GetBitmap());
if (_barcode.static_catch() == SFERR_NO_ERROR) {
// 僶乕僐乕僪偲偟偰撉傒庢傟偨
if (CheckISBN(_barcode.GetResult())) {
//_camera.Suspend();
//_status = CAMERASTATUS_SUSPEND;
_spp(STATUS_GOTBARCODE, _reference);
}
}
else {
_spp(STATUS_FRAME, _reference);
}
#endif
}
else if (status == SGXCamera::STATUS_STOP) {
_spp(STATUS_STOP, _reference);
}
}
SFXAnsiStringConstRef BarCodeReader::GetCode(Void) const
{
return _isbn;
}
SFBBitmapSmpConstRef BarCodeReader::GetBitmap(Void) const
{
return _camera.GetBitmap();
}
SFCError BarCodeReader::Start(Void)
{
SFCError result(SFERR_NO_ERROR);
if (_status == CAMERASTATUS_NOT_INITIALIZED) {
result = SFERR_FAILED;
}
else if (_status == CAMERASTATUS_SUSPEND) {
result = _camera.Resume();
if (result == SFERR_NO_ERROR) {
_status = CAMERASTATUS_READY;
}
}
if (result == SFERR_NO_ERROR) {
result = _camera.Preview();
if (result == SFERR_NO_ERROR) {
_status = CAMERASTATUS_ACTIVE;
}
else {
_camera.Suspend();
_status = CAMERASTATUS_SUSPEND;
}
}
return result;
}
Void BarCodeReader::Stop(Void)
{
if (_status == CAMERASTATUS_ACTIVE) {
_camera.Suspend();
_status = CAMERASTATUS_SUSPEND;
}
}
Void BarCodeReader::Terminate(Void)
{
if (_status != CAMERASTATUS_NOT_INITIALIZED) {
_camera.Terminate();
_status = CAMERASTATUS_NOT_INITIALIZED;
}
}
BarCodeReader::CameraStatusEnum BarCodeReader::GetCameraStatus(Void) const
{
return _status;
}
Bool BarCodeReader::CheckISBN(SFXAnsiStringConstRef code)
{
SFXAnsiString str1(code.Substring(0, 3));
SFXAnsiString str2(code.Substring(3, 12));
SInt32 i, c, sum(0), x;
if (str1 != "978") {
return false;
}
// ISBN 偺僠僃僢僋 僨僕僢僩偺寁嶼
for (i = 0; i < 9; ++i) {
c = str2[i] - '0';
sum += ((10 - i) * c);
}
x = 11 - (sum % 11);
if (x == 11) {
x = 0;
}
_isbn = str2;
if (x == 10) {
_isbn += 'X';
}
else {
_isbn += static_cast<AChar>(x + '0');
}
return true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -