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 # Let everything else through
29 # -----------------------------------------------------------------------------
31 # -----------------------------------------------------------------------------
33 function Data_update
( src
, key
, val
, len_line
, len_head
, len_val
, time
) {
37 # Not just using $4 for val - because an unstructured value (like name of a
38 # song) might contain a character identical to FS
40 len_head =
length($
1 FS $
2 FS $
3 FS)
41 len_val = len_line
- len_head
42 val =
substr($
0, len_head
+ 1, len_val
)
44 Data
[src
, key
] = Data_maybe_total_to_diff
(src
, key
, val
)
45 time = Data_get_time
()
46 M_time
[src
, key
] = time
48 if (time %
3600 ==
0) {
53 function Data_get
(src
, key
, age_max
, time
, age
, is_expired
) {
54 time = Data_get_time
()
55 A_time
[src
, key
] = time
56 age = time
- M_time
[src
, key
]
57 is_expired = age_max
&& age
> age_max
58 return is_expired ?
"" : Data
[src
, key
]
61 function Data_get_time
( src
, key
, time
) {
62 src =
"khatus_sensor_datetime"
65 A_time
[src
, key
] = time
69 function Data_gc
( src_and_key
, unused_for
) {
70 for (src_and_key in Data
) {
71 unused_for = Data_get_time
() - A_time
[src_and_key
]
72 if (unused_for
> 3600) {
74 "Data_gc", "Deleting unused src_and_key: " src_and_key \
76 delete Data
[src_and_key
]
81 function Data_maybe_total_to_diff
(src
, key
, val
, key_parts
) {
82 split(key
, key_parts
, Kfs
)
83 if (_total_to_diff
[src
, key_parts
[1]]) {
84 _prev
[src
, key
] = _curr
[src
, key
]
86 return (_curr
[src
, key
] - _prev
[src
, key
])
92 # -----------------------------------------------------------------------------
94 # -----------------------------------------------------------------------------
96 function make_status_bar
( position
, bar
, sep
, i
, j
) {
98 position
[++i
] = make_status_energy
()
99 position
[++i
] = make_status_mem
()
100 position
[++i
] = make_status_cpu
()
101 position
[++i
] = make_status_disk
()
102 position
[++i
] = make_status_net
()
103 position
[++i
] = make_status_bluetooth
()
104 position
[++i
] = make_status_screen_brightness
()
105 position
[++i
] = make_status_volume
()
106 position
[++i
] = make_status_mpd
()
107 position
[++i
] = make_status_weather
()
108 position
[++i
] = make_status_datetime
()
112 for (j =
1; j
<= i
; j
++) {
113 bar = bar sep position
[j
]
119 function make_status_energy
( state
, charge
, direction_of_change
) {
120 state = Data_get
("khatus_sensor_energy", "battery_state")
121 charge = Data_get
("khatus_sensor_energy", "battery_percentage")
123 if (state ==
"discharging") {
124 direction_of_change =
"<"
125 } else if (state ==
"charging") {
126 direction_of_change =
">"
128 direction_of_change =
"="
131 return sprintf("E%s%d%%", direction_of_change
, charge
)
134 function make_status_mem
( total
, used
, percent
, status
) {
135 total = Data_get
("khatus_sensor_memory", "total", 5)
136 used = Data_get
("khatus_sensor_memory", "used" , 5)
137 # To avoid division by zero when data is missing
139 percent = round
((used
/ total
) * 100)
140 status =
sprintf("%d%%", percent
)
144 return sprintf("M=%s", status
)
147 function make_status_cpu
( load
, temp
, fan
) {
148 load = Data_get
("khatus_sensor_loadavg" , "load_avg_1min", 5)
149 temp = Data_get
("khatus_sensor_temperature", "temp_c" , 5)
150 fan = Data_get
("khatus_sensor_fan" , "speed" , 5)
152 load = load ?
sprintf("%4.2f", load
) : "--"
153 temp = temp ?
sprintf("%d" , temp
) : "--"
154 fan = fan ?
sprintf("%4d" , fan
) : "--"
156 return sprintf("C=[%s %s°C %srpm]", load
, temp
, fan
)
159 function make_status_disk
( bytes_per_sector
, bytes_per_mb
, w
, r
, u
) {
160 bytes_per_sector =
512
161 bytes_per_mb =
1024 * 1024
163 w = Data_get
("khatus_sensor_disk_io" , "sectors_written" , 5)
164 r = Data_get
("khatus_sensor_disk_io" , "sectors_read" , 5)
165 u = Data_get
("khatus_sensor_disk_space", "disk_usage_percentage", 10)
167 w = w ?
sprintf("%0.3f", (w
* bytes_per_sector
) / bytes_per_mb
) : "--"
168 r = r ?
sprintf("%0.3f", (r
* bytes_per_sector
) / bytes_per_mb
) : "--"
171 return sprintf("D=[%s%% %s▲ %s▼]", u
, w
, r
)
174 function make_status_net
( \
175 number_of_net_interfaces_to_show
, \
176 net_interfaces_to_show
, \
191 number_of_net_interfaces_to_show = \
192 split(opt_net_interfaces_to_show
, net_interfaces_to_show
, ",")
194 sensor_io =
"khatus_sensor_net_addr_io"
195 sensor_wi =
"khatus_sensor_net_wifi_status"
199 for (i = number_of_net_interfaces_to_show
; i
> 0; i
--) {
200 interface = net_interfaces_to_show
[i
]
201 label =
substr(interface
, 1, 1)
203 addr = Data_get
(sensor_io
, "addr" Kfs interface
, 5)
204 w = Data_get
(sensor_io
, "bytes_written" Kfs interface
, 5)
205 r = Data_get
(sensor_io
, "bytes_read" Kfs interface
, 5)
208 bytes_per_mb =
1024 * 1024
209 w = w ?
sprintf("%0.3f", w
/ bytes_per_mb
) : "--"
210 r = r ?
sprintf("%0.3f", r
/ bytes_per_mb
) : "--"
211 io_stat =
sprintf("%s▲ %s▼", w
, r
)
216 if (interface ~
"^w") {
217 wifi = Data_get
(sensor_wi
, "status" Kfs interface
, 10)
218 label = label
":" (wifi ? wifi
: "--")
221 out = out sep label
":" io_stat
225 return sprintf("N[%s]", out
)
228 function make_status_bluetooth
( status
) {
229 status = Data_get
("khatus_sensor_bluetooth_power", "power_status", 10)
230 return sprintf("B=%s", status ? status
: "--")
233 function make_status_screen_brightness
( percentage
) {
234 percentage = Data_get
("khatus_sensor_screen_brightness", "percentage", 5)
235 percentage = percentage ?
sprintf("%d", percentage
) : "--"
236 return sprintf("*%s%%", percentage
)
239 function make_status_volume
( sink
, mute
, vol_l
, vol_r
, status
) {
240 sink = opt_pulseaudio_sink
241 mute = Data_get
("khatus_sensor_volume", "mute" Kfs sink
, 5)
242 vol_l = Data_get
("khatus_sensor_volume", "vol_left" Kfs sink
, 5)
243 vol_r = Data_get
("khatus_sensor_volume", "vol_right" Kfs sink
, 5)
245 if (mute
&& vol_l
&& vol_r
) {
246 if (mute ==
"yes") {status =
"X"}
247 else if (mute ==
"no") {status =
sprintf("%s %s", vol_l
, vol_r
)}
250 "make_status_volume", \
251 "Unexpected value for 'mute' field: " mute \
258 return sprintf("(%s)", status
)
261 function make_status_mpd
( state
, status
) {
262 if (state = Data_get
("khatus_sensor_mpd", "state", 5)) {
263 if (state ==
"play") {
264 status = make_status_mpd_state_known
("▶")
265 } else if (state ==
"pause") {
266 status = make_status_mpd_state_known
("❚❚")
267 } else if (state ==
"stop") {
268 status = make_status_mpd_state_known
("⬛")
272 "Unexpected value for 'state' field: " state \
280 return sprintf("[%s]", status
)
283 function make_status_mpd_state_known
(symbol
, s
, song
, time
, percentage
) {
284 s =
"khatus_sensor_mpd"
285 song = Data_get
(s
, "song" , 5)
286 time = Data_get
(s
, "play_time_minimal_units", 5)
287 percent = Data_get
(s
, "play_time_percentage" , 5)
288 song =
substr(song
, 1, opt_mpd_song_max_chars
)
289 return sprintf("%s %s %s %s", symbol
, time
, percent
, song
)
292 function make_status_weather
( hour
, t_f
) {
294 t_f = Data_get
("khatus_sensor_weather", "temperature_f", 3 * hour
)
295 t_f = t_f ?
sprintf("%d", t_f
) : "--"
296 return sprintf("%s°F", t_f
)
299 function make_status_datetime
( dt
) {
300 dt = Data_get
("khatus_sensor_datetime", "datetime", 5)
301 return dt ? dt
: "--"
304 # -----------------------------------------------------------------------------
306 # -----------------------------------------------------------------------------
308 function print_msg_ok
(key
, val
) {
309 print_msg
("OK", key
, val
, "/dev/stdout")
312 function print_msg_error
(location
, msg
) {
313 print_msg
("ERROR", location
, msg
, "/dev/stderr")
316 function print_msg
(status
, key
, val
, channel
) {
317 print(status
, "khatus_bar", key
, val
) > channel
320 # -----------------------------------------------------------------------------
322 # -----------------------------------------------------------------------------