[Nut-upsdev] [RFC apcsmart V3 16/18] drivers/apcsmart.c: don't overuse UPSDELAY
Michal Soltys
soltys at ziu.info
Sat Mar 5 10:38:33 UTC 2011
This delay is meant for multicharacter commands, besides
we always guarantee delay by other means - so do the stuff properly.
Signed-off-by: Michal Soltys <soltys at ziu.info>
---
drivers/apcsmart.c | 17 +++++++++--------
1 files changed, 9 insertions(+), 8 deletions(-)
diff --git a/drivers/apcsmart.c b/drivers/apcsmart.c
index 0a6a56b..63b91b5 100644
--- a/drivers/apcsmart.c
+++ b/drivers/apcsmart.c
@@ -854,13 +854,15 @@ static int sdcmd_S(int dummy)
}
/* soft hibernate, hack version for CS 350 */
-static int sdcmd_CS(int tval)
+static int sdcmd_CS(int status)
{
+ char temp[16];
+
upsdebugx(1, "Using CS 350 'force OB' shutdown method");
- if (tval & APC_STAT_OL) {
+ if (status & APC_STAT_OL) {
upsdebugx(1, "On-line - forcing OB temporarily");
ser_send_char(upsfd, 'U');
- usleep(UPSDELAY);
+ ser_get_line(upsfd, temp, sizeof(temp), ENDCHAR, IGNCHARS, SER_WAIT_SEC, SER_WAIT_USEC);
}
return sdcmd_S(tval);
}
@@ -874,7 +876,7 @@ static int sdcmd_ATn(int cnt)
{
int n = 0, mmax, ret;
const char *strval;
- char timer[4];
+ char temp[16];
mmax = cnt == 2 ? 99 : 999;
@@ -885,14 +887,14 @@ static int sdcmd_ATn(int cnt)
n = 0;
}
- snprintf(timer, sizeof(timer), "%.*d", cnt, n);
+ snprintf(temp, sizeof(temp), "%.*d", cnt, n);
ser_flush_in(upsfd, IGNCHARS, nut_debug_level);
upsdebugx(1, "Issuing hard hibernate with %d minutes additional wakeup delay", n*6);
ser_send_char(upsfd, APC_CMD_GRACEDOWN);
usleep(CMDLONGDELAY);
- ser_send_pace(upsfd, UPSDELAY, timer);
+ ser_send_pace(upsfd, UPSDELAY, temp);
ret = sdok();
if (ret || cnt == 3)
@@ -905,8 +907,7 @@ static int sdcmd_ATn(int cnt)
* silent (YMMV);
*/
ser_send_char(upsfd, APC_CMD_GRACEDOWN);
- usleep(UPSDELAY);
- ser_flush_in(upsfd, IGNCHARS, nut_debug_level);
+ ser_get_line(upsfd, temp, sizeof(temp), ENDCHAR, IGNCHARS, SER_WAIT_SEC, SER_WAIT_USEC);
return 0;
}
--
1.7.2.1
More information about the Nut-upsdev
mailing list