• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //////////////////////////////////////////////////////////////////
2 // example91.cpp
3 //
4 // Copyright (c) 2015 Robert Ramey
5 //
6 // Distributed under the Boost Software License, Version 1.0. (See
7 // accompanying file LICENSE_1_0.txt or copy at
8 // http://www.boost.org/LICENSE_1_0.txt)
9 
10 #include <iostream>
11 #include <limits>
12 
13 #include <boost/safe_numerics/cpp.hpp>
14 #include <boost/safe_numerics/safe_integer.hpp>
15 #include <boost/safe_numerics/safe_integer_range.hpp>
16 
17 // use same type promotion as used by the pic compiler
18 // see the following comment in motor.c
19 // Types: int8,int16,int32=8,16,32bit integers
20 
21 using pic16_promotion = boost::safe_numerics::cpp<
22     8,  // char
23     8,  // short
24     8,  // int
25     16, // long
26     32  // long long
27 >;
28 
29 // define safe types used desktop version of the program.  In conjunction
30 // with the promotion policy above, this will permit us to guarantee that
31 // the resulting program will be free of arithmetic errors introduced by
32 // C expression syntax and type promotion with no runtime penalty
33 template <typename T> // T is char, int, etc data type
34 using safe_t = boost::safe_numerics::safe<
35     T,
36     pic16_promotion,
37     boost::safe_numerics::default_exception_policy // use for compiling and running tests
38 >;
39 using safe_bool_t = boost::safe_numerics::safe_unsigned_range<
40     0,
41     1,
42     pic16_promotion,
43     boost::safe_numerics::default_exception_policy // use for compiling and running tests
44 >;
45 
46 #define DESKTOP
47 #include "motor1.c"
48 
49 #include <chrono>
50 #include <thread>
51 
sleep(int16)52 void sleep(int16){
53     std::this_thread::sleep_for(std::chrono::microseconds(ccpr));
54 }
55 
main()56 int main(){
57     std::cout << "start test\n";
58     try{
59         initialize();
60         motor_run(100);
61         do{
62             isr_motor_step();
63         }while (run_flg);
64 
65         // move motor to position 1000
66         motor_run(1000);
67         do{
68             sleep(ccpr);
69             isr_motor_step();
70         }while (run_flg);
71 
72         // move back to position 0
73         motor_run(0);
74         do{
75             sleep(ccpr);
76             isr_motor_step();
77         }while (run_flg);
78     }
79     catch(std::exception & e){
80         std::cout << e.what() << '\n';
81         // we expect to trap an exception
82         return 0;
83     }
84     catch(...){
85         std::cout << "test interrupted\n";
86         return 1;
87     }
88     std::cout << "end test\n";
89     return 1;
90 }
91