Files
safe_numerics/examples/example91.cpp
Robert Ramey 29cf7f3d12 progress on example 93 to demonstrate trapping all potential exceptions at compile time
removed constexpr from exception policies.
  this eliminates obstacle to gcc compilation which doesn't support constexpr throw
  unfortunately, all versions of gcc trip compiler fault so gcc not supported for now
safe_literal - make this an unsafe type since it doesn't have policies - this might change in the future
2016-01-11 11:01:15 -08:00

90 lines
2.4 KiB
C++

//////////////////////////////////////////////////////////////////
// example91.cpp
//
// Copyright (c) 2015 Robert Ramey
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#include <iostream>
#include <limits>
#include "../include/cpp.hpp"
#include "../include/automatic.hpp"
#include "../include/exception.hpp"
#include "../include/safe_integer.hpp"
#include "../include/safe_range.hpp"
#include "../include/safe_literal.hpp"
// use same type promotion as used by the pic compiler
// see the following comment in motor.c
// Types: int8,int16,int32=8,16,32bit integers, unsigned by default
using pic16_promotion = boost::numeric::cpp<
8, // char
8, // short
8, // int
16, // long
32 // long long
>;
// define safe types used desktop version of the program. In conjunction
// with the promotion policy above, this will permit us to guarantee that
// the resulting program will be free of arithmetic errors introduced by
// C expression syntax and type promotion with no runtime penalty
template <typename T> // T is char, int, etc data type
using safe_t = boost::numeric::safe<
T,
pic16_promotion,
boost::numeric::throw_exception // use for compiling and running tests
>;
using safe_bool_t = boost::numeric::safe_unsigned_range<
0,
1,
pic16_promotion,
boost::numeric::throw_exception // use for compiling and running tests
>;
#define DESKTOP
#include "motor1.c"
#include <chrono>
#include <thread>
int main(){
std::cout << "start test\n";
try{
initialize();
motor_run(100);
do{
std::this_thread::sleep_for(std::chrono::microseconds(ccpr));
isr_motor_step();
}while (run_flg);
// move motor to position 1000
motor_run(1000);
do{
std::this_thread::sleep_for(std::chrono::microseconds(ccpr));
isr_motor_step();
}while (run_flg);
// move back to position 0
motor_run(0);
do{
std::this_thread::sleep_for(std::chrono::microseconds(ccpr));
isr_motor_step();
}while (run_flg);
}
catch(std::exception & e){
std::cout << e.what() << '\n';
// we expect to trap an exception
return 0;
}
catch(...){
std::cout << "test interrupted\n";
return 1;
}
std::cout << "end test\n";
return 1;
}