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); } } }
static int allocateCommandDescriptors (void) { if (!commandDescriptors) { commandCount = getCommandCount(); commandDescriptors = malloc(commandCount * commandSize); if (!commandDescriptors) { logMallocError(); return 0; } { CommandDescriptor *descriptor = commandDescriptors; const CommandEntry *entry = commandTable; while (entry->name) { descriptor->entry = entry++; descriptor->count = 0; ++descriptor; } } sortCommandsByCode(); { CommandDescriptor *descriptor = commandDescriptors + commandCount; int previousBlock = -1; while (descriptor-- != commandDescriptors) { int code = descriptor->entry->code; int currentBlock = code & BRL_MSK_BLK; if (currentBlock != previousBlock) { if (currentBlock) { descriptor->count = (BRL_MSK_ARG + 1) - (code & BRL_MSK_ARG); } previousBlock = currentBlock; } } } sortCommandsByName(); } return 1; }