Jump to content

ShaunR

Members
  • Posts

    4,849
  • Joined

  • Days Won

    292

Posts posted by ShaunR

  1. 20 hours ago, codcoder said:

    Yes, of course. I can't argue with that (and since English isn't my first language and all my experience comes from my small part of the world, it's hard for me to argue in general 😁).

    English *is* my first language and I'm not as eloquent as you are. There is no real argument here, though.

    21 hours ago, codcoder said:

    But that shouldn't mean LabVIEW development is stagnating or dying. It's just that those areas where NI excel in general aren't as big and thriving compared to other.

    I still use LabVIEW 2009 for development because there is little that the later versions offered of significance. It's also robust, stable and fast. That cannot always be said for some of the later versions (looking at you 2011/2012). Some features that actually got us excited weren't even on the roadmap (VIM's anyone?). NI have been so far behind the curve for features that we want that we have all created our own solutions so if one of them actually gets implemented, it's a moot feature. TLS/SSL, for example was only released in LV2020 but I (and Rolf) had created solutions a decade before that. The one thing we have been yelling at NI about for about 15 years is Unicode which we cannot really make a native solution for. This is why I laughed when it was mentioned in this talk. I moved to HTML UI's and relegated LabVIEW to a back-end service through Websockets which solved the problem but it's a sledgehammer to crack a nut.

    • Like 1
  2. 2 hours ago, codcoder said:

    Idk, why should the failure of NXG mark the failue of NI?

    I don't think anyone is saying that, so much, with respect to NI as a whole. But the effort and investment in NXG made LabVIEW (Classic?) the withered limb of NI, Now they have lots of C# devs who can't do jack with LabVIEW. From this seminar, it looks like this is a solution (lots of C# devs) looking for a problem (Cloudy stuff) and they see LabVIEW as a stagnant technology instead of the axiomatic driver behind their hardware it actually is.

    Don't get me wrong. They can very easily move into this space and do all the cloudy stuff. But their view of how this will fit together is flawed (IMO). They are viewing it purely like an IT system rolling out images (think AWS Compute-IAAS) when, in fact, those images will be highly specialised LabVIEW installations for very specific and usually custom hardware configurations. 

    2 hours ago, codcoder said:

    But it never as been and that shouldn't mean it can't be thriving in the world it was originally conceived for.

    They lost Test and Measurement to Python a while ago-arguably the mainstay for LabVIEW.

    • Like 2
  3. 37 minutes ago, Elbek Keskinoglu said:

    represent different experimental setups

    I've really no idea what this means.

    If you are just looking for a volume of any code then VIPM has hundreds of libraries (with source) that you can train on. You will have 10's of thousand of VI's with source to point your algorithm at. Apart from that, you will have to be more specific.

    image.png.3c4075676f66655cb30019469c729ecd.png

    Artificial Insemination is coming for us, boys and girls.:lol:

    • Like 1
  4. Chasing the golden geese, it seems.:lol:

    Interesting stuff throughout but the real juice is at about 55mins in the "Distribution of Resources". (Spoiler, it's a small club and we aint in it). The mention of porting Unicode made me laugh heartily though :D. My final takeaway was too many C# coders left over from NXG.

    • Like 1
    • Thanks 1
  5. I've no idea if they introduced an an ini setting for aliasing or a real solution for this but a classic, flat, square, button can be collapsed to 5px and, if you make the border transparent (which is 1px), it looks like a 3px line. However it won't do arbitrary angles-horizontal and vertical only.

    image.png.ff22ce3a1265695741dcf50764b03240.png

    You may have to rethink how you display your fluid with either the picture control or jpg/png images copy and pasted to the FP, if it's a real issue. I'm not sure how you are using to display a fluid (reveal behind a progress bar?). I've never used decorations as they are so limited.

    • Like 1
  6. What is it they say about the last 10% of a project is 90% of the work?

    I stand by my original statement "What a crappy, poorly thought-out protocol" 

    So. Like I said earlier, 1/2 the state is in the client and 1/2 in the server. I'll add now "they have to agree". So what if they don't agree? Well, here we go.

     

    Client and server maintain a list of packets (Packet Identifier).

    Quote

    • MUST assign an unused Packet Identifier when it has a new Application Message to publish

    Ok. Can do that.

    Quote

    MUST treat the PUBLISH packet as “unacknowledged” until it has received the corresponding PUBREC packet from the receive.

    MUST NOT re-send the PUBLISH once it has sent the corresponding PUBREL packet

    OK. But what if I don't get the PUBREC? I can send a duplicate right?

    Quote

    The DUP flag MUST be set to 1 by the Client or Server when it attempts to re-deliver a PUBLISH packet

    Sweet :)

    Oh wait. :blink:

    Quote

    When a Client reconnects with Clean Start set to 0 and a session is present, both the Client and Server
    MUST resend any unacknowledged PUBLISH packets (where QoS > 0) and PUBREL packets using their
    original Packet Identifiers. This is the only circumstance where a Client or Server is REQUIRED to resend
    messages. Clients and Servers MUST NOT resend messages at any other time

    Ok  So we save them up for connect only. Job done, right?

    Quote

    Clients and Servers control the number of unacknowledged PUBLISH packets they receive by using a Receive Maximum.

    If it receives more than Receive Maximum QoS 1 and QoS 2 PUBLISH packets where it has not sent a PUBACK or PUBCOMP in response, the Server uses a DISCONNECT packet with Reason Code 0x93 (Receive Maximum exceeded)

    Ummm.  So we can only send duplicates at connect (and only if it's a persistent session) and there can only be so many unacknowledged ACK's otherwise we get spanked. So what happens if the unacknowledged packets reaches the limit?

    Quote

     It MAY continue to send PUBLISH packets with QoS 0, or it MAY choose to suspend sending these as well.

    Really? Go silent or hope for the best depending on the whim of the developer? :throwpc:

    Hmmm. So what does this look like in the real world.

    • EMQX: 2 hours before getting Receive Maximum exceeded.
    • Hive: 20 minutes before getting Receive Maximum exceeded.
    • Mosquitto: 1 hour before getting Receive Maximum exceeded.

    That's no good. Lets send duplicates if we have some acks and are getting near the limit (that's what we should be doing IMHO)

    • EMQX: 40 minutes before getting getting disconnected (Packet Identifier in use). Can't blame them. Crappy protocol.
    • Hive: 24 hrs and still going but getting duplicates in the subscriber (that's not right for QOS 2 but could live with it.)
    • Mosquitto: 24 hrs. and still going. No problems. We have a winner!

    This is a doozy too:

    Quote

     

    For Reason Code 0x91 (Packet identifier in use), the response to this is either to try to fix the state, or to reset the Session state by connecting using Clean Start set to 1, or to decide if the Client or Server implementations are defective.

     

    Fix the state (normally that would be with duplicates), restart (without persistent session-poor subscribers :( ) or blame someone else. :wacko: 

    Am I missing something?

     

    • Like 1
  7. On 1/19/2023 at 7:26 PM, Jordan Kuehn said:

    One feature of a native broker that I would love to see is the ability to cluster brokers like EQMX or other.

    This is an interesting feature that I guess is one of the mechanisms for clustering. It's basically like an HTTP redirect but I'm not sure how I'm going to handle it ATM. CONNACK is fine but a disconnect is usually the end of the conversation with an error 66. :ph34r: Interesting that they don't mention a redirect depth.

    Quote

     

    4.11 Server redirection
    A Server can request that the Client uses another Server by sending CONNACK or DISCONNECT with
    Reason Codes 0x9C (Use another server), or 0x9D (Server moved) as described in section 4.13. When
    sending one of these Reason Codes, the Server MAY also include a Server Reference property to
    indicate the location of the Server or Servers the Client SHOULD use.
     
    The Reason Code 0x9C (Use another server) specifies that the Client SHOULD temporarily switch to
    using another Server. The other Server is either already known to the Client, or is specified using a
    Server Reference.
     
    The Reason Code 0x9D (Server moved) specifies that the Client SHOULD permanently switch to using
    another Server. The other Server is either already known to the Client, or is specified using a Server
    Reference.

     

     

    • Like 1
  8. 1 hour ago, Rolf Kalbermatter said:

    I haven't looked at MQTT but this kind of ID is usually only really used to match responses to the request and/or verify that you got the right response. It should not contain any crypto relevant value, so I would not expect it to matter. More important would be that you can reasonably guarantee that your random generator never will result in the same ID being returned within a small time window, as that makes the whole purpose of being able to match the response to the request pretty difficult. In that sense a monotonically increasing ID that eventually wraps around is actually more useful than a true random ID.

    Indeed. It's not so much a time window. It's if packets are unacknowledged for the QOS modes. The Packet ID is shared between the Server and client in order for them to synchronise state for the duration of a packet in-flight. That's not an issue for the library as it necessarily needs to do that but I expose the Packet ID to the user in order that they can do session packet tracing. A server, for example, will take into account which packets are unacknowledged for a session and may resend or an unknown Packet ID is received and the connection must be closed.

    1 hour ago, Rolf Kalbermatter said:

    Usually the client generates the ID and sends it with the request. The server simply copies it into the response without doing anything else. The client can then verify that the received response is actually for the sent out request and not some other stray request. In a connection based protocol using TCP/IP, this is usually kind of superfluous but for UDP or serial port communication it can be useful.

    True. However MQTT can retain sessions across connections. In order to do that it keeps a track of the unacknowledged Packet ID's (QOS 1&2). Technically, they should be able to cope with a random vs sequential Packet via lookup tables if the user really needs to but I thought maybe there was a use case for sequentially increasing Packet ID's to, maybe, identify packet order.

  9. Ok. Turns out that Mosquitto and Hive partially support MQTT v5. Mosquito more than Hive (or it may just be more tolerant) but not all the properties in the spec. So they are probably v4.x. EMQX is a 14 day trial so I didn't bother with it in the end.

    I'm just embarking on the cleanup and documentation (the fun's over :() but I have a quick question about the packet ID's. The spec doesn't define what they should be apart a u16 and non-zero (when they are there). So I decided to make them random (usually a good choice in crypto stuff). Mosquitto uses sequential incrementing by 1 and Hive uses sequential incrementing by 50. Technically, they are only used internally by the clients and servers but I was wondering if anyone relies on them being sequential for other things where a random packet ID would be a pain?

    image.png.c3d1b84c7a8a861af3bc9c5b08fa8e69.png

    image.png.8a67032a6b0aa2a9a117fa69b9e2aa4a.pngimage.png.7cce8780747aba748e2c2b14d0cb2005.png

     

  10. Well. It didn't take long to prototype the MQTT client as I was expecting - once I figured out it wasn't my code and it was just properties weren't supported by the public Mosquito server. :frusty: The Hive MQTT public server doesn't seem to support V5 either.

    image.png.7330b0746eea45ea048f6d0989b2da80.png

    image.png.a1e96127de454b536bad87841a440f7d.png

    Anyone know of a public V5 server?

     

    • Like 1
  11. 5 hours ago, Rolf Kalbermatter said:

    It's most likely organically grown. Guaranteed green and maybe even vegan. 😁

    And grown and groomed by many different "developers".

    Aha! :lightbulb:

    So properties are MQTT-V5 only. V3.1.1 has those fixed fields and doesn't have a variable integer at all. That explains the fixed fields and fixed sized integers I moaned about - backwards compatibility. I'm ambivalent if I can forgive them for that as it's a noble trade-off but they could have handled it much better than they have. 

  12. 2 hours ago, Rolf Kalbermatter said:

    It's most likely organically grown. Guaranteed green and maybe even vegan. 😁

    And grown and groomed by many different "developers".

    It was obviously grown like a furry mold.:D

    The way they have designed it means that the user has to know so much about the protocol and what properties to bind to what messages. I'm having a hard time burying the complexity for the user. I wouldn't be surprised if a lot of the LabVIEW solutions out there are only partial implementations and ignore properties completely.

  13. What a crappy, poorly thought-out protocol. :blink:

    • You have a variable length integer (up to 4 bytes) but lets also have some fixed sized integer types less than 4 bytes for the giggles.
    • You have an error byte...sometimes...with command/response contextual meanings. 
    • You have properties, that may or may not be there, but only for some commands and responses.
    • You have command specific, fixed, fields before the properties for some commands/responses.
    • Some commands ack, except when they don't.
    • Half the state is in the client and the other half is in the server.
    • A significant number of the "features" are to get around the previous bullet point.

     

    • Haha 1
  14. 31 minutes ago, hooovahh said:

    The problem with this idea, is that the ico file contains multiple images in it, at different resolutions.  You could in theory, take the LabVIEW image constant, save it to a temporary PNG file, then use that path to set the icon.  But I think you'd be better off with an ico file itself.  You can embed the ico file in the VI as a string constant, and do the same thing, saving it to a temporary location as well.

    You can create an icon on-the-fly using CreateIconIndirect. I have never found the need but, in theory, you could convert an image into the bitmap masks required for an icon. You could then use the WM_SetIcon as previously.

  15. 5 hours ago, Rolf Kalbermatter said:

    My experience about trying to create a universal, generic class hierarchy for one or more device types is that it is a never ending story that will make you go back and forth over and over again as you try to shoehorn one specific instrument feature into the existing class interface to eventually notice that it breaks another feature for a different interface in the same place. Basically it is a noble pursuit to try to do that, but one that fails sooner or later in the reality.

    Yup. I don't go that route at all. The number of "HAL's" that I've seen that make a simple piece of software rigid and a nightmare to maintain.

    I go with a simple route of wrapping a non SCPI device driver with a with a SCPI compliant "controller". The "controller" is the stub I spoke about previously when no device is available  - which then mutates into an SCPI driver when the device arrives (if it needs one). Then the application has a standard interface (string message) to all devices and only has to worry about what messages to send to which devices-you can even script multiple messages from text files!  Much easier to change a string than a class hierarchy and, if you add a device, you don't need all the boiler-plate programming that classes require-just new strings.

×
×
  • Create New...

Important Information

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