![]() |
"Bernd Proissl" <news@proissl.de> writes: Excuse me, but I am already tired of all this. Again, I think the correct init sequence is Config parameter default =================================== <Drop DTR> ModemSoftResetCmd ATZ ModemResetCmds "" (not executed if empty) ModemReSetechoOffCmd ATE0 \ ModemReVerboseResultsCmd ATV1 \ everything Hylafax needs ModemResultCodesCmd ATQ0 / (merged into one command string) ModemNoAutoAnswerCmd ATS0=0 / ... / Your sequence is Config parameter default =================================== <Drop DTR> ModemResetCmds "" ModemSoftResetCmd ATZ ModemResetCmds "" ModemResetechoOffCmd ATE0 \ ModemReVerboseResultsCmd ATV1 \ everything Hylafax needs ModemResultCodesCmd ATQ0 / (merged into one command string) ModemNoAutoAnswerCmd ATS0=0 / ... / I don't like it. First ModemResetCmds is useless and its settings will be overwritten by ATZ (ModemSoftResetCmd). If you need something really non-standard, place ModemSoftResetCmd "really odd stuff" or ModemSoftResetCmd "ATZ\nreally odd stuff" (will wait for intermediate OK) or even ModemSoftResetCmd "really odd stuff\nATZ\nreally odd stuff" in your config.<device> Remember, you can specify ANY values for ModemResetCmds and ModemSoftResetCmd in your config.<defice>, if you are really looking for trouble! > (2) send ATZ (or whatever is configured in config.*, if there is anything at all) > as a separate command to the modem (some modems ignore anything after ATZ) atCmd(conf.softResetCmd, AT_OK, conf.resetDelay) does exactly that. > give the modem time to handle this, maybe another new parameter? man config for ModemResetDelay. > > (3) do all of the hylafax specific setup apart from ModemResetCmds, softreset(ATZ) > > give the modem time to handle this, maybe again a new parameter? delault 30 sec is always used: class ClassModem { ... bool atCmd(const fxStr& cmd, ATResponse = AT_OK, long ms = 30*1000); It's enough for ALL modems. > (4) Dmitry, i am not sure about this, i am not familiar with C++ specs > (and i never would rely on compiler buildes that their work > is according to the specs!): > can you predict the order of execution for the bot atCmd()s? > > return atCmd(conf.softResetCmd, AT_OK, conf.resetDelay) && > atCmd(resetCmds, AT_OK, ms); > > -> i would separate them in 2 commands! Oh my God! I have to explain even ELEMENTARY things :-( A quote from C++ standard: [---cut---] 5.14 - Logical AND operator [expr.log.and] logical-and-expression: inclusive-or-expression logical-and-expression && inclusive-or-expression -1- The && operator groups left-to-right. The operands are both implicitly converted to type bool (clause conv). The result is true if both operands are true and false otherwise. Unlike &, && guarantees left-to-right evaluation: the second operand is not evaluated if the first operand is false. -2- The result is a bool. All side effects of the first expression except for destruction of temporaries (class.temporary) happen before the second expression is evaluated. [---cut---] (a && b) is evaluated this way in C/C++ since the very begining (K&R era) !!! > (5) see (3) > > > adding this many delay parameters may help in optimizing the lengthy reset > sequence. > > BTW: from a very quick look at the code: > i am not sure if AT_NOTHING is handled correctly by ::atCmd(). It's handled correctly, you just incorrectly use it. :-) > what do you think about this?? I think that we should stop the discussion. I will NOT implement any other init-related parameters, delays, etc. There are many other real problems in Hylafax that should be addressed. Hope to hear from you soon, Dmitry