END_TEST START_TEST (test_write_multiples) { sendCanSignal(&SIGNALS[0], cJSON_CreateNumber(0xa), SIGNALS, SIGNAL_COUNT); sendCanSignal(&SIGNALS[0], cJSON_CreateNumber(0xa), SIGNALS, SIGNAL_COUNT); processCanWriteQueue(&bus); fail_unless(QUEUE_EMPTY(CanMessage, &SIGNALS[1].message->bus->sendQueue)); }
void receiveTranslatedWriteRequest(cJSON* nameObject, cJSON* root) { char* name = nameObject->valuestring; cJSON* value = cJSON_GetObjectItem(root, "value"); // Optional, may be NULL cJSON* event = cJSON_GetObjectItem(root, "event"); CanSignal* signal = lookupSignal(name, getSignals(), getSignalCount(), true); if(signal != NULL) { if(value == NULL) { debug("Write request for %s missing value", name); return; } sendCanSignal(signal, value, getSignals(), getSignalCount()); } else { CanCommand* command = lookupCommand(name, getCommands(), getCommandCount()); if(command != NULL) { command->handler(name, value, event, getSignals(), getSignalCount()); } else { debug("Writing not allowed for signal with name %s", name); } } }
END_TEST START_TEST (test_no_write_handler) { sendCanSignal(&SIGNALS[0], cJSON_CreateNumber(0xa), SIGNALS, SIGNAL_COUNT); bus.writeHandler = NULL; processCanWriteQueue(&bus); fail_unless(QUEUE_EMPTY(CanMessage, &SIGNALS[1].message->bus->sendQueue)); }
END_TEST START_TEST (test_force_send) { fail_if(sendCanSignal(&SIGNALS[1], cJSON_CreateString(SIGNAL_STATES[0][1].name), customStateWriter, SIGNALS, SIGNAL_COUNT, true)); ck_assert_int_eq(1, QUEUE_LENGTH(CanMessage, &SIGNALS[1].message->bus->sendQueue)); }
END_TEST START_TEST (test_send_using_default) { fail_unless(sendCanSignal(&SIGNALS[0], cJSON_CreateNumber(0xa), SIGNALS, SIGNAL_COUNT)); CanMessage queuedMessage = QUEUE_POP(CanMessage, &SIGNALS[0].message->bus->sendQueue); ck_assert_int_eq(queuedMessage.data, 0x1e); }
END_TEST START_TEST (test_send_with_custom_with_states) { fail_unless(sendCanSignal(&SIGNALS[1], cJSON_CreateString(SIGNAL_STATES[0][1].name), SIGNALS, SIGNAL_COUNT)); CanMessage queuedMessage = QUEUE_POP(CanMessage, &SIGNALS[1].message->bus->sendQueue); ck_assert_int_eq(queuedMessage.data, 0x20); }
bool handleTurnSignalCommand(const char* name, cJSON* value, cJSON* event, CanSignal* signals, int signalCount) { const char* direction = value->valuestring; CanSignal* signal = NULL; if(!strcmp("left", direction)) { signal = lookupSignal("turn_signal_left", signals, signalCount); } else if(!strcmp("right", direction)) { signal = lookupSignal("turn_signal_right", signals, signalCount); } if(signal != NULL) { return sendCanSignal(signal, cJSON_CreateBool(true), booleanWriter, signals, signalCount, true); } else { debug("Unable to find signal for %s turn signal", direction); } return false; }
bool sendCanSignal(CanSignal* signal, cJSON* value, CanSignal* signals, int signalCount) { uint64_t (*writer)(CanSignal*, CanSignal*, int, cJSON*, bool*) = signal->writeHandler; return sendCanSignal(signal, value, writer, signals, signalCount); }