4 FS = msg_fs ? msg_fs
: "|"
5 OFS = msg_fs ? msg_fs
: "|"
6 Kfs = key_fs ? key_fs
: ":"
8 _total_to_diff
["khatus_sensor_net_addr_io", "bytes_read" ] =
1
9 _total_to_diff
["khatus_sensor_net_addr_io", "bytes_written" ] =
1
10 _total_to_diff
["khatus_sensor_disk_io" , "sectors_read" ] =
1
11 _total_to_diff
["khatus_sensor_disk_io" , "sectors_written"] =
1
14 # -----------------------------------------------------------------------------
16 # -----------------------------------------------------------------------------
22 $
2 ==
"khatus_sensor_datetime" {
23 print_msg_ok
("status_bar", make_status_bar
())
26 # -----------------------------------------------------------------------------
28 # -----------------------------------------------------------------------------
30 function Data_update
( src
, key
, val
, len_line
, len_head
, len_val
, time
) {
34 # Not just using $4 for val - because an unstructured value (like name of a
35 # song) might contain a character identical to FS
37 len_head =
length($
1 FS $
2 FS $
3 FS)
38 len_val = len_line
- len_head
39 val =
substr($
0, len_head
+ 1, len_val
)
41 Data
[src
, key
] = Data_maybe_total_to_diff
(src
, key
, val
)
42 time = Data_get_time
()
43 M_time
[src
, key
] = time
45 if (time %
3600 ==
0) {
50 function Data_get
(result
, src
, key
, ttl
, time
, age
, is_expired
) {
51 time = Data_get_time
()
52 A_time
[src
, key
] = time
53 age = time
- M_time
[src
, key
]
55 result
["is_expired"] = ttl
&& age
> ttl
56 result
["value"] = Data
[src
, key
]
59 function Data_res_fmt_or_def
(result
, format
, default
) {
60 return result
["is_expired"] ? default
: sprintf(format
, result
["value"])
63 function Data_get_fmt_def
(src
, key
, ttl
, format
, default
, result
) {
64 default = default ? default
: "--"
65 Data_get
(result
, src
, key
, ttl
)
66 return Data_res_fmt_or_def
(result
, format
, default
)
69 function Data_get_time
( src
, key
, time
) {
70 src =
"khatus_sensor_datetime"
73 A_time
[src
, key
] = time
77 function Data_gc
( src_and_key
, unused_for
) {
78 for (src_and_key in Data
) {
79 unused_for = Data_get_time
() - A_time
[src_and_key
]
80 if (unused_for
> 3600) {
82 "Data_gc", "Deleting unused src_and_key: " src_and_key \
84 delete Data
[src_and_key
]
89 function Data_maybe_total_to_diff
(src
, key
, val
, key_parts
) {
90 split(key
, key_parts
, Kfs
)
91 if (_total_to_diff
[src
, key_parts
[1]]) {
92 _prev
[src
, key
] = _curr
[src
, key
]
94 return (_curr
[src
, key
] - _prev
[src
, key
])
100 # -----------------------------------------------------------------------------
102 # -----------------------------------------------------------------------------
104 function make_status_bar
( position
, bar
, sep
, i
, j
) {
106 position
[++i
] = make_status_energy
()
107 position
[++i
] = make_status_mem
()
108 position
[++i
] = make_status_cpu
()
109 position
[++i
] = make_status_disk
()
110 position
[++i
] = make_status_net
()
111 position
[++i
] = make_status_bluetooth
()
112 position
[++i
] = make_status_screen_brightness
()
113 position
[++i
] = make_status_volume
()
114 position
[++i
] = make_status_mpd
()
115 position
[++i
] = make_status_weather
()
116 position
[++i
] = make_status_datetime
()
120 for (j =
1; j
<= i
; j
++) {
121 bar = bar sep position
[j
]
127 function make_status_energy
( state
, charge
, direction_of_change
) {
128 Data_get
(state
, "khatus_sensor_energy", "battery_state" , 0)
129 Data_get
(charge
, "khatus_sensor_energy", "battery_percentage", 0)
131 if (state
["value"] ==
"discharging") {
132 direction_of_change =
"<"
133 } else if (state
["value"] ==
"charging") {
134 direction_of_change =
">"
136 direction_of_change =
"="
139 return sprintf("E%s%d%%", direction_of_change
, charge
["value"])
142 function make_status_mem
( total
, used
, percent
, status
) {
143 Data_get
(total
, "khatus_sensor_memory", "total", 5)
144 Data_get
(used
, "khatus_sensor_memory", "used" , 5)
145 # Checking total["value"] to avoid division by zero when data is missing
146 if (!total
["is_expired"] && \
147 !used
["is_expired"] && \
150 percent = round
((used
["value"] / total
["value"]) * 100)
151 status =
sprintf("%d%%", percent
)
155 return sprintf("M=%s", status
)
158 function make_status_cpu
( l
, t
, f
) {
159 l = Data_get_fmt_def
("khatus_sensor_loadavg" , "load_avg_1min", 5, "%4.2f")
160 t = Data_get_fmt_def
("khatus_sensor_temperature", "temp_c" , 5, "%d" )
161 f = Data_get_fmt_def
("khatus_sensor_fan" , "speed" , 5, "%4d" )
162 return sprintf("C=[%s %s°C %srpm]", l
, t
, f
)
165 function make_status_disk
( bytes_per_sector
, bytes_per_mb
, w
, w_str
, r
,
167 bytes_per_sector =
512
168 bytes_per_mb =
1024 * 1024
170 u_str = Data_get_fmt_def
("khatus_sensor_disk_space", "disk_usage_percentage", 10, "%s")
171 Data_get
(w
, "khatus_sensor_disk_io", "sectors_written", 5)
172 Data_get
(r
, "khatus_sensor_disk_io", "sectors_read" , 5)
174 # Unit conversion looks like a good candidate for a generic transform
175 w_str = w
["is_expired"] ?
"--" :\
176 sprintf("%0.3f", (w
["value"] * bytes_per_sector
) / bytes_per_mb
)
177 r_str = r
["is_expired"] ?
"--" :\
178 sprintf("%0.3f", (r
["value"] * bytes_per_sector
) / bytes_per_mb
)
180 return sprintf("D=[%s%% %s▲ %s▼]", u_str
, w_str
, r_str
)
183 function make_status_net
( \
184 number_of_net_interfaces_to_show
, \
185 net_interfaces_to_show
, \
202 number_of_net_interfaces_to_show = \
203 split(opt_net_interfaces_to_show
, net_interfaces_to_show
, ",")
205 sensor_io =
"khatus_sensor_net_addr_io"
206 sensor_wi =
"khatus_sensor_net_wifi_status"
210 for (i = number_of_net_interfaces_to_show
; i
> 0; i
--) {
211 interface = net_interfaces_to_show
[i
]
212 label =
substr(interface
, 1, 1)
214 Data_get
(addr
, sensor_io
, "addr" Kfs interface
, 5)
215 Data_get
(w
, sensor_io
, "bytes_written" Kfs interface
, 5)
216 Data_get
(r
, sensor_io
, "bytes_read" Kfs interface
, 5)
218 if (!addr
["is_expired"] && addr
["value"]) {
219 # TODO: Generalize unit conversion at Data_update
220 bytes_per_mb =
1024 * 1024
221 w_str = w
["is_expired"] ?
"--" : sprintf("%0.3f", w
["value"] / bytes_per_mb
)
222 r_str = r
["is_expired"] ?
"--" : sprintf("%0.3f", r
["value"] / bytes_per_mb
)
223 io_stat =
sprintf("%s▲ %s▼", w_str
, r_str
)
228 if (interface ~
"^w") {
229 wifi = Data_get_fmt_def
(sensor_wi
, "status" Kfs interface
, 10, "%s")
230 label = label
":" wifi
233 out = out sep label
":" io_stat
237 return sprintf("N[%s]", out
)
240 function make_status_bluetooth
( src
, key
) {
241 src =
"khatus_sensor_bluetooth_power"
243 return sprintf("B=%s", Data_get_fmt_def
(src
, key
, 10, "%s"))
246 function make_status_screen_brightness
( src
, key
) {
247 src =
"khatus_sensor_screen_brightness"
249 return sprintf("*%s%%", Data_get_fmt_def
(src
, key
, 5, "%d"))
252 function make_status_volume
( sink
, mute
, vol_l
, vol_r
, show
) {
253 sink = opt_pulseaudio_sink
254 Data_get
(mute
, "khatus_sensor_volume", "mute" Kfs sink
, 5)
255 Data_get
(vol_l
, "khatus_sensor_volume", "vol_left" Kfs sink
, 5)
256 Data_get
(vol_r
, "khatus_sensor_volume", "vol_right" Kfs sink
, 5)
258 if (!mute
["is_expired"] && !vol_l
["is_expired"] && !vol_r
["is_expired"]) {
259 if (mute
["value"] ==
"yes") {show =
"X"}
260 else if (mute
["value"] ==
"no") {show = vol_l
["value"] " " vol_r
["value"]}
263 "make_status_volume", \
264 "Unexpected value for 'mute' field: " mute \
271 return sprintf("(%s)", show
)
274 function make_status_mpd
( state
, status
) {
275 Data_get
(state
, "khatus_sensor_mpd", "state", 5)
276 if (!state
["is_expired"] && state
["value"]) {
277 if (state
["value"] ==
"play") {
278 status = make_status_mpd_state_known
("▶")
279 } else if (state
["value"] ==
"pause") {
280 status = make_status_mpd_state_known
("❚❚")
281 } else if (state
["value"] ==
"stop") {
282 status = make_status_mpd_state_known
("⬛")
286 "Unexpected value for 'state' field: " state
["value"] \
294 return sprintf("[%s]", status
)
297 function make_status_mpd_state_known
(symbol
, s
, song
, time
, percentage
) {
298 s =
"khatus_sensor_mpd"
299 song = Data_get_fmt_def
(s
, "song" , 5, "%s", "?")
300 time = Data_get_fmt_def
(s
, "play_time_minimal_units", 5, "%s", "?")
301 percent = Data_get_fmt_def
(s
, "play_time_percentage" , 5, "%s", "?")
302 song =
substr(song
, 1, opt_mpd_song_max_chars
)
303 return sprintf("%s %s %s %s", symbol
, time
, percent
, song
)
306 function make_status_weather
( hour
, t_f
) {
308 t_f = Data_get_fmt_def
("khatus_sensor_weather", "temperature_f", 3 * hour
, "%d")
309 return sprintf("%s°F", t_f
)
312 function make_status_datetime
( dt
) {
313 return Data_get_fmt_def
("khatus_sensor_datetime", "datetime", 5, "%s")
316 # -----------------------------------------------------------------------------
318 # -----------------------------------------------------------------------------
320 function print_msg_ok
(key
, val
) {
321 print_msg
("OK", key
, val
, "/dev/stdout")
324 function print_msg_error
(location
, msg
) {
325 print_msg
("ERROR", location
, msg
, "/dev/stderr")
328 function print_msg
(status
, key
, val
, channel
) {
329 print(status
, "khatus_bar", key
, val
) > channel
332 # -----------------------------------------------------------------------------
334 # -----------------------------------------------------------------------------