#include <stdio.h>
#include <time.h> // use for test. not available on IDE
time_t getElapsedSecond(int yyyy, int mm, int dd, int hh, int nn, int ss){
struct tm workdt;
workdt.tm_isdst = -1; // summer time flag
workdt.tm_year = yyyy - 1900;
workdt.tm_mon = mm - 1;
workdt.tm_mday = dd;
workdt.tm_hour = hh;
workdt.tm_min = nn;
workdt.tm_sec = ss;
}
void getDateTimeString(time_t srcdt, char *dstPtr)
{
if (dstPtr == NULL) {
return; // error
}
struct tm *workdt;
workdt->tm_year = workdt->tm_year + 1900;
sprintf(dstPtr
, "%04d/%02d/%02d %02d:%02d:%02d", workdt->tm_year, workdt->tm_mon + 1, workdt->tm_mday,
workdt->tm_hour, workdt->tm_min, workdt->tm_sec
);
}
typedef struct {
unsigned int OI; // [s]
unsigned int MI; // [s]
unsigned int W; // [s]
unsigned int R; // [s]
unsigned int N; // [s]
} SETTING_t;
time_t getNextWtime(time_t torigin, time_t tnow, SETTING_t *setPtr)
{
if (setPtr == NULL) {
return 0; // error // TOOD: 0z > use error value for time_t
}
// case 1: (now - origin) % OI == 0
unsigned long A = (tnow - torigin) / setPtr->OI;
if ((tnow - torigin) % setPtr->OI == 0) {
return torigin + (A + 1) * setPtr->OI;
}
// case 2: (now - origin) % OI != 0
// case 2-a: (now - A*OI) % MI == 0
// case 2-b: (now - A*OI) % MI != 0
return 0; // TODO: 0z > remove after debug
}
void AssertCheck(time_t torigin, time_t tnow, time_t tnextWans, SETTING_t *setPtr)
{
char szbuf[30];
if (setPtr == NULL) {
return; // error
}
time_t tnextWres = getNextWtime(torigin, tnow, setPtr);
getDateTimeString(tnow, szbuf);
getDateTimeString(tnextWres, szbuf);
printf("%c", (tnextWres
== tnextWans
) ? 'T' : 'F'); }
void Test_group_run()
{
time_t torigin = getElapsedSecond(2017, 8, 2, 13, 48, 55);
SETTING_t setting = { 3600, 600, 60, 5, 3 }; // OI, MI, W, R, N
// case (2)
AssertCheck(torigin,
getElapsedSecond(2017, 8, 2, 13, 48, 55),
getElapsedSecond(2017, 8, 2, 14, 48, 55),
&setting);
}
int main(void) {
Test_group_run();
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDx0aW1lLmg+IC8vIHVzZSBmb3IgdGVzdC4gbm90IGF2YWlsYWJsZSBvbiBJREUKCnRpbWVfdCBnZXRFbGFwc2VkU2Vjb25kKGludCB5eXl5LCBpbnQgbW0sIGludCBkZCwgaW50IGhoLCBpbnQgbm4sIGludCBzcyl7CiAgICBzdHJ1Y3QgdG0gd29ya2R0OwogICAgd29ya2R0LnRtX2lzZHN0ID0gLTE7IC8vIHN1bW1lciB0aW1lIGZsYWcKICAgIHdvcmtkdC50bV95ZWFyID0geXl5eSAtIDE5MDA7CiAgICB3b3JrZHQudG1fbW9uID0gbW0gLSAxOwogICAgd29ya2R0LnRtX21kYXkgPSBkZDsKICAgIHdvcmtkdC50bV9ob3VyID0gaGg7CiAgICB3b3JrZHQudG1fbWluID0gbm47CiAgICB3b3JrZHQudG1fc2VjID0gc3M7CiAgICByZXR1cm4gbWt0aW1lKCZ3b3JrZHQpOwp9Cgp2b2lkIGdldERhdGVUaW1lU3RyaW5nKHRpbWVfdCBzcmNkdCwgY2hhciAqZHN0UHRyKQp7CiAgICBpZiAoZHN0UHRyID09IE5VTEwpIHsKICAgICAgICByZXR1cm47IC8vIGVycm9yCiAgICB9CiAgICBzdHJ1Y3QgdG0gKndvcmtkdDsKICAgIHdvcmtkdCA9IGxvY2FsdGltZSgmc3JjZHQpOyAKICAgIHdvcmtkdC0+dG1feWVhciA9IHdvcmtkdC0+dG1feWVhciArIDE5MDA7CiAgICBzcHJpbnRmKGRzdFB0ciwgIiUwNGQvJTAyZC8lMDJkICUwMmQ6JTAyZDolMDJkIiwgCiAgICAgICAgd29ya2R0LT50bV95ZWFyLCB3b3JrZHQtPnRtX21vbiArIDEsIHdvcmtkdC0+dG1fbWRheSwgCiAgICAgICAgd29ya2R0LT50bV9ob3VyLCB3b3JrZHQtPnRtX21pbiwgd29ya2R0LT50bV9zZWMKICAgICk7Cn0KCnR5cGVkZWYgc3RydWN0IHsKCXVuc2lnbmVkIGludCBPSTsgLy8gW3NdCgl1bnNpZ25lZCBpbnQgTUk7IC8vIFtzXQoJdW5zaWduZWQgaW50IFc7IC8vIFtzXQoJdW5zaWduZWQgaW50IFI7IC8vIFtzXQoJdW5zaWduZWQgaW50IE47IC8vIFtzXQp9IFNFVFRJTkdfdDsKCnRpbWVfdCBnZXROZXh0V3RpbWUodGltZV90IHRvcmlnaW4sIHRpbWVfdCB0bm93LCBTRVRUSU5HX3QgKnNldFB0cikKewoJaWYgKHNldFB0ciA9PSBOVUxMKSB7CgkJcmV0dXJuIDA7IC8vIGVycm9yIC8vIFRPT0Q6IDB6ID4gdXNlIGVycm9yIHZhbHVlIGZvciB0aW1lX3QKCX0KCS8vIGNhc2UgMTogKG5vdyAtIG9yaWdpbikgJSBPSSA9PSAwCgl1bnNpZ25lZCBsb25nIEEgPSAodG5vdyAtIHRvcmlnaW4pIC8gc2V0UHRyLT5PSTsKCWlmICgodG5vdyAtIHRvcmlnaW4pICUgc2V0UHRyLT5PSSA9PSAwKSB7CgkJcmV0dXJuIHRvcmlnaW4gKyAoQSArIDEpICogc2V0UHRyLT5PSTsKCX0KCgkvLyBjYXNlIDI6IChub3cgLSBvcmlnaW4pICUgT0kgIT0gMAoKCS8vICAgY2FzZSAyLWE6IChub3cgLSBBKk9JKSAlIE1JID09IDAKCQoJLy8gICBjYXNlIDItYjogKG5vdyAtIEEqT0kpICUgTUkgIT0gMAoJCglyZXR1cm4gMDsgLy8gVE9ETzogMHogPiByZW1vdmUgYWZ0ZXIgZGVidWcKfQoKdm9pZCBBc3NlcnRDaGVjayh0aW1lX3QgdG9yaWdpbiwgdGltZV90IHRub3csIHRpbWVfdCB0bmV4dFdhbnMsIFNFVFRJTkdfdCAqc2V0UHRyKQp7CgljaGFyIHN6YnVmWzMwXTsKCWlmIChzZXRQdHIgPT0gTlVMTCkgewoJCXJldHVybjsgLy8gZXJyb3IKCX0KCXRpbWVfdCB0bmV4dFdyZXMgPSBnZXROZXh0V3RpbWUodG9yaWdpbiwgdG5vdywgc2V0UHRyKTsKCiAgICBnZXREYXRlVGltZVN0cmluZyh0bm93LCBzemJ1Zik7CglwcmludGYoIiVzIC0gIiwgc3pidWYpOwogICAgZ2V0RGF0ZVRpbWVTdHJpbmcodG5leHRXcmVzLCBzemJ1Zik7CglwcmludGYoIiVzOiIsIHN6YnVmKTsKCXByaW50ZigiJWMiLCAodG5leHRXcmVzID09IHRuZXh0V2FucykgPyAnVCcgOiAnRicpOwoJcHJpbnRmKCJcclxuIik7Cn0KCnZvaWQgVGVzdF9ncm91cF9ydW4oKQp7Cgl0aW1lX3QgdG9yaWdpbiA9IGdldEVsYXBzZWRTZWNvbmQoMjAxNywgOCwgMiwgMTMsIDQ4LCA1NSk7CglTRVRUSU5HX3Qgc2V0dGluZyA9IHsgMzYwMCwgNjAwLCA2MCwgNSwgMyB9OyAvLyBPSSwgTUksIFcsIFIsIE4KCgkvLyBjYXNlICgyKQoJQXNzZXJ0Q2hlY2sodG9yaWdpbiwKCQkgICAgICAgIGdldEVsYXBzZWRTZWNvbmQoMjAxNywgOCwgMiwgMTMsIDQ4LCA1NSksCiAgICAgICAgICAgCSAgICBnZXRFbGFwc2VkU2Vjb25kKDIwMTcsIDgsIDIsIDE0LCA0OCwgNTUpLAoJICAgICAgICAgICAgJnNldHRpbmcpOwoJCn0KCmludCBtYWluKHZvaWQpIHsKCVRlc3RfZ3JvdXBfcnVuKCk7CgoJcmV0dXJuIDA7Cn0=