⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 barcodereader.cpp

📁 一个基于BREW上的WEB service程序,通过扫描图书的条形码,登陆WEB站点,利用SOAP-RPC来查询图书信息.
💻 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 + -