1 //
2 // Copyright 2015 Ettus Research LLC
3 // Copyright 2018 Ettus Research, a National Instruments Company
4 //
5 // SPDX-License-Identifier: GPL-3.0-or-later
6 //
7 
8 #include <uhd/types/sensors.h>
9 #include <string.h>
10 #include <stdexcept>
11 #include <string>
12 
uhd_sensor_value_make(uhd_sensor_value_handle * h)13 uhd_error uhd_sensor_value_make(uhd_sensor_value_handle* h)
14 {
15     try {
16         *h = new uhd_sensor_value_t;
17     } catch (...) {
18         return UHD_ERROR_UNKNOWN;
19     }
20 
21     UHD_SAFE_C_SAVE_ERROR(
22         (*h), (*h)->sensor_value_cpp = new uhd::sensor_value_t("", false, "", "");)
23 }
24 
uhd_sensor_value_make_from_bool(uhd_sensor_value_handle * h,const char * name,bool value,const char * utrue,const char * ufalse)25 uhd_error uhd_sensor_value_make_from_bool(uhd_sensor_value_handle* h,
26     const char* name,
27     bool value,
28     const char* utrue,
29     const char* ufalse)
30 {
31     try {
32         *h = new uhd_sensor_value_t;
33     } catch (...) {
34         return UHD_ERROR_UNKNOWN;
35     }
36 
37     UHD_SAFE_C_SAVE_ERROR(
38         (*h),
39         (*h)->sensor_value_cpp = new uhd::sensor_value_t(name, value, utrue, ufalse);)
40 }
41 
uhd_sensor_value_make_from_int(uhd_sensor_value_handle * h,const char * name,int value,const char * unit,const char * formatter)42 uhd_error uhd_sensor_value_make_from_int(uhd_sensor_value_handle* h,
43     const char* name,
44     int value,
45     const char* unit,
46     const char* formatter)
47 {
48     try {
49         *h = new uhd_sensor_value_t;
50     } catch (...) {
51         return UHD_ERROR_UNKNOWN;
52     }
53 
54     UHD_SAFE_C_SAVE_ERROR(
55         (*h), std::string fmt(formatter); if (fmt.empty()) {
56             (*h)->sensor_value_cpp = new uhd::sensor_value_t(name, value, unit);
57         } else {
58             (*h)->sensor_value_cpp = new uhd::sensor_value_t(name, value, unit, fmt);
59         })
60 }
61 
uhd_sensor_value_make_from_realnum(uhd_sensor_value_handle * h,const char * name,double value,const char * unit,const char * formatter)62 uhd_error uhd_sensor_value_make_from_realnum(uhd_sensor_value_handle* h,
63     const char* name,
64     double value,
65     const char* unit,
66     const char* formatter)
67 {
68     try {
69         *h = new uhd_sensor_value_t;
70     } catch (...) {
71         return UHD_ERROR_UNKNOWN;
72     }
73 
74     UHD_SAFE_C_SAVE_ERROR(
75         (*h), std::string fmt(formatter); if (fmt.empty()) {
76             (*h)->sensor_value_cpp = new uhd::sensor_value_t(name, value, unit);
77         } else {
78             (*h)->sensor_value_cpp = new uhd::sensor_value_t(name, value, unit, fmt);
79         })
80 }
81 
uhd_sensor_value_make_from_string(uhd_sensor_value_handle * h,const char * name,const char * value,const char * unit)82 uhd_error uhd_sensor_value_make_from_string(
83     uhd_sensor_value_handle* h, const char* name, const char* value, const char* unit)
84 {
85     try {
86         *h = new uhd_sensor_value_t;
87     } catch (...) {
88         return UHD_ERROR_UNKNOWN;
89     }
90 
91     UHD_SAFE_C_SAVE_ERROR(
92         (*h), (*h)->sensor_value_cpp = new uhd::sensor_value_t(name, value, unit);)
93 }
94 
uhd_sensor_value_free(uhd_sensor_value_handle * h)95 uhd_error uhd_sensor_value_free(uhd_sensor_value_handle* h)
96 {
97     UHD_SAFE_C(delete (*h)->sensor_value_cpp; delete *h; *h = NULL;)
98 }
99 
uhd_sensor_value_to_bool(uhd_sensor_value_handle h,bool * value_out)100 uhd_error uhd_sensor_value_to_bool(uhd_sensor_value_handle h, bool* value_out)
101 {
102     UHD_SAFE_C_SAVE_ERROR(h, *value_out = h->sensor_value_cpp->to_bool();)
103 }
104 
uhd_sensor_value_to_int(uhd_sensor_value_handle h,int * value_out)105 uhd_error uhd_sensor_value_to_int(uhd_sensor_value_handle h, int* value_out)
106 {
107     UHD_SAFE_C_SAVE_ERROR(h, *value_out = h->sensor_value_cpp->to_int();)
108 }
109 
uhd_sensor_value_to_realnum(uhd_sensor_value_handle h,double * value_out)110 uhd_error uhd_sensor_value_to_realnum(uhd_sensor_value_handle h, double* value_out)
111 {
112     UHD_SAFE_C_SAVE_ERROR(h, *value_out = h->sensor_value_cpp->to_real();)
113 }
114 
uhd_sensor_value_name(uhd_sensor_value_handle h,char * name_out,size_t strbuffer_len)115 uhd_error uhd_sensor_value_name(
116     uhd_sensor_value_handle h, char* name_out, size_t strbuffer_len)
117 {
118     UHD_SAFE_C_SAVE_ERROR(h, memset(name_out, '\0', strbuffer_len); strncpy(
119         name_out, h->sensor_value_cpp->name.c_str(), strbuffer_len);)
120 }
121 
uhd_sensor_value_value(uhd_sensor_value_handle h,char * value_out,size_t strbuffer_len)122 uhd_error uhd_sensor_value_value(
123     uhd_sensor_value_handle h, char* value_out, size_t strbuffer_len)
124 {
125     UHD_SAFE_C_SAVE_ERROR(h, memset(value_out, '\0', strbuffer_len); strncpy(
126         value_out, h->sensor_value_cpp->value.c_str(), strbuffer_len);)
127 }
128 
uhd_sensor_value_unit(uhd_sensor_value_handle h,char * unit_out,size_t strbuffer_len)129 uhd_error uhd_sensor_value_unit(
130     uhd_sensor_value_handle h, char* unit_out, size_t strbuffer_len)
131 {
132     UHD_SAFE_C_SAVE_ERROR(h, memset(unit_out, '\0', strbuffer_len); strncpy(
133         unit_out, h->sensor_value_cpp->unit.c_str(), strbuffer_len);)
134 }
135 
uhd_sensor_value_data_type(uhd_sensor_value_handle h,uhd_sensor_value_data_type_t * data_type_out)136 uhd_error uhd_sensor_value_data_type(
137     uhd_sensor_value_handle h, uhd_sensor_value_data_type_t* data_type_out)
138 {
139     UHD_SAFE_C_SAVE_ERROR(
140         h, *data_type_out = uhd_sensor_value_data_type_t(h->sensor_value_cpp->type);)
141 }
142 
uhd_sensor_value_to_pp_string(uhd_sensor_value_handle h,char * pp_string_out,size_t strbuffer_len)143 uhd_error uhd_sensor_value_to_pp_string(
144     uhd_sensor_value_handle h, char* pp_string_out, size_t strbuffer_len)
145 {
146     UHD_SAFE_C_SAVE_ERROR(
147         h, std::string pp_string_cpp = h->sensor_value_cpp->to_pp_string();
148         memset(pp_string_out, '\0', strbuffer_len);
149         strncpy(pp_string_out, pp_string_cpp.c_str(), strbuffer_len);)
150 }
151 
uhd_sensor_value_last_error(uhd_sensor_value_handle h,char * error_out,size_t strbuffer_len)152 uhd_error uhd_sensor_value_last_error(
153     uhd_sensor_value_handle h, char* error_out, size_t strbuffer_len)
154 {
155     UHD_SAFE_C(memset(error_out, '\0', strbuffer_len);
156                strncpy(error_out, h->last_error.c_str(), strbuffer_len);)
157 }
158