Line data Source code
1 : /** \file zaberUtils.hpp
2 : * \brief utilties for working with zaber stages
3 : *
4 : * \ingroup zaberLowLevel_files
5 : */
6 :
7 : #ifndef zaberUtils_hpp
8 : #define zaberUtils_hpp
9 :
10 : #include <iostream>
11 :
12 :
13 : #define ZUTILS_E_NOAT (-100)
14 : #define ZUTILS_E_NOSP (-101)
15 : #define ZUTILS_E_BADADD (-102)
16 : #define ZUTILS_E_SERIALSIZE (-103)
17 :
18 : namespace MagAOX
19 : {
20 : namespace app
21 : {
22 :
23 : /// Parse the system.serial query
24 : /**
25 : * \returns 0 on success
26 : * \returns \<0 on error with error code primarily meant for unit testing
27 : *
28 : * \ingroup zaberLowLevel
29 : */
30 1 : int parseSystemSerial( std::vector<int> & address,
31 : std::vector<std::string> & serial,
32 : const std::string & response
33 : )
34 : {
35 1 : size_t at = response.find('@', 0);
36 :
37 1 : if(at == std::string::npos)
38 : {
39 0 : return ZUTILS_E_NOAT;
40 : }
41 :
42 4 : while(at != std::string::npos)
43 : {
44 3 : size_t sp = response.find(' ', at);
45 :
46 3 : if(sp == std::string::npos)
47 : {
48 0 : return ZUTILS_E_NOSP;
49 : }
50 :
51 3 : if(sp-at != 3 ) //Address should be 2 characters
52 : {
53 0 : return ZUTILS_E_BADADD;
54 : }
55 :
56 3 : int add = std::stoi( response.substr(at+1, sp-at-1));
57 :
58 3 : address.push_back(add);
59 :
60 3 : at = response.find('@', at+1);
61 :
62 3 : sp = response.rfind(' ', at);
63 3 : size_t ed = response.find_first_of("\n@", sp);
64 3 : if(ed == std::string::npos) ed = response.size();
65 :
66 3 : if(ed-sp-1 > 6)
67 : {
68 0 : return ZUTILS_E_SERIALSIZE;
69 : }
70 :
71 3 : std::string ser = response.substr(sp+1, ed - sp-1);
72 :
73 3 : serial.push_back(ser);
74 3 : }
75 :
76 1 : return 0;
77 : }
78 :
79 : } //namespace app
80 : } //namespace MagAOX
81 :
82 : #endif //zaberUtils_hpp
|