{"id":1769,"date":"2016-07-27T14:07:21","date_gmt":"2016-07-27T19:07:21","guid":{"rendered":"http:\/\/www.logikalsolutions.com\/wordpress\/?p=1769"},"modified":"2016-07-27T14:07:21","modified_gmt":"2016-07-27T19:07:21","slug":"raspberry-qt-part-7","status":"publish","type":"post","link":"https:\/\/www.logikalsolutions.com\/wordpress\/raspberry-pi\/raspberry-qt-part-7\/","title":{"rendered":"Raspberry Qt &#8211; Part 7"},"content":{"rendered":"<p><strong>Finding the serial port<\/strong><\/p>\n<p align=\"justify\">There is one chunk of the code we really do need to discuss and that is the snippet of how the application chooses its serial port beginning around line 48 in serialthread.cpp. I even put a comment in the code to explain why it looks the way it does.<\/p>\n<pre>\u00a0\u00a0\u00a0 \/\/ One cannot be certain about order if more than one serial port is on the system.\r\n\u00a0\u00a0\u00a0 \/\/ My HP development machine had only one physical serial port yet Ubuntu identified\r\n\u00a0\u00a0\u00a0 \/\/ ttys4 and ttys0. Naturally ttys4 ended up coming out of the list first. I have no idea what\r\n\u00a0\u00a0\u00a0 \/\/ device it thought was a serial port.\r\n\u00a0\u00a0\u00a0 \/\/\r\n\u00a0\u00a0\u00a0 \/\/ Yes, it is a horrible waste of resources since foreach() makes a copy of the container\/collection before\r\n\u00a0\u00a0\u00a0 \/\/ it begins working on it.\r\n\u00a0\u00a0\u00a0 QMap &lt;QString, QSerialPortInfo&gt; portMap;\r\n\u00a0\u00a0\u00a0 foreach( const QSerialPortInfo &amp;info, QSerialPortInfo::availablePorts())\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 portMap.insert( info.portName(), info);\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 foreach( QSerialPortInfo info, portMap)\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 QSerialPort serial;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 serial.setPort(info);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 QString txt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 QTextStream strm( &amp;txt);\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 strm &lt;&lt; \"Testing: \" &lt;&lt; info.portName() &lt;&lt; \" manufacturer: \" &lt;&lt; info.manufacturer()\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;&lt; \" description: \" &lt;&lt; info.description() &lt;&lt; \" serial number: \" &lt;&lt; info.serialNumber()\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;&lt; \" baud: \" &lt;&lt; serial.baudRate() &lt;&lt; \" data: \" &lt;&lt; serial.dataBits() &lt;&lt; \" parity: \" &lt;&lt; serial.parity()\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;&lt; \" stop: \" &lt;&lt; serial.stopBits();\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LogikalLogger::Instance().logString( LogikalLogger::LL_INFO, txt);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (serial.open(QIODevice::ReadOnly))\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 serial.close();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (!portFound)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_portInfo = info;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 txt = \"port \" + info.portName() + \" chosen as device\";\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LogikalLogger::Instance().logString( LogikalLogger::LL_INFO, txt);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 portFound = true;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ don't crash out of the foreach, won't take long to spin through it.\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LogikalLogger::Instance().logString( LogikalLogger::LL_ERR, \"Test failed: \" + serial.errorString());\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 }<\/pre>\n<p align=\"justify\">Believe it or not I had been using the code for finding the serial port over a number of years on different projects both personal and professional. Always just took the QList from availablePorts() and walked down it. Never had a problem. The machine I chose to use for this project gave me my first problem. While there is physically only one serial port, Ubuntu thinks there is both a ttys0 and ttys4 and the <em>little caveat<\/em> found with availablePorts() came back to bite me. I have no idea what this machine believes is ttys4 but, it came back first in the list and it successfully opened. Most frustrating! Software didn\u2019t work and the mini-tester verified we were not connected.<\/p>\n<p align=\"justify\">As a result of that experience (remember: <strong>experience is what you get when you don\u2019t get what you want<\/strong>) we now have 2 foreach() loops. The first creates a QMap ordered by port name. We are lucky that most operating systems number serial ports but start with a base name so they can be sorted.<\/p>\n<p align=\"justify\"><strong>Assignment 1:<\/strong><\/p>\n<p align=\"justify\">Get your Linux environment set up to cleanly build and run the application on your desktop. Connect your cable to your Pi, tail out syslog and achieve the same results I have shown you in Part 6.<\/p>\n<p align=\"justify\"><strong>Assignment 2:<\/strong><\/p>\n<p align=\"justify\">Modify the code in serialthread.cpp to read and use serial port information from a config\/ini\/whatever file. By information I mean port number, baud rate, data, parity and stop bits. Fall back to finding the first port if and only if you cannot successfully load the information or open the serial port.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Finding the serial port There is one chunk of the code we really do need to discuss and that is the snippet of how the application chooses its serial port beginning around line 48 in serialthread.cpp. I even put a comment in the code to explain why it looks the way it does. \u00a0\u00a0\u00a0 \/\/ One cannot be certain about order if more than one serial port is on the system. \u00a0\u00a0\u00a0 \/\/ My HP &hellip; <a title=\"Raspberry Qt &#8211; Part 7\" class=\"bnm-read-more\" href=\"https:\/\/www.logikalsolutions.com\/wordpress\/raspberry-pi\/raspberry-qt-part-7\/\"><span class=\"screen-reader-text\">Raspberry Qt &#8211; Part 7<\/span>Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1113],"tags":[159,1034,1146],"class_list":["post-1769","post","type-post","status-publish","format-standard","hentry","category-raspberry-pi","tag-qt","tag-raspberry-pi","tag-serial-port","bnm-entry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Raspberry Qt - Part 7 &#8211; Logikal Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.logikalsolutions.com\/wordpress\/raspberry-pi\/raspberry-qt-part-7\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Raspberry Qt - Part 7 &#8211; Logikal Blog\" \/>\n<meta property=\"og:description\" content=\"Finding the serial port There is one chunk of the code we really do need to discuss and that is the snippet of how the application chooses its serial port beginning around line 48 in serialthread.cpp. I even put a comment in the code to explain why it looks the way it does. \u00a0\u00a0\u00a0 \/\/ One cannot be certain about order if more than one serial port is on the system. \u00a0\u00a0\u00a0 \/\/ My HP &hellip; Raspberry Qt &#8211; Part 7Read more\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.logikalsolutions.com\/wordpress\/raspberry-pi\/raspberry-qt-part-7\/\" \/>\n<meta property=\"og:site_name\" content=\"Logikal Blog\" \/>\n<meta property=\"article:published_time\" content=\"2016-07-27T19:07:21+00:00\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/raspberry-pi\\\/raspberry-qt-part-7\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/raspberry-pi\\\/raspberry-qt-part-7\\\/\"},\"author\":{\"name\":\"admin\",\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/#\\\/schema\\\/person\\\/b87acf3335e19871db8f4a1aca03736c\"},\"headline\":\"Raspberry Qt &#8211; Part 7\",\"datePublished\":\"2016-07-27T19:07:21+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/raspberry-pi\\\/raspberry-qt-part-7\\\/\"},\"wordCount\":325,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/#\\\/schema\\\/person\\\/c077f770ade13de7faaf616c3eac6842\"},\"keywords\":[\"Qt\",\"Raspberry Pi\",\"serial port\"],\"articleSection\":[\"Raspberry Pi\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/raspberry-pi\\\/raspberry-qt-part-7\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/raspberry-pi\\\/raspberry-qt-part-7\\\/\",\"url\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/raspberry-pi\\\/raspberry-qt-part-7\\\/\",\"name\":\"Raspberry Qt - Part 7 &#8211; Logikal Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/#website\"},\"datePublished\":\"2016-07-27T19:07:21+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/raspberry-pi\\\/raspberry-qt-part-7\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/raspberry-pi\\\/raspberry-qt-part-7\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/raspberry-pi\\\/raspberry-qt-part-7\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Raspberry Qt &#8211; Part 7\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/#website\",\"url\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/\",\"name\":\"Logikal Blog\",\"description\":\"For people with attention spans longer than a Tweet\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/#\\\/schema\\\/person\\\/c077f770ade13de7faaf616c3eac6842\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/#\\\/schema\\\/person\\\/c077f770ade13de7faaf616c3eac6842\",\"name\":\"seasoned_geek\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ae9adac14079d84b909e635d7af986fe4568053af4fd9ff8d4109298c392493e?s=96&d=mm&r=r\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ae9adac14079d84b909e635d7af986fe4568053af4fd9ff8d4109298c392493e?s=96&d=mm&r=r\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ae9adac14079d84b909e635d7af986fe4568053af4fd9ff8d4109298c392493e?s=96&d=mm&r=r\",\"caption\":\"seasoned_geek\"},\"logo\":{\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ae9adac14079d84b909e635d7af986fe4568053af4fd9ff8d4109298c392493e?s=96&d=mm&r=r\"},\"description\":\"Roland Hughes started his IT career in the early 1980s. He quickly became a consultant and president of Logikal Solutions, a software consulting firm specializing in OpenVMS application and C++\\\/Qt touchscreen\\\/embedded Linux development. Early in his career he became involved in what is now called cross platform development. Given the dearth of useful books on the subject he ventured into the world of professional author in 1995 writing the first of the \\\"Zinc It!\\\" book series for John Gordon Burke Publisher, Inc. A decade later he released a massive (nearly 800 pages) tome \\\"The Minimum You Need to Know to Be an OpenVMS Application Developer\\\" which tried to encapsulate the essential skills gained over what was nearly a 20 year career at that point. From there \\\"The Minimum You Need to Know\\\" book series was born. Three years later he wrote his first novel \\\"Infinite Exposure\\\" which got much notice from people involved in the banking and financial security worlds. Some of the attacks predicted in that book have since come to pass. While it was not originally intended to be a trilogy, it became the first book of \\\"The Earth That Was\\\" trilogy: Infinite Exposure Lesedi - The Greatest Lie Ever Told John Smith - Last Known Survivor of the Microsoft Wars When he is not consulting Roland Hughes posts about technology and sometimes politics on his blog. He also has regularly scheduled Sunday posts appearing on the Interesting Authors blog.\",\"sameAs\":[\"https:\\\/\\\/theminimumyouneedtoknow.com\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/#\\\/schema\\\/person\\\/b87acf3335e19871db8f4a1aca03736c\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/168fb2539f8db5d41fe93ae7707d04fbfab3d518cd2603e8066217896887745a?s=96&d=mm&r=r\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/168fb2539f8db5d41fe93ae7707d04fbfab3d518cd2603e8066217896887745a?s=96&d=mm&r=r\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/168fb2539f8db5d41fe93ae7707d04fbfab3d518cd2603e8066217896887745a?s=96&d=mm&r=r\",\"caption\":\"admin\"},\"url\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/author\\\/admin\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Raspberry Qt - Part 7 &#8211; Logikal Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.logikalsolutions.com\/wordpress\/raspberry-pi\/raspberry-qt-part-7\/","og_locale":"en_US","og_type":"article","og_title":"Raspberry Qt - Part 7 &#8211; Logikal Blog","og_description":"Finding the serial port There is one chunk of the code we really do need to discuss and that is the snippet of how the application chooses its serial port beginning around line 48 in serialthread.cpp. I even put a comment in the code to explain why it looks the way it does. \u00a0\u00a0\u00a0 \/\/ One cannot be certain about order if more than one serial port is on the system. \u00a0\u00a0\u00a0 \/\/ My HP &hellip; Raspberry Qt &#8211; Part 7Read more","og_url":"https:\/\/www.logikalsolutions.com\/wordpress\/raspberry-pi\/raspberry-qt-part-7\/","og_site_name":"Logikal Blog","article_published_time":"2016-07-27T19:07:21+00:00","author":"admin","twitter_card":"summary_large_image","twitter_misc":{"Written by":"admin","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.logikalsolutions.com\/wordpress\/raspberry-pi\/raspberry-qt-part-7\/#article","isPartOf":{"@id":"https:\/\/www.logikalsolutions.com\/wordpress\/raspberry-pi\/raspberry-qt-part-7\/"},"author":{"name":"admin","@id":"https:\/\/www.logikalsolutions.com\/wordpress\/#\/schema\/person\/b87acf3335e19871db8f4a1aca03736c"},"headline":"Raspberry Qt &#8211; Part 7","datePublished":"2016-07-27T19:07:21+00:00","mainEntityOfPage":{"@id":"https:\/\/www.logikalsolutions.com\/wordpress\/raspberry-pi\/raspberry-qt-part-7\/"},"wordCount":325,"commentCount":0,"publisher":{"@id":"https:\/\/www.logikalsolutions.com\/wordpress\/#\/schema\/person\/c077f770ade13de7faaf616c3eac6842"},"keywords":["Qt","Raspberry Pi","serial port"],"articleSection":["Raspberry Pi"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.logikalsolutions.com\/wordpress\/raspberry-pi\/raspberry-qt-part-7\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.logikalsolutions.com\/wordpress\/raspberry-pi\/raspberry-qt-part-7\/","url":"https:\/\/www.logikalsolutions.com\/wordpress\/raspberry-pi\/raspberry-qt-part-7\/","name":"Raspberry Qt - Part 7 &#8211; Logikal Blog","isPartOf":{"@id":"https:\/\/www.logikalsolutions.com\/wordpress\/#website"},"datePublished":"2016-07-27T19:07:21+00:00","breadcrumb":{"@id":"https:\/\/www.logikalsolutions.com\/wordpress\/raspberry-pi\/raspberry-qt-part-7\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.logikalsolutions.com\/wordpress\/raspberry-pi\/raspberry-qt-part-7\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.logikalsolutions.com\/wordpress\/raspberry-pi\/raspberry-qt-part-7\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.logikalsolutions.com\/wordpress\/"},{"@type":"ListItem","position":2,"name":"Raspberry Qt &#8211; Part 7"}]},{"@type":"WebSite","@id":"https:\/\/www.logikalsolutions.com\/wordpress\/#website","url":"https:\/\/www.logikalsolutions.com\/wordpress\/","name":"Logikal Blog","description":"For people with attention spans longer than a Tweet","publisher":{"@id":"https:\/\/www.logikalsolutions.com\/wordpress\/#\/schema\/person\/c077f770ade13de7faaf616c3eac6842"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.logikalsolutions.com\/wordpress\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.logikalsolutions.com\/wordpress\/#\/schema\/person\/c077f770ade13de7faaf616c3eac6842","name":"seasoned_geek","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/ae9adac14079d84b909e635d7af986fe4568053af4fd9ff8d4109298c392493e?s=96&d=mm&r=r","url":"https:\/\/secure.gravatar.com\/avatar\/ae9adac14079d84b909e635d7af986fe4568053af4fd9ff8d4109298c392493e?s=96&d=mm&r=r","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/ae9adac14079d84b909e635d7af986fe4568053af4fd9ff8d4109298c392493e?s=96&d=mm&r=r","caption":"seasoned_geek"},"logo":{"@id":"https:\/\/secure.gravatar.com\/avatar\/ae9adac14079d84b909e635d7af986fe4568053af4fd9ff8d4109298c392493e?s=96&d=mm&r=r"},"description":"Roland Hughes started his IT career in the early 1980s. He quickly became a consultant and president of Logikal Solutions, a software consulting firm specializing in OpenVMS application and C++\/Qt touchscreen\/embedded Linux development. Early in his career he became involved in what is now called cross platform development. Given the dearth of useful books on the subject he ventured into the world of professional author in 1995 writing the first of the \"Zinc It!\" book series for John Gordon Burke Publisher, Inc. A decade later he released a massive (nearly 800 pages) tome \"The Minimum You Need to Know to Be an OpenVMS Application Developer\" which tried to encapsulate the essential skills gained over what was nearly a 20 year career at that point. From there \"The Minimum You Need to Know\" book series was born. Three years later he wrote his first novel \"Infinite Exposure\" which got much notice from people involved in the banking and financial security worlds. Some of the attacks predicted in that book have since come to pass. While it was not originally intended to be a trilogy, it became the first book of \"The Earth That Was\" trilogy: Infinite Exposure Lesedi - The Greatest Lie Ever Told John Smith - Last Known Survivor of the Microsoft Wars When he is not consulting Roland Hughes posts about technology and sometimes politics on his blog. He also has regularly scheduled Sunday posts appearing on the Interesting Authors blog.","sameAs":["https:\/\/theminimumyouneedtoknow.com"]},{"@type":"Person","@id":"https:\/\/www.logikalsolutions.com\/wordpress\/#\/schema\/person\/b87acf3335e19871db8f4a1aca03736c","name":"admin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/168fb2539f8db5d41fe93ae7707d04fbfab3d518cd2603e8066217896887745a?s=96&d=mm&r=r","url":"https:\/\/secure.gravatar.com\/avatar\/168fb2539f8db5d41fe93ae7707d04fbfab3d518cd2603e8066217896887745a?s=96&d=mm&r=r","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/168fb2539f8db5d41fe93ae7707d04fbfab3d518cd2603e8066217896887745a?s=96&d=mm&r=r","caption":"admin"},"url":"https:\/\/www.logikalsolutions.com\/wordpress\/author\/admin\/"}]}},"_links":{"self":[{"href":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-json\/wp\/v2\/posts\/1769","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-json\/wp\/v2\/comments?post=1769"}],"version-history":[{"count":0,"href":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-json\/wp\/v2\/posts\/1769\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-json\/wp\/v2\/media?parent=1769"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-json\/wp\/v2\/categories?post=1769"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-json\/wp\/v2\/tags?post=1769"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}