Thank-you everybody on here who has tried to help me with my dome driver development. I have come to the conclusion that my programming skills are not up to the challenge of developing for INDI which is a shame and to date I have not found enough tutorial resources to help me through the issues. The video tutorials on environment set up for example are so out of date that I could not even get a debugging environment going. So I'll go back to ASCOM now, for which I wrote a pretty good driver and look back in on INDI from time to time to see if the situation has improved.
Why doesn't Indi provide basic "generic" drivers for most devices that would allow developers, such as the above, to "bend" there devices to fit. Yes some functions within a driver will have to be dummy actions but providing a generic driver allows quick conversion of existing non Indi devices. Longer term they can then be improved.
I realise there are many drivers (for all sorts of devices) but I was thinking more in the line of a few "Indi Standard" generic devices - one per type maybe - that people can test there devices against before writting a new Indi driver (may not need too as the Standard Generic might be spot on). They may even use the Generic protocol therefore saving more devices to support. Lets face it for example a standard Focuser is a focuser and cant really function very differently even if the "commands" are different . Might also save a lot of unneccessay duplicated documentation which people sometimes hate to do .
They already exist under the example tutorials in the git repo. The simulators also provide good, simple examples.
Maybe what you mean is some kind of device emulator? Of course, someone would have to write them.
RPi3 Ubuntu Server 20.04, Windows 10 AMD64, AAEON UP Core Ubuntu Desktop 20.04
Avalon M-Uno, EQ6 Pro, Atik420, ASI1600MM-C, ASI120MM-S, DBK21AU04, ZWO EFW, Optec TCFSi
Vixen R150S, GSO RC8, ST80
Why not to select/recommend a (mock?) device (p.e raspi or arduino-based) easily accesible to everybody and build and document an example driver for it ?
This will allow people like me, with programming background but having difficulty swallowing the whole linux-indi-c++-hardware-Qt development ecosystem in the short time I have left to live, to get in business faster.
That could by a nice toy to play and learn.
Does something like this already exist?
It's only fair that I should let you all know what I found so difficult.
Setting up the debugging environment. This page indilib.org/develop/developer-manual/163...ent-environment.html is the only one I found on the topic. There are two videos where the action runs at a pace I could barely keep up with. Some explanation of what each step does would have been useful as well. I've never used QTCreator before for example and the mouse flashing around the screen, presumably to point things out is just confusing. It took a while to understand when the mouse stopped and was clicked. Worse, it's not an up to date version of QTCreator and the new version has those buttons in very different places. Add in that on the latest versions of Ubuntu there is no KDESudo command as the page acknowledges, but it puts in a cryptic note that to install I have to run
sudo make -j8 install
. Do I have to do this every time I build the project to debug it or just when I'm actually deploying it ? So more detailed instruction on how to set up the environment would be very helpful, especially as it uses CMake which I for one had never used before. I asked a friend of mine who's a professional programmer (even wrote code for nuclear submarines !) and even he said he hardly ever uses CMake.
How a driver actually works and how to set properties etc. This was a minefield for me. I could not understand any of it for a week or more. The fact I had to call "define" completely passed me by. Fortunately a very kind guy, Rick, sent me a link to this page rickbassham.github.io/indi-dev-tutorials...0-project-setup.html . This was a revelation and things started to make sense. But why did it take me over a month of frustration to find this information. Even then it's not part of the development guide and so not available to all. This page should be made easily available to everyone from the project home page.
There is little or no advice on how client actually interact with drivers. I am still not clear on how this is done. I understand that properties are initially gathered from initProperties function which I guess is called as soon as the driver loads the driver (notice the words "I guess" !), then they are updated from the UpdateProperties function when the client tells the driver to physically connect. But then how do the values of the properties get updated after that ? If my dome moved and my dome gets that info from the hardware how is that published to the client. I assume the client asks for an update from time to time but I can find no explicit references as to how that mechanism works in the indi documentation.
There have been several responses to my questions that I should just look at already existing open source drivers to get answers to my questions. That's probably good advice to those who are very familiar with C++ . This is my first project in C++ . I'm an airline pilot by training though I have written a lot of code in the past, one of which gained me a lifetime achievement award for gliding, that has all been in Pascal (Lazarus) with a little VB. To then have to read someone else's poorly documented code in a language I'm trying to learn at the same time is not very productive of my time. Add to this that different developers have different styles and so scatter code around in different places and it was a real struggle. So this catch all phrase on the forum of "just read the open source drivers, it's all there" is disheartening and discouraging.
Folks should not need to go to the forum to get all this type of information. And I've seen several responses to others along the lines of "why don't you search the forum first before asking this common question again". To this I would make three comments 1) there are around 7000 topics on the forum. Put in a search term and you get swamped with topics that are not what you are after 2) if it is such a commonly asked question maybe it should be in the documentation, 3) I know for those in the know about Indi such repeated questions must be a pain and rather boring but that response is hardly going to endear the platform and community to a new user who is after all just trying to learn.
The website has a fair few broken links on it, or links that go nowhere. Currently when you click on Get INDI | Ubuntu you get a page that just says "Category Ubuntu" indilib.org/get-indi/download-ubuntu.html . This is not helpful and for anyone visiting the website who is maybe interested in trying Indi it gives the impression that the project is not active. I have found other links to the developers manual that give a 404 error. Again this just gives a bad impression.
I have taken quite some time to think about and write the post and I do it in the spirit of wanting Indi to succeed. I have spoke to more than one other person who has been put off by the lack of documentation and so rejected using Indi. One of those was another professional software developer. If I was to suggest anything which would make this project really become popular it would be documentation above development for now. Not documentation only a professional developer can read and understand but documentation someone like me can understand and feel confident with. I'm not a computer newby, I wrote a driver for my dome under ASCOM that took around a week to write and debug. I regularly do observing sessions of 5 or 6 hours and that driver has never failed me yet. So whilst I'm an amateur given the right information even I can write reasonable code.
I hope I haven't offended anyone with this post as I know how much work must have gone into Indi and I do appreciate it.
Thank you Tim for the great detailed feedback. I'm going to put aside $500 to any of the existing developers to work on re-writing the documentation again (for both drivers + clients) using detailed & clear to use instructions with images + text + examples...etc. If anyone is interested in taking this task, please let me know.
I look forward to seeing the results of your documentation project, it's definitely the right thing to do.
I just had a long chat on the phone with one of my professional programmer friends. He had looked at the documentation in an effort to help me but also found it somewhat sparse and confusing. I really think that once this is sorted the uptake of Indi will be much stronger and that uptake could be exponential. I would also imagine that even more device manufacturers would then be in the position of having to write Indi drivers much as in the past they had to write ASCOM drivers for their product to be accepted into the astronomy community.
Hey Tim, thanks for the really good and detailed feedback. We can't get better as a project and community without knowing what we need to fix. I can talk to at least one of the points. The reason it took you so long to get to that information is that I didn't create it until you voiced your issues with the existing documentation. I threw that together basically overnight to try to fill in the gaps, trying to remember my pain points when initially getting into INDI development. Obviously I didn't quite fill in enough of them, but if you are willing, I'd like to work with you make it better. I've been doing C++ development for a long time, so I forget the learning curve of someone new, and having your perspective would be nice as I'm updating the docs.
I am very grateful you put that tutorial together. It helped clear up many points for me
I would say the most important documentation to start with would be a very detailed account of how to set up the development environment. Especially with the removal of KDESudo and the new look QTCreator. Also a look at what the difference is between native and 3rd party drivers. Am I developing a 3rd party or a native driver ? I have no idea. And which should I produce ?
Then for both client and driver developers a detailed look at how the messaging between them occurs. I don't mean at the protocol level that indiserver implements but at what that means for developers. For a driver what functions get called by a client and when. Can a driver send a message to the client at any time etc etc. So some practical examples with diagrams as to how this all works. For example a diagram of what the server sends to a driver when it connects. When does the driver creator function get called ? When does the initproperties function get called etc etc. So a timeline drawing of how the client, indiserver and driver interact during the initial connection, for the interactions during normal operation and finally during shutdown.
I know that the project is very focussed on error free communication, that is obvious from the sample code. However it does not make the sample code easy to read when a large part of the functionality is built into the condition statement of an If Else. Much more readable would be to separate that out. So the functionality sets a local variable to true or false which is then tested. The conditions that have double negatives in them are even worse. I know this makes for elegant code that shows off the skill of the programmer as to how much he can get done in a single line, but for a C++ newbie it means 10 minutes deciphering a single line of code !
I would suggest some code with no error checking is published. Not for operational use of course but to make the basic program flow easier to understand. Then a version with error checking included but in the simple manner I describe above, and then the preferred final version. Only then can the student get their head around the flashy code that the best programmers can write
All this could be done in a simple driver that just talks to an arduino or some such device to get and set a single value and display it. Maybe with a switch element as well. Then the student can play with everything they need to know. It's all very well having tutorials that don't talk to a real device but that leaves a steep learning curve as to how to actually do serial communications with the hardware for which it seems Indi has some useful functions.
I was also very confused about where everything gets put in the development environment. I wound up with the source code, a build folder and I was never sure where the installed code I was writing got run from. I wound up with multiple binaries of my driver and didn't have a clue which one was actually being used when I invoked them from EKos to try and debug. I would up always changing a bit of text in my code, like the name of the driver, so I could see from the client what was being actually run.
And that's before we get onto XML files, where they go and if I need one for my driver for Indi to see it.
So a map of where all the files go during the development process on a standard Linux machine and what are being run when would really really help.
Hope this helps, if it sounds confused it's because I am