Page 1 of 1

bug in GroveShield Library

Posted: Fri Feb 08, 2019 1:50 am
by dbolingua
I've found a minor but irritating bug in the Grove shield library for Azure Sphere. The original code looks like:

Code: Select all

static int baudrate_conf(int *fd, UART_BaudRate_Type baudrate)
{
	static uint8_t trial = 0;
	uint8_t d0, d1;
	uint8_t conf[4] = { 0 };

	close(*fd);
	*fd = GroveUART_Open(MT3620_RDB_HEADER2_ISU0_UART, 9600);

	while (true)
	{
		d0 = 0, d1 = 0;
                .
                .
                .
        }
However, if GroveUART_Open fails, the baudrate_conf routine fails to return due to the loop immediately following. Instead, the code might look like the following:

Code: Select all

static int baudrate_conf(int *fd, UART_BaudRate_Type baudrate)
{
	static uint8_t trial = 0;
	uint8_t d0, d1;
	uint8_t conf[4] = { 0 };

	close(*fd);
	*fd = GroveUART_Open(MT3620_RDB_HEADER2_ISU0_UART, 9600);
	//Check for errors
	if (*fd == -1)
	{
                if (EACCES == errno)
                {
                        Log_Debug("[error] Failed to open COM port. Is manifest configured correctly?");
                }
                else
                         Log_Debug("[error] Failed to open COM port. Error %d", errno);
                return errno;
        }
	while (true)
	{
		d0 = 0, d1 = 0;
I also modified the return from void to int and returned an error code for both baudrate_conf and the calling routine GroveShield_Initialize so that the main code can determine if the initialization failed. Note that forgetting to set the app_manifest.json file is pretty easy error to make.

Thanks for the Azure Sphere supporting products.