#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

#define PORT_M1 18
#define PORT_M0 19
#define PORT_AUX 20

double obtenerDatoDecimal(char **numeros) {
    /*Función que toma una lista de numeros como entrada y devuelve un número decimal. 
    Extrae primero la parte entera, tomando todos los caracteres de la cadena excepto los dos últimos.
    Los dos últimos caracteres de la cadena representan la parte decimal del primer número.
    Se extrae la segunda parte decimal en un número decimal dividiéndolo por 10 
    elevado a la potencia de la longitud de la segunda cadena. Se suman las dos 
    partes decimales y se convierten en un número decimal que representa una coordenada en grados. 
    El número final se redondea a 8 decimales y se devuelve como salida de la función.*/
    double entero, decimal_1, decimal_2;
    entero = atoi(strtok(numeros[0], ".")) / 100;
    decimal_1 = atof(numeros[0] + 3);
    decimal_2 = atof(numeros[1]) / pow(10, strlen(numeros[1]));
    double num = entero + (decimal_1 + decimal_2) / 60;
    return round(num * 100000000) / 100000000;  // Round 8 decimales
}

char* obtenerTiempo(char* hora, char* fecha) {
    /* Dos parámetros, una cadena hora y una cadena fecha, devuelve una cadena que contiene una 
    en el formato AAAA-MM-DD HH:MM:SS. Primero extrae la información de la hora del parámetro hora, 
    ajusta la zona horaria (GMT-5) y la combina con la información de fecha del 
    parámetro fecha para formar la marca de tiempo.
    Si se produce un error durante el procesamiento de los parámetros de entrada, la función devuelve 
    un valor predeterminado de por defecto de 1-7-2022 00:00:00*/
    char* timeStamp = (char*)malloc(20 * sizeof(char));
    char* tmp = strtok(hora, ".");
    int horaCol = atoi(strtok(tmp, ":"));
    if (horaCol < 0 || horaCol > 23) {
        sprintf(timeStamp, "2022-07-01 00:00:00");
        return timeStamp;
    }
    horaCol = (horaCol - 5) >= 0 ? horaCol - 5 : 24 + (horaCol - 5);
    sprintf(tmp, "%02d%s", horaCol, tmp + 2);
    sprintf(timeStamp, "%.2s-%.2s-%.4s %.2s:%.2s:%.2s",
            fecha + 4, fecha + 2, fecha, tmp, tmp + 3, tmp + 6);
    return timeStamp;
}

void obtenerLong_and_lat(char* lon, char* lat, double* longitud, double* latitud) {
    /* lon y lat, son coordenadas de latitud y longitud respectivamente. 
    Intenta convertir estas coordenadas a formato decimal utilizando la función 
    obtenerDatoDecimal y devuelve los valores decimales de la longitud y la latitud.
    Si 'lon' o 'lat' son 'none', o son iguales a '0.0', entonces devuelve los valores por defecto de 
    longitud y latitud respectivamente.*/
    if (lon == NULL || atof(lon) == 0.0 || lat == NULL || atof(lat) == 0.0) {
        *longitud = 6.2677941;
        *latitud = -75.5684756;
    }
    else {
        char* datos_1[2];
        char* datos_2[2];
        int i = 0;
        for (char* tok = strtok(lon, "."); tok; tok = strtok(NULL, ".")) {
            datos_1[i++] = tok;
        }
        i = 0;
        for (char* tok = strtok(lat, "."); tok; tok = strtok(NULL, ".")) {
            datos_2[i++] = tok;
        }
        *longitud = obtenerDatoDecimal(datos_1);
        *latitud = obtenerDatoDecimal(datos_2);
    }
}

double obtenerVelocidad(char* vel) {
    /* Función que recibe una cadena como entrada, que representa una velocidad en nudos, y 
    devuelve la velocidad en metros por segundo. A continuación, multiplica el número 
    resultante por un factor de conversión de 0,514444, que es el factor de conversión de nudos a 
    metros por segundo. Por último, redondea el resultado a dos decimales utilizando la función round 
    y devuelve el valor redondeado. */
    double velocity = atof(vel) * 0.514444;
    return round(velocity * 100) / 100; // Round 2 decimales
}

int main(void) {
    stdio_init_all();

    // Configuracion de los puertos M0, M1, AUX
    gpio_init(PORT_M1);
    gpio_init(PORT_M0);
    gpio_init(PORT_AUX);

    gpio_set_dir(PORT_M1, GPIO_OUT);
    gpio_set_dir(PORT_M0, GPIO_OUT);
    gpio_set_dir(PORT_AUX, GPIO_IN);

    gpio_put(PORT_M1, false);
    gpio_put(PORT_M0, false);

    uart_init(UART_ID, 9600);
    gpio_set_function(4, GPIO_FUNC_UART);
    gpio_set_function(5, GPIO_FUNC_UART);

    uart_init(UART_ID, 9600);
    gpio_set_function(16, GPIO_FUNC_UART);
    gpio_set_function(17, GPIO_FUNC_UART);

    while (true) {
        // main loop here
    }

    return 0;
}

 

C Language online compiler

Write, Run & Share C Language code online using OneCompiler's C online compiler for free. It's one of the robust, feature-rich online compilers for C language, running the latest C version which is C18. Getting started with the OneCompiler's C editor is really simple and pretty fast. The editor shows sample boilerplate code when you choose language as 'C' and start coding!

Read inputs from stdin

OneCompiler's C online editor supports stdin and users can give inputs to programs using the STDIN textbox under the I/O tab. Following is a sample C program which takes name as input and print your name with hello.

#include <stdio.h>
int main()
{
    char name[50];
    printf("Enter name:");
    scanf("%s", name);
    printf("Hello %s \n" , name );
    return 0;
    
}

About C

C language is one of the most popular general-purpose programming language developed by Dennis Ritchie at Bell laboratories for UNIX operating system. The initial release of C Language was in the year 1972. Most of the desktop operating systems are written in C Language.

Key features:

  • Structured Programming
  • Popular system programming language
  • UNIX, MySQL and Oracle are completely written in C.
  • Supports variety of platforms
  • Efficient and also handle low-level activities.
  • As fast as assembly language and hence used as system development language.

Syntax help

Loops

1. If-Else:

When ever you want to perform a set of operations based on a condition if-else is used.

if(conditional-expression) {
   // code
} else {
   // code
}

You can also use if-else for nested Ifs and if-else-if ladder when multiple conditions are to be performed on a single variable.

2. Switch:

Switch is an alternative to if-else-if ladder.

switch(conditional-expression) {    
case value1:    
 // code    
 break;  // optional  
case value2:    
 // code    
 break;  // optional  
...    
    
default:     
 // code to be executed when all the above cases are not matched;    
} 

3. For:

For loop is used to iterate a set of statements based on a condition.

for(Initialization; Condition; Increment/decrement){  
  // code  
} 

4. While:

While is also used to iterate a set of statements based on a condition. Usually while is preferred when number of iterations are not known in advance.

while(condition) {  
 // code 
}  

5. Do-While:

Do-while is also used to iterate a set of statements based on a condition. It is mostly used when you need to execute the statements atleast once.

do {
  // code 
} while (condition); 

Arrays

Array is a collection of similar data which is stored in continuous memory addresses. Array values can be fetched using index. Index starts from 0 to size-1.

Syntax

One dimentional Array:

data-type array-name[size];

Two dimensional array:

data-type array-name[size][size];

Functions

Function is a sub-routine which contains set of statements. Usually functions are written when multiple calls are required to same set of statements which increases re-usuability and modularity.

Two types of functions are present in C

  1. Library Functions:

Library functions are the in-built functions which are declared in header files like printf(),scanf(),puts(),gets() etc.,

  1. User defined functions:

User defined functions are the ones which are written by the programmer based on the requirement.

How to declare a Function

return_type function_name(parameters);

How to call a Function

function_name (parameters)

How to define a Function

return_type function_name(parameters) {  
  //code
}