zynq_7010/Sensor.h

65 lines
1.5 KiB
C++

#pragma once
#include "Gpio.h"
#include <thread>
#include <condition_variable>
#include "BlockingQueue.h"
#include "FsmState.h"
#include "Pwm.h"
class Sensor
{
public:
Sensor(BlockingQueue<ScanEvent>& sysEvents);
~Sensor();
void enableDoubleSensor(bool enable) {
doubleEnablePin.setValue((Gpio::GpioLevel)enable);
}
void resetPaperPin();
//是否扫描仪盖关上
bool isCoverClosed();
//是否纸张准备好
bool isPaperStandby();
//扫描时是否有纸张
bool isPaperAtScan();
//是否双张
bool isDoublePaper();
//等纸进来
bool waitPaperIn(int timeout_ms);
//等纸出去
bool waitPaperOut(int timeout_ms);
//纸在里面吗
bool isPaperIn(){return scanPin.getValue();}
//等纸,待命
bool waitPaperStandBy(int timeout_ms);
//取消等待纸张
void cancelWaitPaper();
private:
Gpio coverPin; //开盖
Gpio paperPin; //有无纸
Gpio scanPin; //扫描传感器
Gpio double_out0_Pin;
Gpio double_out1_Pin;
Gpio doubleEnablePin;
Gpio sensor_power;
Pwm pwm2;
BlockingQueue<ScanEvent>& events;
std::mutex cv_m;
std::condition_variable cv_cover_opened;
std::condition_variable cv_cover_closed;
std::condition_variable cv_paper_on;
std::condition_variable cv_paper_off;
std::condition_variable cv_scan_at;
std::condition_variable cv_scan_not_at;
std::condition_variable cv_double;
std::thread thread_monitor;
std::thread thread_monitor2;
volatile bool bMonitor = true;
volatile bool bMonitor2 = true;
void monitor();
void monitor2();
};