/* * Execute */ static int configure_exec(transaction *tr) { tr_ctx_t *tr_ctx = &tr->tr_ctx; arms_context_t *res = arms_get_context(); struct configure_args *arg = tr_ctx->arg; arms_config_cb_t config_cb; int err = 0; if (arg->already_running) { return 0; } config_cb = res->callbacks.config_cb; libarms_log(ARMS_LOG_IPROTO_CONFIG_COMMIT, "Execute configure commit"); if (arg->errs) { arg->commit_err = 1; /* XXX DO NEED IMPLEMENT DISCARD callback? */ #if 0 config_cb(arg->cur_mod_id, "" NULL, ARMS_PUSH_DISCARD_CONFIG, NULL, 0, NULL); #endif return 0; } err = config_cb(arg->cur_mod_id, "", "", ARMS_PUSH_EXEC_STORED_CONFIG, NULL, 0, 0, res->udata); if (err == ARMS_EMODSYNC) { arg->commit_err = 0; arg->syncing = 1; return 0; } else if (err != 0) { /* execute failure, rollback immediately */ err = configure_rollback(tr); /* * exec success --> rollbacked=0,commit_err=0,err=0 * rollback success --> rollbacked=1,commit_err=0,err=0 * rollback failed --> rollbacked=1,commit_err=1,err=!0 */ if (err != 0) { arg->commit_err = 1; return err; } } arg->commit_err = 0; return 0; }
/* * Rollback */ static int configure_rollback(transaction *tr) { tr_ctx_t *tr_ctx = &tr->tr_ctx; arms_context_t *res = arms_get_context(); struct configure_args *arg = tr_ctx->arg; arms_config_cb_t config_cb; int err; if (tr->rollbacked) { /* already rollbacked. */ return -1; } libarms_log(ARMS_LOG_IPROTO_CONFIG_ROLLBACK, "Execute configure rollback"); config_cb = res->callbacks.config_cb; arg->commit_err = 0; tr->rollbacked = 1; err = config_cb(arg->cur_mod_id, "", "", ARMS_PUSH_REVERT_CONFIG, NULL, 0, 0, res->udata); libarms_log(ARMS_LOG_DEBUG, "WAITING FOR ROLLBACK ESTABLISHED"); /* clear send buffer */ tr->len = 0; return err; }
static void button_cb(void *data) { toolbutton_t *b = data; if (b && b->prog) { if (*(b->prog) == '<') { if (BEGMATCH(b->prog, ACT_EXIT)) { close_cb(NULL); return; } else if (BEGMATCH(b->prog, ACT_CONFIG)) { config_cb(NULL); return; } else if (BEGMATCH(b->prog, ACT_SHADE)) { shade_cb(NULL); return; } } Epplet_spawn_command(b->prog); } }
int main(int argc, char **argv) { int j = 0, c = 0; prog_name = argv[0]; atexit(Epplet_cleanup); for (j = 1; j < argc; j++) { if ((!strcmp("-w", argv[j])) && (argc - j > 1)) { w = atoi(argv[++j]); } else if ((!strcmp("-h", argv[j])) && (argc - j > 1)) { h = atoi(argv[++j]); } else if (!strcmp("-c", argv[j])) { c = 1; } } Epplet_Init("E-Toolbox", "0.1", "Enlightenment Toolbox Epplet", w, h, argc, argv, 0); Epplet_load_config(); parse_config(); for (j = 0; j < (int)button_cnt; j++) { create_gadget(j); } Epplet_register_delete_event_handler(delete_cb, NULL); create_shade_window(); Epplet_show(); if (c) { config_cb(NULL); } Epplet_Loop(); return 0; }
static void pt_read_raw(FILE *in, void *context, void (*config_cb)(unsigned interval, double rec_int_secs, unsigned wheel_sz_mm, void *context), void (*time_cb)(struct tm *time, time_t since_epoch, void *context), void (*data_cb)(double secs, double nm, double mph, double watts, double miles, double alt, unsigned cad, unsigned hr, unsigned interval, void *context), void (*error_cb)(const char *msg, void *context)) { unsigned interval = 0; unsigned last_interval = 0; unsigned wheel_sz_mm = 0; double rec_int_secs = 0.0; int i, n, row = 0; unsigned char buf[6]; unsigned sbuf[6]; double meters = 0.0; double secs = 0.0, start_secs = 0.0; double miles; double mph; double nm; double watts; double alt = 0; unsigned cad; unsigned hr; struct tm time; time_t since_epoch; char ebuf[256]; bool bIsVer81 = false; while ((n = fscanf(in, "%x %x %x %x %x %x\n", sbuf, sbuf+1, sbuf+2, sbuf+3, sbuf+4, sbuf+5)) == 6) { ++row; for (i = 0; i < 6; ++i) { if (sbuf[i] > 0xff) { n = 1; break; } buf[i] = sbuf[i]; } if (row == 1) { /* Serial number? */ bIsVer81 = PowerTapUtil::is_Ver81(buf); } else if (PowerTapUtil::is_ignore_record(buf, bIsVer81)) { // do nothing } else if (PowerTapUtil::is_config(buf, bIsVer81)) { double new_rec_int_secs = 0.0; if (PowerTapUtil::unpack_config(buf, &interval, &last_interval, &new_rec_int_secs, &wheel_sz_mm, bIsVer81) < 0) { sprintf(ebuf, "Couldn't unpack config record."); if (error_cb) error_cb(ebuf, context); return; } if ((rec_int_secs != 0.0) && (rec_int_secs != new_rec_int_secs)) { sprintf(ebuf, "Ride has multiple recording intervals, which " "is not yet supported.<br>(Recording interval changes " "from %0.2f to %0.2f after %0.2f minutes of ride data.)\n", rec_int_secs, new_rec_int_secs, secs / 60.0); if (error_cb) error_cb(ebuf, context); return; } rec_int_secs = new_rec_int_secs; if (config_cb) config_cb(interval, rec_int_secs, wheel_sz_mm, context); } else if (PowerTapUtil::is_time(buf, bIsVer81)) { since_epoch = PowerTapUtil::unpack_time(buf, &time, bIsVer81); bool ignore = false; if (start_secs == 0.0) start_secs = since_epoch; else if (since_epoch - start_secs > secs) secs = since_epoch - start_secs; else { sprintf(ebuf, "Warning: %0.3f minutes into the ride, " "time jumps backwards by %0.3f minutes; ignoring it.", secs / 60.0, (secs - since_epoch + start_secs) / 60.0); if (error_cb) error_cb(ebuf, context); ignore = true; } if (time_cb && !ignore) time_cb(&time, since_epoch, context); } else if (PowerTapUtil::is_data(buf, bIsVer81)) { if (wheel_sz_mm == 0) { sprintf(ebuf, "Read data row before wheel size set."); if (error_cb) error_cb(ebuf, context); return; } PowerTapUtil::unpack_data(buf, rec_int_secs, wheel_sz_mm, &secs, &nm, &mph, &watts, &meters, &cad, &hr, bIsVer81); miles = meters / 1000.0 * MILES_PER_KM; if (data_cb) data_cb(secs, nm, mph, watts, miles, alt, cad, hr, interval, context); } else { sprintf(ebuf, "Unknown record type 0x%x on row %d.", buf[0], row); if (error_cb) error_cb(ebuf, context); return; } } if (n != -1) { sprintf(ebuf, "Parse error on row %d.", row); if (error_cb) error_cb(ebuf, context); return; } }