2021-12-23 23:59:00 +04:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
#include "main.h"
|
|
|
|
|
2023-09-17 22:51:28 +04:00
|
|
|
int main(const int argc, const char *const *const argv) {
|
2021-12-25 23:27:53 +04:00
|
|
|
price_t price;
|
|
|
|
wattage_t wattage;
|
|
|
|
interval_t interval = 0;
|
2021-12-23 23:59:00 +04:00
|
|
|
|
2021-12-25 23:27:53 +04:00
|
|
|
int res = parse_arguments(argc, argv, &price, &wattage, &interval);
|
|
|
|
if (res != 0) {
|
|
|
|
if (res == 1)
|
|
|
|
print_usage();
|
|
|
|
else if (res == 2)
|
|
|
|
print_version();
|
|
|
|
exit(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
printf("%.2Lf\n", (price * wattage) * interval);
|
2021-12-23 23:59:00 +04:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2023-09-17 22:51:28 +04:00
|
|
|
int parse_arguments(const int argc, const char *const *const argv,
|
|
|
|
price_t *const price, wattage_t *const wattage, interval_t *const interval) {
|
2021-12-25 23:27:53 +04:00
|
|
|
if (argc < 2) return 1;
|
2021-12-23 23:59:00 +04:00
|
|
|
|
2021-12-25 23:27:53 +04:00
|
|
|
for (int i = 1, pos = 0; i < argc; ++i)
|
2021-12-23 23:59:00 +04:00
|
|
|
if (argv[i][0] == '-') {
|
2021-12-25 23:27:53 +04:00
|
|
|
if (argv[i][1] == 'h' || argv[i][2] == 'h')
|
|
|
|
return 1;
|
|
|
|
else if (argv[i][1] == 'v' || argv[i][2] == 'v')
|
|
|
|
return 2;
|
2023-09-17 23:48:13 +04:00
|
|
|
else
|
|
|
|
return 99;
|
2021-12-25 23:27:53 +04:00
|
|
|
} else if (argc < 4) {
|
|
|
|
return 1;
|
|
|
|
} else if (pos == 0) {
|
2023-09-17 23:48:13 +04:00
|
|
|
*price = price_kwh_to_wattspersecond((price_t)atof(argv[i]));
|
2021-12-25 23:27:53 +04:00
|
|
|
++pos;
|
|
|
|
} else if (pos == 1) {
|
|
|
|
*wattage = (wattage_t)atof(argv[2]);
|
|
|
|
++pos;
|
|
|
|
} else
|
2022-10-07 03:50:57 +04:00
|
|
|
*interval += interval_to_seconds(argv[i]);
|
2021-12-23 23:59:00 +04:00
|
|
|
|
2021-12-25 23:27:53 +04:00
|
|
|
return 0;
|
2021-12-23 23:59:00 +04:00
|
|
|
}
|
|
|
|
|
2023-09-17 22:51:28 +04:00
|
|
|
inline interval_t interval_to_seconds(const char *const interval) {
|
2021-12-23 23:59:00 +04:00
|
|
|
interval_t intrvl = (interval_t)atol(interval);
|
|
|
|
|
2021-12-25 23:27:53 +04:00
|
|
|
switch (interval[strlen(interval) - 1]) {
|
|
|
|
case 'm':
|
|
|
|
case 'M':
|
|
|
|
return intrvl * 60;
|
|
|
|
case 'h':
|
|
|
|
case 'H':
|
|
|
|
return intrvl * 60 * 60;
|
|
|
|
case 'd':
|
|
|
|
case 'D':
|
|
|
|
return intrvl * 60 * 60 * 24;
|
|
|
|
default:
|
|
|
|
return intrvl;
|
|
|
|
}
|
2021-12-23 23:59:00 +04:00
|
|
|
}
|
|
|
|
|
2023-09-17 22:49:13 +04:00
|
|
|
inline price_t price_kwh_to_wattspersecond(const price_t price) {
|
2021-12-23 23:59:00 +04:00
|
|
|
return price / 1000.f / 3600.f;
|
|
|
|
}
|
|
|
|
|
2021-12-25 23:27:53 +04:00
|
|
|
inline void print_version() {
|
2023-09-17 22:48:18 +04:00
|
|
|
fputs("kwh-cost Ver. " VERSION "\n"
|
|
|
|
"Copyright (C) 2021-2023 Alexander \"Arav\" Andreev <me@arav.su>. All rights reserved.\n"
|
|
|
|
"You can see a license for this program in /usr/share/licenses/kwh-cost/LICENSE.\n", stderr);
|
2021-12-23 23:59:00 +04:00
|
|
|
}
|
|
|
|
|
2021-12-25 23:27:53 +04:00
|
|
|
inline void print_usage() {
|
2023-09-17 22:48:18 +04:00
|
|
|
fputs("Usage: kwh-cost [OPTIONS] price wattage interval [interval ...]\n"
|
2021-12-25 23:27:53 +04:00
|
|
|
"Options:\n"
|
2022-10-07 03:51:52 +04:00
|
|
|
" --help, -h display this usage information.\n"
|
|
|
|
" --version, -v display program version.\n"
|
2021-12-25 23:27:53 +04:00
|
|
|
"Arguments:\n"
|
2022-10-07 03:51:52 +04:00
|
|
|
" price price per kWh.\n"
|
|
|
|
" wattage power usage in Watts.\n"
|
|
|
|
" interval time interval in seconds during which\n"
|
|
|
|
" this much power to be constantly used.\n"
|
|
|
|
" You may specify other time units such as:\n"
|
|
|
|
" m'inute, h'our, d'ay. Example: 5d 3h.\n"
|
2023-09-17 22:48:18 +04:00
|
|
|
" All given intervals will be summed up.\n", stderr);
|
2021-12-24 01:01:43 +04:00
|
|
|
}
|