/** * Config-to-Object function. * Creates a LedHardware model from a prefs node * @note you shouldn't call this function directly. * It's used by nft_prefs_obj_from_node() etc. */ static NftResult _prefs_to_hardware(LedPrefs * p, void **newObj, NftPrefsNode * n, void *userptr) { if(!p || !newObj || !n) NFT_LOG_NULL(NFT_FAILURE); /** initial result */ NftResult r = NFT_FAILURE; char *name = NULL; char *id = NULL; char *plugin_name = NULL; LedHardware *h = NULL; /* get hardware name */ if(! (name = nft_prefs_node_prop_string_get(n, LED_HARDWARE_PROP_NAME))) { NFT_LOG(L_ERROR, "\"hardware\" has no name"); goto _pth_end; } /* get plugin-name */ if(! (plugin_name = nft_prefs_node_prop_string_get(n, LED_HARDWARE_PROP_PLUGIN))) { NFT_LOG(L_ERROR, "\"hardware\" has no \"plugin\" type"); goto _pth_end; } /* get plugin-id */ if(!(id = nft_prefs_node_prop_string_get(n, LED_HARDWARE_PROP_ID))) { NFT_LOG(L_ERROR, "\"hardware\" has no \"id\" type"); goto _pth_end; } /* get stride */ LedCount stride; if(! (nft_prefs_node_prop_int_get (n, LED_HARDWARE_PROP_STRIDE, (int *) &stride))) { NFT_LOG(L_WARNING, "\"hardware\" has no \"stride\". Using 0 as default."); stride = 0; } /* create new hardware object */ if(!(h = led_hardware_new(name, plugin_name))) { NFT_LOG(L_ERROR, "Failed to initialize \"%s\" from \"%s\" plugin.", name, plugin_name); goto _pth_end; } /* set stride */ if(!(led_hardware_set_stride(h, stride))) { NFT_LOG(L_ERROR, "Failed to set stride (%d) of hardware \"%s\"", stride, name); goto _pth_end; } /* set id */ if(!(led_hardware_set_id(h, id))) { NFT_LOG(L_ERROR, "Failed to set ID \"%s\" of hardware \"%s\"", id, name); goto _pth_end; } /** @todo handle custom properties */ /* process child nodes */ LedPrefsNode *child; for(child = nft_prefs_node_get_first_child(n); child; child = nft_prefs_node_get_next(child)) { /* is child a tile node? */ if(led_prefs_is_tile_node(child)) { if(!led_hardware_append_tile (h, led_prefs_tile_from_node(p, child))) { NFT_LOG(L_ERROR, "Failed to add \"tile\" to \"%s\". Aborting.", name); goto _pth_end; } continue; } /* is child a chain node? */ else if(led_prefs_is_chain_node(child)) { LedChain *c; if(!(c = led_prefs_chain_from_node(p, child))) { NFT_LOG(L_ERROR, "Failed to create \"chain\" node of hardware %s", name); goto _pth_end; } if(!led_hardware_init (h, id, led_chain_get_ledcount(c), led_pixel_format_to_string(led_chain_get_format (c)))) { NFT_LOG(L_WARNING, "Failed to initialize hardware \"%s\"", name); } led_chain_destroy(c); } /* is child a plugin-property node? */ else if(strcmp (nft_prefs_node_get_name(child), LED_HARDWARE_PROPERTY_NAME) == 0) { char *name = NULL; char *type = NULL; char *value = NULL; /* get name of property */ if(! (name = nft_prefs_node_prop_string_get(child, LED_HARDWARE_PROPERTY_PROP_NAME))) { NFT_LOG(L_ERROR, "\"%s\" has no \"%s\" property", LED_HARDWARE_PROPERTY_NAME, LED_HARDWARE_PROPERTY_PROP_NAME); goto _pthp_end; } /* type of property */ if(! (type = nft_prefs_node_prop_string_get(child, LED_HARDWARE_PROPERTY_PROP_TYPE))) { NFT_LOG(L_ERROR, "\"%s\" has no \"%s\" property", LED_HARDWARE_PROPERTY_NAME, LED_HARDWARE_PROPERTY_PROP_TYPE); goto _pthp_end; } /* property value */ if(! (value = nft_prefs_node_prop_string_get(child, LED_HARDWARE_PROPERTY_PROP_VALUE))) { NFT_LOG(L_ERROR, "\"%s\" has no \"%s\" property", LED_HARDWARE_PROPERTY_NAME, LED_HARDWARE_PROPERTY_PROP_VALUE); goto _pthp_end; } /* decide about type */ switch (led_hardware_plugin_prop_type_from_string (type)) { /* int */ case LED_HW_CUSTOM_PROP_INT: { int integer; if(sscanf(value, "%32d", &integer) != 1) { NFT_LOG(L_ERROR, "Failed to parse integer from \"%s\" property (\"%s\")", LED_HARDWARE_PROPERTY_PROP_VALUE, value); goto _pthp_end; } if(!led_hardware_plugin_prop_set_int (h, name, integer)) { NFT_LOG(L_ERROR, "Failed to set \"%s\" = %d)", name, integer); goto _pthp_end; } break; } /* float */ case LED_HW_CUSTOM_PROP_FLOAT: { float f; if(sscanf(value, "%64f", &f) != 1) { NFT_LOG(L_ERROR, "Failed to parse float from \"%s\" property (\"%s\")", LED_HARDWARE_PROPERTY_PROP_VALUE, value); goto _pthp_end; } if(!led_hardware_plugin_prop_set_float (h, name, f)) { NFT_LOG(L_ERROR, "Failed to set \"%s\" = %f)", name, f); goto _pthp_end; } break; } /* string */ case LED_HW_CUSTOM_PROP_STRING: { if(!led_hardware_plugin_prop_set_string(h, name, value)) { NFT_LOG(L_ERROR, "Failed to set \"%s\" = \"%s\")", name, value); goto _pthp_end; } break; } /* huh? */ default: { NFT_LOG(L_ERROR, "Invalid plugin-property type: \"%s\"", type); break; } } _pthp_end: nft_prefs_free(name); nft_prefs_free(type); nft_prefs_free(value); continue; } else { NFT_LOG(L_WARNING, "Attempt to add \"%s\" node to hardware. Not allowed. (Ignoring node)", nft_prefs_node_get_name(child)); continue; } } /* everything pico bello */ r = NFT_SUCCESS; _pth_end: /* free strings */ nft_prefs_free(id); nft_prefs_free(plugin_name); nft_prefs_free(name); /* newly created hardware object */ *newObj = h; return r; }
int main(int argc, char *argv[]) { nft_log_level_set(L_DEBUG); /* register new dummy hardware called "nlo01" */ LedHardware *h; if(!(h = led_hardware_new("nlo01", "dummy"))) { NFT_LOG(L_ERROR, "Hardware creation FAILED"); return -1; } /* initialize any hardware that can be found (id="*"), define 12 * connected LEDs (4 BGR pixels). Greyscale data should be provided in * unsigned 8-bit format */ if(!led_hardware_init(h, "*", 12, "BGR u8")) { NFT_LOG(L_ERROR, "failed to initialize hardware"); return -1; } /********************************************************************** * niftyled basically provides 2 ways to send data to LED hardware: * * 1. set "raw" greyscale value of a LED in a chain connected to a * correctly initialized LED hardware * * 1.1 use the API to set each greyscale value * * 1.2 directly write to the RAW buffer * * * 2. send a complete pixelframe and have niftyled translate that to * mapped LEDs connected to one or more LED hardware devices * according to the current setup configuration (where each LED * has been assigned a X/Y coordinate and a "Component" that refers * to a component of a pixel at this position in the pixelframe) */ /****** METHOD 1.1 *******/ /* get chain of this hardware */ LedChain *c = led_hardware_get_chain(h); /* set all LEDs to half brightness */ LedCount l; for(l = 0; l < led_chain_get_ledcount(c); l++) { led_chain_set_greyscale(c, l, 128); } /* send data to hardware */ led_hardware_send(h); /* show previously sent hardware (latch to LEDs) */ led_hardware_show(h); /****** METHOD 1.2 *******/ /* ...or access raw pixelbuffer */ uint8_t *pixels = led_chain_get_buffer(c); /* walk all pixels to turn on all LEDs */ int i; for(i = 0; i < 16; i++) pixels[i] = 0xff; /* send data to hardware */ led_hardware_send(h); /* show previously sent hardware (latch to LEDs) */ led_hardware_show(h); /****** METHOD 2 - s. ledcat sources *******/ /* deinitialize hardware */ led_hardware_deinit(h); return 0; }