tx-gxx-linux/device/gxx-linux/testmotorboard/main.cpp

180 lines
4.7 KiB
C++

#include <iostream>
#include <iomanip>
#include <memory>
#include <thread>
#include <chrono>
#include "motorboard.h"
#include "filetools.h"
#include "stringex.hpp"
#include <functional>
#include "uartregsaccess.h"
#include "Gpio.h"
#include "StopWatch.h"
using namespace std;
volatile int done_scan = 0;
int menu()
{
int choice;
cout << " **** Menu **** " << endl
<< endl;
cout << "(1) start." << endl;
cout << "(2) stop. " << endl;
cout << "(3) clear error. " << endl;
cout << "(4) pick paper. " << endl;
cout << "(5) regs list. " << endl;
cout << "(6) scan num. " << endl;
cout << "(7) scan auto" << endl;
cout << "(0) Quit. " << endl
<< endl;
cout << ": ";
cin >> choice;
return choice;
}
int main()
{
FileTools ft("/home/linaro/regs.log");
ft.clear();
MotorBoard mb;
unsigned int val = 0;
//GpioOut gpio(151);
bool exit = false;
int option = 0;
for (;;)
{
option = menu();
switch (option)
{
case 0:
exit = true;
break;
case 1:{
mb.start();
break;
}
case 2:
mb.stop();
break;
case 3:
mb.clear_error();
break;
case 4:
mb.pick_paper();
break;
case 5:
{
for (int i = 0; i < 8; i++)
{
StopWatch sw;
// gpio.setValue(Gpio::Low);
// gpio.setValue(Gpio::High);
if (mb.read(i, val))
{
// gpio.setValue(Gpio::Low);
std::cout << string_format("read : %f\n", sw.elapsed_ms());
std::cout << hex;
std::cout << "reg[0x" << i << "] =0x" << setw(8) << setfill('0') << val << std::endl;
}
else
{
std::cout << "read regs error " << std::endl;
}
}
}
break;
case 6:
// cout << "scan num: " << mb.paper_counter() << endl;
break;
case 7:
{
auto mb_error_call = [&](unsigned int error_code)
{
std::cout << __func__ << " call: error" << std::endl;
done_scan = -1;
mb.stop();
};
auto mb_scandone_call = [&]()
{
std::cout << __func__ << " call: done" << std::endl;
done_scan = 1;
};
auto mb_osmode_call = [&](unsigned int osmode)
{
printf("motorboard callback mb_osmode_call changed");
};
MotorBoardGlue mb_glue = {mb_error_call, mb_scandone_call, mb_osmode_call,nullptr,nullptr,nullptr};
mb.set_callbacks(mb_glue);
done_scan = 0;
mb.start();
mb.set_speed_mode(1);
StopWatch sw;
for (;;)
{
if (mb.wait_paper_out(3000))
{
// std::this_thread::sleep_for(std::chrono::milliseconds(100));
std::cout << __func__ << " call: paper pick" << std::endl;
mb.pick_paper();
sw.reset();
}
else if (done_scan)
{
break;
}
else
{
if (sw.elapsed_s() > 3)
done_scan = -2;
}
}
std::cout << __func__ << " call: exit" << std::endl;
}
break;
case 100:
{
unsigned int vals[2] = {0xaaaaaaaa, 0x55555555};
unsigned int valw;
unsigned int valr;
const unsigned int addr = 7;
std::cout << "start verify" << endl;
// mb.read(addr, valr);
// mb.read(addr, valr);
// mb.read(addr, valr);
// mb.read(addr, valr);
for (int i = 0; i < 1000; i++)
{
valw = vals[i % 2];
mb.write(addr, valw);
// std::this_thread::sleep_for(std::chrono::milliseconds(2));
mb.read(addr, valr);
std::cout << "\r" << i;
std::cout.flush();
if (valw != valr)
ft.append_log(string_format("%d error", i));
else
ft.append_log(string_format("0x%08X:0x%08X", valw, valr));
}
}
break;
default:
cout << "Please select again! " << endl;
break;
}
/* code */
if (exit)
break;
}
cout << "exit munu" << endl;
return 0;
}