Jump to content

bjustice

Members
  • Posts

    152
  • Joined

  • Last visited

  • Days Won

    10

Posts posted by bjustice

  1. Our code supports nested and arrays of classes that inherit from the base "Serializable.lvclass" gracefully.

    Classes are represented as a nested cluster in the serializable string (JSON, XML, TOML)

    Objects that don't inherit from the base "Serializable.lvclass" are treated in the same manner as JSONtext handles objects... flatten/unflatten from string.  If error on unflatten, then return default object

  2. We adopted the notion that classes must inherit from a base "serializable.lvclass".  This activates the Project Provider plugin (project tree scripting methods).  We didn't see a convenient way around this, and we didn't see this as too much of an inconvenience.

    Where we noticeably diverged from AQ Char Lineator is that we (through scripting) create a "SerializableData" cluster typedef that gets dropped into the class private data.  Only data within this cluster is consumed by the serialization framework.  all other data is ignored.  This simplified things in that we only need a single future-proof data read/write accessor for this cluster.  A user can update serializable data by only editing this typedef... they don't have to touch any VI source code.

    Pros and cons to this solution.

    • Like 1
  3. While researching this, I discovered 2 other projects that solved serialization of objects using (de-)composition of private data using the flatten to string and TypeDescriptors:

    JSONtext branch with object support:
    https://bitbucket.org/logmanoriginal/jsontext/src/lvobjectserialization/

    paid 3rd party library "JSON Object Serialization by GCraftsman":
    http://sine.ni.com/nips/cds/view/p/lang/en/nid/215788

    • Like 1
  4. I would certainly be interested in taking a look.

    Internally, we made the early decision that we didn't want to directly access class private data through string flattening or by inspecting the class' *.ctl file.  We felt that this violated the covenant that class data should only be accessed through data accessors.  As such, we moved towards a Project Provider plugin framework that scripts accessing of class private to work with our serialization engine.

    • Like 1
  5. Per: https://zone.ni.com/reference/en-XX/help/371361B-01/lvconcepts/type_descriptors/

    Quote

    The first word (16 bits) in any type descriptor is the length, in bytes, of that type descriptor, including the length word. The second word (16 bits) is the type code. LabVIEW reserves the high-order byte of the type code (the xx in the following tables) for internal use. When comparing two type descriptors for equality, you should ignore this byte.

    I wonder if the fixed point was in some sort of weird BETA state in LV 2009

  6. Ok, so, now knowing this information, it seems like the following needs to happen:

    • Add the following to: "Type Descriptor Enumeration__ogtk.ctl"
      • "Fixed Point"
      • "Map Collection"
      • "Set Collection"
    • Add the following to: "Refnum Subtype Enum__ogtk.ctl"
      • "LabVIEW Class Instance"
    • Update the holy LabVIEW wiki

    It's interesting to learn here that we can't 1:1 match "Type Descriptor Enumeration__ogtk.ctl" to "NI_Data Type.lvlib:Data Type.ctl" since these are inherently different

  7. At an absolute minimum, would there be any interest here in releasing a new update for the OpenG LabVIEW Data VIPM package to include the following datatypes in the OpenG TD?:

    • LabVIEW Class instance
    • Map
    • Set

    It seems like this would be an easy and backwards compatible update.
    I make this request because legacy code such as EasyXML heavily leverage the OpenG TD.  It would be minor hassle to replace this with the native LV TD.

  8. I did a deep dive into JSONtext, JKIJSON, and into EasyXML.
    I made a few interesting observations after doing a bunch of work to integrate object serialization into a branch of these libraries.
    Basically, beware usage of OpenG LabVIEW Data Palette SubVIs when working with LabVIEW objects

     

    1) The OpenG TD doesn't include "LabVIEW Class Instance" (or any of the new datatypes either... maps, sets)

    image.png.d33339b15c060c990c00f3c0c089dc4e.png

     

    2) In the following code, note how the top method produces an error, but the bottom method is fine:

    image.png.18c0aa35c97bab79ee606acede7ac0d0.png

     

    3) In the following code, note how the top method produces an error, but the bottom method is fine:

    image.png.350afee6e67fa5f840e93c46fbe6af42.png

    • Like 1
  9. Riiight, so Hooovahh is hitting the nail on the head here with my thoughts exactly.

    Quote

    I'd estimate I probably have wanted to create a constant, control, or indicators from those conditions probably 5% of the time.  The other 95% I want to change the tunnel options or make that datatype the selector input.

    It would have been nice to maybe make the plugin menu a bit more intelligent such that it wouldn't have these "create constant, create indicator, create control" for these situations.

    The consistency argument is interesting and not something that I had considered.

    Give me 2 months with this new change, and I'll report back on how my muscle memory and opinion has changed.  I might indeed be the old man yelling at a cloud right now.

    I'm trying to beat Darren for fastest programmer in the world, so muscle memory plays alot into things like right click menus and quickdrop names

  10. I've started working in LabVIEW 2019 SP1, and I've observed that the right-click menu on the block diagram has changed such that "create constant/control/indicator" are always at the top for almost every block diagram action.  Example:

    image.png.3b36a804ecf458f9959979fbc730a34a.pngimage.png.d57c9ae421a788f10e7e68e3270eaa37.png 

     

    If I recall, this was a pretty popular right-click menu plugin that alot of LAVA folks were using in prior versions of LabVIEW.  It looks like NI simply cemented the idea in base LabVIEW 2019.

    I'm just curious though, does anyone here find this annoying?  It's really wreaking havoc on my muscle memory.  Furthermore, in situations such as above with a case structure, I'd much prefer the "Replace with case selector" to always be the top-item

     

     

  11. I've not run into a situation where I've needed to get the actual image data into LabVIEW.  I've mostly needed to handle file streaming to/from disk.  It would be easier to use files on disk as a middleman between LabVIEW and FFMPEG.  If you need a live streaming solution to LabVIEW, then you probably need a different technology

    I've never run into the situation where I've needed to send the "q" command.  The ctrl-c command exits properly for everything I've needed, even for bad commands or non-connected cameras.  I've not run into any crashing

    I've attached an example of a piece of code that will stream an RTSP stream to a file on disk.  This also contains a copy of a FFMPEG build that I've found to be pretty stable.

    I'm not sure that I fully understand what you're trying to do

     

    distro.zip

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.