untested code!
Mostly deal with usleep, but there are a few places where sleep is
replaced with nanosleep.
Index: b/clients/upssched.c
===================================================================
--- a/clients/upssched.c 2011-05-31 13:36:47.000000000 +0300
+++ b/clients/upssched.c 2011-08-17 00:40:17.000000000 +0300
@@ -652,7 +652,7 @@ static int check_parent(const char *cmd,
unlink(lockfn);
/* give the other one a chance to start it, then try again */
- usleep(250000);
+ struct timespec delay = {0, 250e6}; nanosleep(&delay, NULL);
}
upslog_with_errno(LOG_ERR, "Failed to connect to parent and failed to
create parent");
@@ -705,7 +705,7 @@ static void sendcmd(const char *cmd, con
if (pipefd == PARENT_STARTED) {
/* loop back and try to connect now */
- usleep(250000);
+ struct timespec delay = {0, 250e6}; nanosleep(&delay,
NULL);
continue;
}
Index: b/clients/upsmon.c
===================================================================
--- a/clients/upsmon.c 2011-05-31 13:36:47.000000000 +0300
+++ b/clients/upsmon.c 2011-08-17 00:40:17.000000000 +0300
@@ -610,7 +610,7 @@ static void slavesync(void)
return;
}
- usleep(250000);
+ struct timespec delay = {0, 250e6}; nanosleep(&delay, NULL);
}
}
Index: b/docs/new-drivers.txt
===================================================================
--- a/docs/new-drivers.txt 2011-05-31 13:36:47.000000000 +0300
+++ b/docs/new-drivers.txt 2011-08-17 00:40:17.000000000 +0300
@@ -632,9 +632,9 @@ depends on how fast your system is.
You should check your driver with `strace` or its equivalent on your
system. If the driver is calling read() multiple times, consider adding
-a call to usleep before going into the ser_read_* call. That will give
-it a chance to accumulate so you get the whole thing with one call to
-read without looping back for more.
+a call to nanosleep before going into the ser_read_* call. That will
+give it a chance to accumulate so you get the whole thing with one call
+to read without looping back for more.
This is not a request to save CPU time, even though it may do that. The
important part here is making the strace/ktrace output easier to read.
Index: b/drivers/safenet.c
===================================================================
--- a/drivers/safenet.c 2011-05-31 13:36:49.000000000 +0300
+++ b/drivers/safenet.c 2011-08-17 00:40:17.000000000 +0300
@@ -299,7 +299,7 @@ void upsdrv_initinfo(void)
dstate_setinfo("driver.version.internal", "%s", DRIVER_VERSION);
- usleep(100000);
+ struct timespec delay = {0, 100e6}; nanosleep(&delay, NULL);
/*
* Very crude hardware detection. If an UPS is attached, it will set DSR
Index: b/drivers/powerpanel.c
===================================================================
--- a/drivers/powerpanel.c 2011-05-31 13:36:49.000000000 +0300
+++ b/drivers/powerpanel.c 2011-08-17 00:40:17.000000000 +0300
@@ -165,7 +165,7 @@ void upsdrv_initups(void)
}
ser_set_dtr(upsfd, 1);
- usleep(10000);
+ struct timespec delay = {0, 10e6}; nanosleep(&delay, NULL);
if (subdriver[mode]->initups() > 0) {
upslogx(LOG_INFO, "CyberPower UPS with %s protocol on
%s detected", subdriver[mode]->version, device_path);
@@ -173,7 +173,7 @@ void upsdrv_initups(void)
}
ser_set_dtr(upsfd, 0);
- usleep(10000);
+ nanosleep(&delay, NULL);
}
fatalx(EXIT_FAILURE, "CyberPower UPS not found on %s", device_path);
Index: b/drivers/bestups.c
===================================================================
--- a/drivers/bestups.c 2011-05-31 13:36:49.000000000 +0300
+++ b/drivers/bestups.c 2011-08-17 00:40:17.000000000 +0300
@@ -252,7 +252,7 @@ static void ups_sync(void)
if ((ret > 0) && (buf[0] == '('))
return;
- usleep(250000);
+ struct timespec delay = {0, 250e6}; nanosleep(&delay, NULL);
}
fatalx(EXIT_FAILURE, "Unable to detect a Best/SOLA or Phoenix protocol
UPS");
@@ -333,7 +333,7 @@ void upsdrv_updateinfo(void)
}
/* these things need a long time to respond completely */
- usleep(200000);
+ struct timespec delay = {0, 200e6}; nanosleep(&delay, NULL);
ret = ser_get_line(upsfd, buf, sizeof(buf), ENDCHAR, "",
SER_WAIT_SEC, SER_WAIT_USEC);
Index: b/drivers/microdowell.c
===================================================================
--- a/drivers/microdowell.c 2011-08-17 00:40:17.000000000 +0300
+++ b/drivers/microdowell.c 2011-08-17 00:40:17.000000000 +0300
@@ -223,8 +223,9 @@ unsigned char * CmdSerial(unsigned char
/* The default error code (no received character) */
ErrCode = ERR_COM_NO_CHARS ;
- SendCmdToSerial(OutBuffer, Len) ;
- usleep(10000) ; /* small delay (1/100 s) */
+ SendCmdToSerial(OutBuffer, Len) ;
+ /* small delay (1/100 s) */
+ struct timespec delay = {0, 10e6}; nanosleep(&delay, NULL);
/* get chars until timeout */
BuffLen = 0 ;
@@ -305,7 +306,8 @@ static int detect_hardware(void)
{
upsdebugx(1, "[%d] get 'UPS model': %s", retries,
PrintErr(ups.ErrCode));
upslogx(LOG_ERR, "[%d] Unable to identify UPS model
[%s]", retries, PrintErr(ups.ErrCode));
- usleep(100000) ; /* small delay (1/10 s) for next retry
*/
+ /* small delay (1/10 s) for next retry */
+ struct timespec delay = {0, 100e6}; nanosleep(&delay,
NULL);
}
}
@@ -971,7 +973,8 @@ void upsdrv_initups(void)
ser_set_dtr(upsfd, 0);
ser_set_rts(upsfd, 0);
- usleep(10000) ; /* small delay (1/100 s)) */
+ /* small delay (1/100 s) */
+ struct timespec delay = {0, 10e6}; nanosleep(&delay, NULL);
}
void upsdrv_cleanup(void)
Index: b/drivers/victronups.c
===================================================================
--- a/drivers/victronups.c 2011-05-31 13:36:49.000000000 +0300
+++ b/drivers/victronups.c 2011-08-17 03:09:10.000000000 +0300
@@ -49,8 +49,8 @@ upsdrv_info_t upsdrv_info = {
#define ENDCHAR '\r'
#define IGNCHARS "\n"
-#define UPS_DELAY 150000
-#define UPS_LONG_DELAY 450000
+#define UPS_DELAY 150e6
+#define UPS_LONG_DELAY 450e6
#define VICTRON_OVER 128
#define VICTRON_RB 1
@@ -86,7 +86,7 @@ static int get_data (const char *out_str
{
int ret_code;
ser_send(upsfd, "%s%c", out_string, ENDCHAR);
- usleep (UPS_DELAY);
+ struct timespec delay = {0, UPS_DELAY}; nanosleep(&delay, NULL);
ret_code = ser_get_line(upsfd, in_string, LENGTH_TEMP, ENDCHAR,
IGNCHARS, 3, 0);
if (ret_code < 1) {
@@ -498,7 +498,7 @@ void upsdrv_updateinfo(void)
void upsdrv_shutdown(void)
{
ser_send(upsfd, "vCc0!%c", ENDCHAR);
- usleep(UPS_DELAY);
+ struct timespec delay = {0, UPS_DELAY}; nanosleep(&delay, NULL);
ser_send(upsfd, "vCb%i!%c", sdwdelay, ENDCHAR);
}
@@ -536,15 +536,16 @@ void upsdrv_initups(void)
/* inicializace a synchronizace UPS */
ser_send_char(upsfd, ENDCHAR);
- usleep (UPS_LONG_DELAY);
+ struct timespec delay = {0, UPS_LONG_DELAY}; nanosleep(&delay, NULL);
ser_send(upsfd, "?%c", ENDCHAR);
- usleep (UPS_LONG_DELAY);
+ nanosleep(&delay, NULL);
ser_get_line(upsfd, temp, sizeof(temp), ENDCHAR, IGNCHARS, 3, 0);
ser_send(upsfd, "?%c", ENDCHAR);
- usleep (UPS_LONG_DELAY);
+ nanosleep(&delay, NULL);
ser_get_line(upsfd, temp, sizeof(temp), ENDCHAR, IGNCHARS, 3, 0);
ser_send(upsfd, "?%c", ENDCHAR);
- usleep (UPS_DELAY);
+ delay.tv_sec = 0; delay.tv_nsec = UPS_DELAY;
+ nanosleep(&delay, NULL);
ser_get_line(upsfd, temp, sizeof(temp), ENDCHAR, IGNCHARS, 3, 0);
Index: b/drivers/apcsmart.c
===================================================================
--- a/drivers/apcsmart.c 2011-05-31 13:36:49.000000000 +0300
+++ b/drivers/apcsmart.c 2011-08-17 03:06:07.000000000 +0300
@@ -822,7 +822,7 @@ static int sdcmd_CS(int tval)
if (tval & APC_STAT_OL) {
upsdebugx(1, "On-line - forcing OB temporarily");
ser_send_char(upsfd, 'U');
- usleep(UPSDELAY);
+ struct timespec delay = {0, UPSDELAY}; nanosleep(&delay, NULL);
}
return sdcmd_S(tval);
}
@@ -837,6 +837,7 @@ static int sdcmd_ATn(int cnt)
int n = 0, mmax, ret;
const char *strval;
char timer[4];
+ struct timespec delay;
mmax = cnt == 2 ? 99 : 999;
@@ -853,7 +854,8 @@ static int sdcmd_ATn(int cnt)
upsdebugx(1, "Issuing hard hibernate with %d minutes additional wakeup
delay", n*6);
ser_send_char(upsfd, APC_CMD_GRACEDOWN);
- usleep(CMDLONGDELAY);
+ delay.tv_sec = CMDLONGDELS; delay.tv_nsec = CMDLONGDELNS;
+ nanosleep(&delay, NULL);
ser_send_pace(upsfd, UPSDELAY, "%s", timer);
ret = sdok();
@@ -867,7 +869,8 @@ static int sdcmd_ATn(int cnt)
* silent (YMMV);
*/
ser_send_char(upsfd, APC_CMD_GRACEDOWN);
- usleep(UPSDELAY);
+ delay.tv_sec = 0; delay.tv_nsec = UPSDELAY;
+ nanosleep(&delay, NULL);
ser_flush_in(upsfd, IGNCHARS, nut_debug_level);
return 0;
@@ -880,7 +883,8 @@ static int sdcmd_K(int dummy)
upsdebugx(1, "Issuing delayed poweroff");
ser_send_char(upsfd, APC_CMD_SHUTDOWN);
- usleep(CMDLONGDELAY);
+ struct timespec delay = {CMDLONGDELS, CMDLONGDELNS};
+ nanosleep(&delay, NULL);
ser_send_char(upsfd, APC_CMD_SHUTDOWN);
return sdok();
@@ -893,7 +897,8 @@ static int sdcmd_Z(int dummy)
upsdebugx(1, "Issuing immediate poweroff");
ser_send_char(upsfd, APC_CMD_OFF);
- usleep(CMDLONGDELAY);
+ struct timespec delay = {CMDLONGDELS, CMDLONGDELNS};
+ nanosleep(&delay, NULL);
ser_send_char(upsfd, APC_CMD_OFF);
return sdok();
@@ -1229,7 +1234,7 @@ static int setvar_string(apc_vartab_t *v
return STAT_SET_HANDLED; /* FUTURE: failed */
}
- usleep(UPSDELAY);
+ struct timespec delay = {0, UPSDELAY}; nanosleep(&delay, NULL);
for (i = 0; i < strlen(val); i++) {
ret = ser_send_char(upsfd, val[i]);
@@ -1239,7 +1244,7 @@ static int setvar_string(apc_vartab_t *v
return STAT_SET_HANDLED; /* FUTURE: failed */
}
- usleep(UPSDELAY);
+ nanosleep(&delay, NULL);
}
/* pad to 8 chars with CRs */
@@ -1251,7 +1256,7 @@ static int setvar_string(apc_vartab_t *v
return STAT_SET_HANDLED; /* FUTURE: failed */
}
- usleep(UPSDELAY);
+ nanosleep(&delay, NULL);
}
ret = read_buf(temp, sizeof(temp));
@@ -1314,7 +1319,8 @@ static int do_cmd(apc_cmdtab_t *ct)
/* some commands have to be sent twice with a 1.5s gap */
if (ct->flags & APC_REPEAT) {
- usleep(CMDLONGDELAY);
+ struct timespec delay = {CMDLONGDELS, CMDLONGDELNS};
+ nanosleep(&delay, NULL);
ret = ser_send_char(upsfd, ct->cmd);
Index: b/drivers/bcmxcp_ser.c
===================================================================
--- a/drivers/bcmxcp_ser.c 2011-05-31 13:36:49.000000000 +0300
+++ b/drivers/bcmxcp_ser.c 2011-08-17 03:21:04.000000000 +0300
@@ -49,7 +49,7 @@ static void send_command(unsigned char *
if (retry == PW_MAX_TRY) {
ser_send_char(upsfd, 0x1d); /* last retry is
preceded by a ESC.*/
- usleep(250000);
+ struct timespec delay = {0, 250e6}; nanosleep(&delay,
NULL);
}
sent = ser_send_buf(upsfd, sbuf, command_length);
@@ -255,6 +255,7 @@ void pw_comm_setup(const char *port)
unsigned char id_command = PW_ID_BLOCK_REQ;
unsigned char answer[256];
int i = 0, baud, mybaud = 0, ret = -1;
+ struct timespec delay;
if (getval("baud_rate") != NULL)
{
@@ -273,12 +274,14 @@ void pw_comm_setup(const char *port)
ser_set_speed(upsfd, device_path, mybaud);
ser_send_char(upsfd, 0x1d); /* send ESC to take it out of
menu */
- usleep(90000);
+ delay.tv_sec = 0; delay.tv_nsec = 90e6;
+ nanosleep(&delay, NULL);
send_write_command(AUT, 4);
- usleep(500000);
+ delay.tv_sec = 0; delay.tv_nsec = 500e6;
+ nanosleep(&delay, NULL);
ret = command_sequence(&command, 1, answer);
if (ret <= 0) {
- usleep(500000);
+ nanosleep(&delay, NULL); /* 0.5 sec delay */
ret = command_sequence(&id_command, 1, answer);
}
@@ -296,12 +299,14 @@ void pw_comm_setup(const char *port)
ser_set_speed(upsfd, device_path, pw_baud_rates[i].rate);
ser_send_char(upsfd, 0x1d); /* send ESC to take it out of
menu */
- usleep(90000);
+ delay.tv_sec = 0; delay.tv_nsec = 90e6;
+ nanosleep(&delay, NULL);
send_write_command(AUT, 4);
- usleep(500000);
+ delay.tv_sec = 0; delay.tv_nsec = 500e6;
+ nanosleep(&delay, NULL);
ret = command_sequence(&command, 1, answer);
if (ret <= 0) {
- usleep(500000);
+ nanosleep(&delay, NULL); /* 0.5 sec delay */
ret = command_sequence(&id_command, 1, answer);
}
Index: b/drivers/belkin.c
===================================================================
--- a/drivers/belkin.c 2011-05-31 13:36:49.000000000 +0300
+++ b/drivers/belkin.c 2011-08-17 00:40:17.000000000 +0300
@@ -113,7 +113,7 @@ static int get_belkin_reply(char *buf)
long cnt;
char tmp[8];
- usleep(25000);
+ struct timespec delay = {0, 25e6}; nanosleep(&delay, NULL);
/* pull first 7 bytes to get data length - like ~00D004 */
ret = ser_get_buf_len(upsfd, (unsigned char *)tmp, 7, 2, 0);
@@ -160,7 +160,7 @@ static int do_broken_rat(char *buf)
long cnt;
char tmp[8];
- usleep(25000);
+ struct timespec delay = {0, 25e6}; nanosleep(&delay, NULL);
/* pull first 7 bytes to get data length - like ~00D004 */
ret = ser_get_buf_len(upsfd, (unsigned char *)tmp, 7, 2, 0);
@@ -412,7 +412,7 @@ static void do_off(void)
upslogx(LOG_INFO, "Sending powerdown command to UPS\n");
send_belkin_command(CONTROL,POWER_OFF,"1;1");
- usleep(1500000);
+ struct timespec delay = {1, 500e6}; nanosleep(&delay, NULL);
send_belkin_command(CONTROL,POWER_OFF,"1;1");
}
Index: b/drivers/belkinunv.c
===================================================================
--- a/drivers/belkinunv.c 2011-08-17 00:40:17.000000000 +0300
+++ b/drivers/belkinunv.c 2011-08-17 00:40:17.000000000 +0300
@@ -239,7 +239,7 @@ static void belkin_nut_open_tty(void)
"smart" mode */
ser_set_dtr(upsfd, 0);
ser_set_rts(upsfd, 1);
- sleep(1);
+ struct timespec delay = {1, 0}; nanosleep(&delay, NULL);
ser_flush_io(upsfd);
}
@@ -495,7 +495,7 @@ static int belkin_std_open_tty(const cha
/* sleep at least 0.25 seconds for the UPS to wake up. Belkin's own
software sleeps 1 second, so that's what we do, too. */
- usleep(1000000);
+ struct timespec delay = {1, 0}; nanosleep(&delay, NULL);
/* flush incoming data again, and read any remaining garbage
bytes. There should not be any. */
@@ -526,7 +526,7 @@ static int belkin_std_upsread(int fd, un
r = read(fd, &buf[count], n-count);
if (r==-1 && errno==EAGAIN) {
/* non-blocking i/o, no data available */
- usleep(100000);
+ struct timespec delay = {0, 100e6}; nanosleep(&delay,
NULL);
tries++;
} else if (r == -1) {
return -1;
@@ -550,7 +550,7 @@ static int belkin_std_upswrite(int fd, u
r = write(fd, &buf[count], n-count);
if (r==-1 && errno==EAGAIN) {
/* non-blocking i/o, no data available */
- usleep(100000);
+ struct timespec delay = {0, 100e6}; nanosleep(&delay,
NULL);
tries++;
} else if (r == -1) {
return -1;
@@ -752,6 +752,8 @@ static int belkin_wait(void)
int r;
int bs, ov, bl, st;
+ struct timespec delay = {1, 0};
+
/* read command line '-x' options */
val = getval("wait");
if (val) {
@@ -790,7 +792,7 @@ static int belkin_wait(void)
if (fd == -1) {
failcount++;
failerrno = errno;
- sleep(1);
+ nanosleep(&delay, NULL);
continue;
}
@@ -802,7 +804,7 @@ static int belkin_wait(void)
failerrno = errno;
close(fd);
fd = -1;
- sleep(1);
+ nanosleep(&delay, NULL);
continue;
}
ov = belkin_std_read_int(fd, REG_OUTPUTVOLT); /* output voltage
*/
@@ -811,7 +813,7 @@ static int belkin_wait(void)
failerrno = errno;
close(fd);
fd = -1;
- sleep(1);
+ nanosleep(&delay, NULL);
continue;
}
bl = belkin_std_read_int(fd, REG_BATLEVEL); /* battery level
*/
@@ -820,7 +822,7 @@ static int belkin_wait(void)
failerrno = errno;
close(fd);
fd = -1;
- sleep(1);
+ nanosleep(&delay, NULL);
continue;
}
/* successfully got data from UPS */
@@ -837,7 +839,7 @@ static int belkin_wait(void)
if (st == ST_ONLINE && bl >= level) {
break;
}
- sleep(1);
+ nanosleep(&delay, NULL);
}
/* termination condition reached */
Index: b/drivers/bestfcom.c
===================================================================
--- a/drivers/bestfcom.c 2011-08-17 00:40:17.000000000 +0300
+++ b/drivers/bestfcom.c 2011-08-17 00:40:17.000000000 +0300
@@ -210,7 +210,7 @@ static int execute(const char *cmd, char
ser_send(upsfd, "%s", cmd);
/* Give the UPS some time to chew on what we just sent */
- usleep(50000);
+ struct timespec delay = {0, 50e6}; nanosleep(&delay, NULL);
/* delete command echo up to \012 but no further */
for (ch = '\0'; ch != '\012'; ser_get_char(upsfd, &ch, 0, 10000));
@@ -458,18 +458,19 @@ void upsdrv_help(void)
static void sync_serial(void) {
char buffer[10];
+ struct timespec delay = {UPSDELAY, 0};
ser_flush_in(upsfd, "", 1);
ser_send(upsfd, "\r");
- sleep(UPSDELAY);
+ nanosleep(&delay, NULL);
ser_get_line(upsfd, buffer, sizeof(buffer), '\r', "\012", 3, 0);
ser_get_line(upsfd, buffer, sizeof(buffer), ENDCHAR, IGNCHARS, 3, 0);
while (ser_get_line(upsfd, buffer, sizeof(buffer), '>', "\012", 3, 0)
<= 0) {
printf(".");
ser_send(upsfd, "\r");
- sleep(UPSDELAY);
+ nanosleep(&delay, NULL);
}
}
@@ -537,7 +538,7 @@ void upsdrv_init_nofc(void)
ser_send(upsfd, "id\r");
/* prevent upsrecv from timing out */
- sleep(UPSDELAY);
+ struct timespec delay = {UPSDELAY, 0}; nanosleep(&delay, NULL);
ser_get_line(upsfd, rstring, sizeof(rstring), '>', "", 3, 0);
Index: b/drivers/bestfortress.c
===================================================================
--- a/drivers/bestfortress.c 2011-05-31 13:36:49.000000000 +0300
+++ b/drivers/bestfortress.c 2011-08-17 00:40:17.000000000 +0300
@@ -23,7 +23,7 @@
#include "main.h"
#include "serial.h"
-#define UPSDELAY 50000 /* 50 ms delay required for reliable operation */
+#define UPSDELAY 50e6 /* 50e6 ns delay required for reliable operation */
#define SER_WAIT_SEC 2 /* allow 2.0 sec for ser_get calls */
#define SER_WAIT_USEC 0
#define ENDCHAR '\r'
@@ -162,7 +162,7 @@ static int upssend(const char *fmt,...)
char buf[1024], *p;
va_list ap;
unsigned int sent = 0;
- int d_usec = UPSDELAY;
+ struct timespec d_nsec = {0, UPSDELAY};
va_start(ap, fmt);
ret = vsnprintf(buf, sizeof(buf), fmt, ap);
@@ -175,8 +175,7 @@ static int upssend(const char *fmt,...)
if (write(upsfd, p, 1) != 1)
return -1;
- if (d_usec)
- usleep(d_usec);
+ nanosleep(&d_nsec, NULL);
sent++;
}
Index: b/drivers/blazer_ser.c
===================================================================
--- a/drivers/blazer_ser.c 2011-05-31 13:36:49.000000000 +0300
+++ b/drivers/blazer_ser.c 2011-08-17 00:40:17.000000000 +0300
@@ -179,7 +179,7 @@ void upsdrv_initups(void)
/*
* Allow some time to settle for the cablepower
*/
- usleep(100000);
+ struct timespec delay = {0, 100e6}; nanosleep(&delay, NULL);
#endif
blazer_initups();
}
Index: b/drivers/isbmex.c
===================================================================
--- a/drivers/isbmex.c 2011-08-17 00:40:17.000000000 +0300
+++ b/drivers/isbmex.c 2011-08-17 00:40:17.000000000 +0300
@@ -180,7 +180,7 @@ static const char *getpacket(int *we_kno
if (bytes_per_packet && r < bytes_per_packet){
ssize_t rr;
D(printf("short read...\n");)
- usleep(500000);
+ struct timespec delay = {0, 500e6}; nanosleep(&delay, NULL);
tv.tv_sec = 2;
tv.tv_usec = 0;
ret=select(upsfd+1, &readfds, NULL, NULL, &tv);
@@ -327,7 +327,7 @@ void upsdrv_shutdown(void)
for(i=0;i<=5;i++)
{
ser_send_char(upsfd, '#');
- usleep(50000);
+ struct timespec delay = {0, 50e6}; nanosleep(&delay, NULL);
}
}
Index: b/drivers/mge-utalk.c
===================================================================
--- a/drivers/mge-utalk.c 2011-05-31 13:36:49.000000000 +0300
+++ b/drivers/mge-utalk.c 2011-08-17 03:26:12.000000000 +0300
@@ -89,7 +89,7 @@ upsdrv_info_t upsdrv_info = {
#define MGE_REPLY_DELAY 1000
/* delay after enable_ups_comm */
-#define MGE_CONNECT_DELAY 500000
+#define MGE_CONNECT_DELAY 500e6
#define MGE_COMMAND_ENDCHAR "\r\n" /* some UPS need \r and \n */
#define MGE_REPLY_ENDCHAR '\r'
@@ -644,7 +644,7 @@ static void disable_ups_comm(void)
{
upsdebugx(1, "disable_ups_comm()");
ser_flush_in(upsfd, "?\r\n", 0);
- usleep(MGE_CONNECT_DELAY);
+ struct timespec delay = {0, MGE_CONNECT_DELAY}; nanosleep(&delay, NULL);
mge_command(NULL, 0, "Ax 0");
}
@@ -659,7 +659,7 @@ static void enable_ups_comm(void)
mge_command(NULL, 0, "Z"); /* send Z twice --- speeds up
re-connect */
mge_command(NULL, 0, "Z");
mge_command(NULL, 0, "Ax 1");
- usleep(MGE_CONNECT_DELAY);
+ struct timespec delay = {0, MGE_CONNECT_DELAY};
nanosleep(&delay, NULL);
}
ser_flush_in(upsfd, "?\r\n", nut_debug_level);
@@ -863,6 +863,7 @@ static int mge_command(char *reply, int
int bytes_rcvd = 0;
int ret;
va_list ap;
+ struct timespec delay;
/* build command string */
va_start(ap, fmt);
@@ -875,11 +876,13 @@ static int mge_command(char *reply, int
va_end(ap);
/* Delay a bit to avoid overlap of a previous answer */
- usleep(100000);
+ delay.tv_sec = 0; delay.tv_nsec = 100e6;
+ nanosleep(&delay, NULL);
/* flush received, unread data */
tcflush(upsfd, TCIFLUSH);
+ delay.tv_sec = 0; delay.tv_nsec = MGE_CHAR_DELAY;
/* send command */
for (p = command; *p; p++) {
if ( isprint(*p & 0xFF) )
@@ -891,7 +894,7 @@ static int mge_command(char *reply, int
return -1;
bytes_sent++;
- usleep(MGE_CHAR_DELAY);
+ nanosleep(&delay, NULL); /* MGE_CHAR_DELAY */
}
/* send terminating string */
@@ -906,14 +909,14 @@ static int mge_command(char *reply, int
return -1;
bytes_sent++;
- usleep(MGE_CHAR_DELAY);
+ nanosleep(&delay, NULL); /* MGE_CHAR_DELAY */
}
}
if ( !reply )
return bytes_rcvd;
else
- usleep(MGE_REPLY_DELAY);
+ nanosleep(&delay, NULL); /* MGE_CHAR_DELAY */
bytes_rcvd = ser_get_line(upsfd, reply, replylen,
MGE_REPLY_ENDCHAR, MGE_REPLY_IGNCHAR, 3, 0);
Index: b/drivers/optiups.c
===================================================================
--- a/drivers/optiups.c 2011-05-31 13:36:49.000000000 +0300
+++ b/drivers/optiups.c 2011-08-17 00:40:17.000000000 +0300
@@ -133,7 +133,7 @@ static ezfill_t _initv[] = {
static inline int optireadline(void)
{
int r;
- usleep(150000);
+ struct timespec delay = {0, 150e6}; nanosleep(&delay, NULL);
r = ser_get_line(upsfd, _buf, sizeof(_buf), ENDCHAR, IGNCHARS, 0,
500000 );
_buf[sizeof(_buf)-1] = 0;
if ( r > 0 )
Index: b/drivers/powerp-bin.c
===================================================================
--- a/drivers/powerp-bin.c 2011-05-31 13:36:49.000000000 +0300
+++ b/drivers/powerp-bin.c 2011-08-17 00:40:17.000000000 +0300
@@ -232,7 +232,7 @@ static int powpan_command(const char *bu
upsdebug_hex(3, "send", buf, bufsize);
- usleep(100000);
+ struct timespec delay = {0, 100e6}; nanosleep(&delay, NULL);
ret = ser_get_buf_len(upsfd, powpan_answer, bufsize-1, SER_WAIT_SEC,
SER_WAIT_USEC);
@@ -427,7 +427,7 @@ static int powpan_status(status_t *statu
upsdebug_hex(3, "send", "D\r", 2);
- usleep(200000);
+ struct timespec delay = {0, 200e6}; nanosleep(&delay, NULL);
ret = ser_get_buf_len(upsfd, status, sizeof(*status), SER_WAIT_SEC,
SER_WAIT_USEC);
@@ -576,7 +576,7 @@ static int powpan_initups(void)
upsdebug_hex(3, "send", "F\r", 2);
- usleep(200000);
+ struct timespec delay = {0, 200e6}; nanosleep(&delay, NULL);
ret = ser_get_line(upsfd, powpan_answer, sizeof(powpan_answer),
ENDCHAR, IGNCHAR, SER_WAIT_SEC, SER_WAIT_USEC);
Index: b/drivers/powerp-txt.c
===================================================================
--- a/drivers/powerp-txt.c 2011-05-31 13:36:49.000000000 +0300
+++ b/drivers/powerp-txt.c 2011-08-17 00:40:17.000000000 +0300
@@ -92,7 +92,7 @@ static int powpan_command(const char *co
upsdebug_hex(3, "send", command, strlen(command));
- usleep(100000);
+ struct timespec delay = {0, 100e6}; nanosleep(&delay, NULL);
ret = ser_get_line(upsfd, powpan_answer, sizeof(powpan_answer),
ENDCHAR, IGNCHAR, SER_WAIT_SEC, SER_WAIT_USEC);
@@ -379,7 +379,7 @@ static int powpan_status(status_t *statu
upsdebug_hex(3, "send", "D\r", 2);
- usleep(200000);
+ struct timespec delay = {0, 200e6}; nanosleep(&delay, NULL);
ret = ser_get_buf_len(upsfd, powpan_answer, 35, SER_WAIT_SEC,
SER_WAIT_USEC);
Index: b/drivers/rhino.c
===================================================================
--- a/drivers/rhino.c 2011-08-17 00:40:17.000000000 +0300
+++ b/drivers/rhino.c 2011-08-17 00:40:17.000000000 +0300
@@ -46,7 +46,7 @@ upsdrv_info_t upsdrv_info = {
{ NULL }
};
-#define UPSDELAY 500 /* 0.5 ms delay */
+#define UPSDELAY 500e3 /* 500e3 ns delay */
typedef int bool_t;
@@ -514,10 +514,10 @@ send_command( int cmd )
for(i=0; i < 19; i++)
{
ret = ser_send_char( upsfd, psend[i] );
- /* usleep ( UPSDELAY ); sending without delay */
+ /* sending without delay */
}
- usleep( UPSDELAY ); /* delay between sent command */
+ struct timespec delay = {0, UPSDELAY}; nanosleep(&delay, NULL); /* delay
between sent command */
kount++;
}
@@ -530,10 +530,9 @@ send_command( int cmd )
static void sendshut( void )
{
- int i;
+ struct timespec delay = {15, 0};
- for(i=0; i < 30000; i++)
- usleep( UPSDELAY ); /* 15 seconds delay */
+ nanosleep(&delay, NULL); /* 15 seconds delay */
send_command( CMD_SHUT );
upslogx(LOG_NOTICE, "Ups shutdown command sent");
Index: b/drivers/tripplite_usb.c
===================================================================
--- a/drivers/tripplite_usb.c 2011-05-31 13:36:49.000000000 +0300
+++ b/drivers/tripplite_usb.c 2011-08-17 00:40:17.000000000 +0300
@@ -680,7 +680,8 @@ static int send_cmd(const unsigned char
}
#if ! defined(__FreeBSD__)
- if(!done) { usleep(1000*100); /* TODO: nanosleep */ }
+ struct timespec delay = {0, 100e6};
+ if(!done) nanosleep(&delay, NULL);
#endif
for(recv_try=0; !done && recv_try < MAX_RECV_TRIES; recv_try++)
{
Index: b/drivers/apcsmart.h
===================================================================
--- a/drivers/apcsmart.h 2011-05-31 13:36:49.000000000 +0300
+++ b/drivers/apcsmart.h 2011-08-17 01:15:16.000000000 +0300
@@ -40,8 +40,10 @@
/* alert characters we care about - OL, OB, LB, not LB, RB, OVER, not OVER */
#define POLL_ALERT "$!%+#?="
-#define UPSDELAY 50000 /* slow down multicharacter commands */
-#define CMDLONGDELAY 1500000 /* some commands need a 1.5s gap for safety */
+#define UPSDELAY 50e6 /* slow down multicharacter commands */
+/* some commands need a CoManD LONG DELay of 1.5s gap for safety */
+#define CMDLONGDELS 1 /* 1 sec out of 1.5s */
+#define CMDLONGDELNS 500e6 /* 500e6 nsec out of 1.5s */
#define SER_WAIT_SEC 3 /* wait up to 3.0 sec for ser_get calls */
#define SER_WAIT_USEC 0
--
To UNSUBSCRIBE, email to [email protected]
with a subject of "unsubscribe". Trouble? Contact [email protected]