@@ -582,6 +582,63 @@ bool UM980::setPortBaudrate(const char *comName, unsigned long newBaud)
582582 return (sendCommand (command));
583583}
584584
585+ // Given a port number, return the baud rate it is operating at
586+ long UM980::getPortBaudrate (const char *comName, uint16_t maxWaitMs)
587+ {
588+ // The library can't read specific settings but we can see if a specific setting
589+ // is present in the response to the CONFIG command
590+
591+ Um980Result result;
592+
593+ clearBuffer ();
594+
595+ // Send command and check for OK response
596+ result = sendString (" CONFIG" , maxWaitMs);
597+ if (result != UM980_RESULT_OK)
598+ return (-2 );
599+
600+ // Setup configStringToFind so configHandler() knows what to look for
601+ // $CONFIG,COM3,CONFIG COM3 115200*23 is an example response
602+ // So we look for "CONFIG COMx"
603+ snprintf (configStringToFind, sizeof (configStringToFind), " CONFIG %s" , comName);
604+
605+ configStringFound = false ; // configHandler() sets true if we find the intended string
606+
607+ commandResponse = UM980_RESULT_RESPONSE_COMMAND_WAITING; // Reset
608+
609+ unicoreLibrarySemaphoreBlock = true ; // Prevent external tasks from harvesting serial data
610+
611+ // Feed the parser until we see a response to the command
612+ int wait = 0 ;
613+ while (1 )
614+ {
615+ if (wait++ == maxWaitMs)
616+ {
617+ debugPrintf (" Unicore Lib: Response timeout" );
618+ unicoreLibrarySemaphoreBlock = false ; // Allow external tasks to control serial hardware
619+ return (-1 );
620+ }
621+
622+ updateOnce (); // Will call um980ProcessMessage() and configHandler()
623+
624+ if (configStringFound == true )
625+ return (configLong);
626+
627+ if (commandResponse == UM980_RESULT_RESPONSE_COMMAND_ERROR)
628+ {
629+ debugPrintf (" Unicore Lib: Query failure" );
630+ unicoreLibrarySemaphoreBlock = false ; // Allow external tasks to control serial hardware
631+ return (-2 );
632+ }
633+
634+ delay (1 );
635+ }
636+
637+ unicoreLibrarySemaphoreBlock = false ; // Allow external tasks to control serial hardware
638+
639+ return (-3 ); // Uncaught error
640+ }
641+
585642// Sets the baud rate of the port we are communicating on
586643// Supported baud rates: 9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600
587644bool UM980::setBaudrate (unsigned long newBaud)
@@ -626,7 +683,7 @@ bool UM980::configurePPS(const char *configString)
626683
627684// Available constellations: GPS, BDS, GLO, GAL, QZSS, IRNSS
628685
629- // Enable a given constallation
686+ // Enable a given constellation
630687// Returns true if successful
631688bool UM980::enableConstellation (const char *constellationName)
632689{
@@ -661,6 +718,64 @@ bool UM980::setElevationAngle(int16_t elevationDegrees)
661718 return (disableSystem (command)); // Use MASK to set elevation angle
662719}
663720
721+ // Return the elevation mask in degrees
722+ // $CONFIG,MASK,MASK 5.0*25
723+ float UM980::getElevationAngle (uint16_t maxWaitMs)
724+ {
725+ // The library can't read specific settings but we can see if a specific setting
726+ // is present in the response to the MASK command
727+
728+ Um980Result result;
729+
730+ clearBuffer ();
731+
732+ // Send command and check for OK response
733+ result = sendString (" MASK" , maxWaitMs);
734+ if (result != UM980_RESULT_OK)
735+ return (-2 );
736+
737+ // Setup configStringToFind so configHandler() knows what to look for
738+ // $CONFIG,MASK,MASK 5.0*25 is an example response
739+ // So we look for "MASK,MASK"
740+ snprintf (configStringToFind, sizeof (configStringToFind), " MASK,MASK" );
741+
742+ configStringFound = false ; // configHandler() sets true if we find the intended string
743+
744+ commandResponse = UM980_RESULT_RESPONSE_COMMAND_WAITING; // Reset
745+
746+ unicoreLibrarySemaphoreBlock = true ; // Prevent external tasks from harvesting serial data
747+
748+ // Feed the parser until we see a response to the command
749+ int wait = 0 ;
750+ while (1 )
751+ {
752+ if (wait++ == maxWaitMs)
753+ {
754+ debugPrintf (" Unicore Lib: Response timeout" );
755+ unicoreLibrarySemaphoreBlock = false ; // Allow external tasks to control serial hardware
756+ return (-1 );
757+ }
758+
759+ updateOnce (); // Will call um980ProcessMessage() and configHandler()
760+
761+ if (configStringFound == true )
762+ return (configFloat);
763+
764+ if (commandResponse == UM980_RESULT_RESPONSE_COMMAND_ERROR)
765+ {
766+ debugPrintf (" Unicore Lib: Query failure" );
767+ unicoreLibrarySemaphoreBlock = false ; // Allow external tasks to control serial hardware
768+ return (-2 );
769+ }
770+
771+ delay (1 );
772+ }
773+
774+ unicoreLibrarySemaphoreBlock = false ; // Allow external tasks to control serial hardware
775+
776+ return (-3 ); // Uncaught error
777+ }
778+
664779// Ignore satellites below certain CN0 value
665780// C/N0, limits the observation data output of OBSV messages
666781bool UM980::setMinCNO (uint8_t dBHz)
@@ -913,7 +1028,7 @@ void UM980::serialPrintln(const char *command)
9131028// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
9141029
9151030// Send a command string (ie 'MODE ROVER') to the UM980
916- // Returns true if device reponded with OK to command
1031+ // Returns true if device responded with OK to command
9171032bool UM980::sendCommand (const char *command, uint16_t maxWaitMs)
9181033{
9191034 return (sendString (command, maxWaitMs) == UM980_RESULT_OK);
@@ -926,7 +1041,7 @@ bool UM980::sendCommand(const char *command, uint16_t maxWaitMs)
9261041// #MODE,97,GPS,FINE,2283,499142000,0,0,18,22;MODE BASE -1280206.5680 -4716804.4030 4086665.4840,*60
9271042
9281043// '$' begins the responses to commands, ie 'MODE ROVER', ends with OK
929- // Contains reponse for caller
1044+ // Contains response for caller
9301045Um980Result UM980::sendQuery (const char *command, uint16_t maxWaitMs)
9311046{
9321047 Um980Result result;
@@ -1630,7 +1745,7 @@ char *UM980::getCompileTime()
16301745}
16311746
16321747// Returns pointer to terminated response.
1633- // $command,VERSION,response: OK*04
1748+ // $command,VERSION,response: OK*04
16341749// #VERSION,92,GPS,FINE,2289,167126600,0,0,18,155;UM980,R4.10Build7923,HRPT00-S10C-P,2310415000001-MD22B1224961040,ff3bd496fd7ca68b,2022/09/28*45d62771
16351750char *UM980::getVersionFull (uint16_t maxWaitMs)
16361751{
@@ -1657,6 +1772,42 @@ void UM980::configHandler(uint8_t *response, uint16_t length)
16571772 if (responsePointer != nullptr ) // Found
16581773 {
16591774 configStringFound = true ;
1775+
1776+ // Obtain the value following the search string
1777+ responsePointer += strlen (configStringToFind); // Move the position to the end of the word
1778+
1779+ // Skip any whitespace
1780+ while (*responsePointer && isspace (*responsePointer))
1781+ responsePointer++;
1782+
1783+ // Now 'responsePointer' should point at the start of the next term
1784+ char *longEndPtr;
1785+ long longValue = strtol (responsePointer, &longEndPtr, 10 ); // Convert the next term to long, base 10
1786+
1787+ if (responsePointer == longEndPtr)
1788+ {
1789+ configLong = 0 ; // No number found
1790+ // Serial.println("No value found");
1791+ }
1792+ else
1793+ {
1794+ configLong = longValue; // Remember the converted value
1795+ // Serial.printf("Found value: %ld\r\n", configLong);
1796+ }
1797+
1798+ char *floatEndPrt;
1799+ float floatValue = strtof (responsePointer, &floatEndPrt);
1800+
1801+ if (responsePointer == floatEndPrt)
1802+ {
1803+ configFloat = 0 ; // No number found
1804+ // Serial.println("No value found");
1805+ }
1806+ else
1807+ {
1808+ configFloat = floatValue; // Remember the converted value
1809+ // Serial.printf("Found value: %0.2f\r\n", configFloat);
1810+ }
16601811 }
16611812 else
16621813 {
0 commit comments