]> Pileus Git - ~andy/csm213a-hw/blobdiff - hw2/main_emit.c
Fix event scheduling bug
[~andy/csm213a-hw] / hw2 / main_emit.c
index bb751a65cd04614a0753514239dbdb3af1bdb79f..e7a8bac2851666598b3055402479829dec9f421d 100644 (file)
@@ -57,15 +57,14 @@ static void emit_setup(void)
        //      |       @  |       @  |       @  |
        //  utc-^                last-^ now-^
        if (emit_period) {
-               uint64_t now   = tdma_time();
+               uint64_t now   = time_to_world(tdma_time());
                uint64_t phase = emit_start % emit_period;
                uint64_t last  = (now / emit_period) * emit_period;
                emit_due = last + phase;
+               time_printf("emit scheduled", emit_due);
        } else {
                emit_due = 0;
        }
-
-       time_printf("emit scheduled", emit_due);
 }
 
 void emit_init(int alt, PinName pin, PinMode mode)
@@ -192,12 +191,15 @@ void emit_transmit(uint64_t local, uint64_t world)
        prev = local;
 
        // Schedule task if needed
-       if (emit_due && emit_period &&
-           world+emit_slack > emit_due) {
+       if (emit_period && world+emit_slack > emit_due) {
                emit_schedule(emit_due);
                emit_due += emit_period;
-               if (emit_due < local)
-                       sirq_printf("missed emit deadline\r\n");
+       }
+       if (emit_period && emit_due < world) {
+               sirq_printf("missed emit deadline\r\n");
+               time_printf("  due   ", emit_due);
+               time_printf("  period", emit_period);
+               time_printf("  world ", world);
+               emit_setup();
        }
 }
-