123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263 |
- #include <stdio.h>
- #include <string.h>
- #include "L76K.h"
- #include "iot_errno.h"
- #include "iot_gpio.h"
- #include "iot_gpio_ex.h"
- #include "iot_pwm.h"
- #include "iot_uart.h"
- #define WIFI_IOT_PWM_PORT_PWM1 1
- #define WIFI_IOT_IO_FUNC_GPIO_8_PWM1_OUT 5
- #define WIFI_IOT_IO_FUNC_GPIO_7_GPIO 0
- #define BEEP_GPIO 8
- #define LED_GPIO 14
- #define RESET_GPIO 7
- #define STANDBY_GPIO 13
- #define WIFI_IOT_UART_IDX_1 1
- gps_msg gpsmsg;
- static unsigned char gps_uart[1000];
- void BoardInit(void)
- {
- uint32_t ret;
-
- IoTGpioInit(BEEP_GPIO);
- IoTGpioSetFunc(BEEP_GPIO, IOT_GPIO_FUNC_GPIO_8_GPIO);
- IoTGpioSetDir(BEEP_GPIO, IOT_GPIO_DIR_OUT);
- IoTGpioInit(LED_GPIO);
- IoTGpioSetFunc(LED_GPIO, IOT_GPIO_FUNC_GPIO_14_GPIO);
- IoTGpioSetDir(LED_GPIO, IOT_GPIO_DIR_OUT);
-
- IoTGpioInit(RESET_GPIO);
- IoTGpioSetFunc(RESET_GPIO, IOT_GPIO_FUNC_GPIO_7_GPIO);
- IoTGpioSetDir(RESET_GPIO, IOT_GPIO_DIR_OUT);
- IoTGpioSetOutputVal(RESET_GPIO, 0);
- IoTGpioInit(STANDBY_GPIO);
- IoTGpioSetFunc(STANDBY_GPIO, IOT_GPIO_FUNC_GPIO_13_GPIO);
- IoTGpioSetDir(STANDBY_GPIO, IOT_GPIO_DIR_OUT);
- IoTGpioSetOutputVal(STANDBY_GPIO, 0);
- IotUartAttribute uart_attr = {
-
- .baudRate = 9600,
-
- .dataBits = 8,
- .stopBits = 1,
- .parity = 0,
- };
-
- ret = IoTUartInit(WIFI_IOT_UART_IDX_1, &uart_attr);
- if (ret != IOT_SUCCESS) {
- printf("Failed to init uart! Err code = %d\n", ret);
- return;
- }
- }
- uint8_t NMEA_Comma_Pos(uint8_t* buf, uint8_t cx)
- {
- uint8_t* p = buf;
- while (cx) {
- if (*buf == '*' || *buf < ' ' || *buf > 'z')
- return 0xFF;
- if (*buf == ',')
- cx--;
- buf++;
- }
- return buf - p;
- }
- uint32_t NMEA_Pow(uint8_t m, uint8_t n)
- {
- uint32_t result = 1;
- while (n--)
- result *= m;
- return result;
- }
- int NMEA_Str2num(uint8_t* buf, uint8_t* dx)
- {
- uint8_t* p = buf;
- uint32_t ires = 0, fres = 0;
- uint8_t ilen = 0, flen = 0, i;
- uint8_t mask = 0;
- int res;
- while (1) {
- if (*p == '-') {
- mask |= 0x02;
- p++;
- }
- if (*p == ',' || *p == '*')
- break;
- if (*p == '.') {
- mask |= 0x01;
- p++;
- }
- else if (*p > '9' || (*p < '0'))
- {
- ilen = 0;
- flen = 0;
- break;
- }
- if (mask & 0x01)
- flen++;
- else
- ilen++;
- p++;
- }
- if (mask & 0x02)
- buf++;
- for (i = 0; i < ilen; i++)
- {
- ires += NMEA_Pow(10, ilen - 1 - i) * (buf[i] - '0');
- }
- if (flen > 5)
- flen = 5;
- *dx = flen;
- for (i = 0; i < flen; i++)
- {
- fres += NMEA_Pow(10, flen - 1 - i) * (buf[ilen + 1 + i] - '0');
- }
- res = ires * NMEA_Pow(10, flen) + fres;
- if (mask & 0x02)
- res = -res;
- return res;
- }
- void NMEA_BDS_GPRMC_Analysis(gps_msg* gpsmsg, uint8_t* buf)
- {
- uint8_t *p4, dx;
- uint8_t posx;
- uint32_t temp;
- float rs;
- p4 = (uint8_t*)strstr((const char*)buf, "$GNRMC");
- if (p4 != NULL) {
- posx = NMEA_Comma_Pos(p4, 3);
- if (posx != 0XFF) {
- temp = NMEA_Str2num(p4 + posx, &dx);
- gpsmsg->latitude_bd = temp / NMEA_Pow(10, dx + 2);
- rs = temp % NMEA_Pow(10, dx + 2);
- gpsmsg->latitude_bd = gpsmsg->latitude_bd * NMEA_Pow(10, 5) + (rs * NMEA_Pow(10, 5 - dx)) / 60;
- }
- posx = NMEA_Comma_Pos(p4, 4);
- if (posx != 0XFF)
- gpsmsg->nshemi_bd = *(p4 + posx);
- posx = NMEA_Comma_Pos(p4, 5);
- if (posx != 0XFF) {
- temp = NMEA_Str2num(p4 + posx, &dx);
- gpsmsg->longitude_bd = temp / NMEA_Pow(10, dx + 2);
- rs = temp % NMEA_Pow(10, dx + 2);
- gpsmsg->longitude_bd = gpsmsg->longitude_bd * NMEA_Pow(10, 5) + (rs * NMEA_Pow(10, 5 - dx)) / 60;
- }
- posx = NMEA_Comma_Pos(p4, 6);
- if (posx != 0XFF)
- gpsmsg->ewhemi_bd = *(p4 + posx);
- }
- }
- void L76ReadData(L76Data* ReadData)
- {
-
- IoTUartRead(WIFI_IOT_UART_IDX_1, gps_uart, 1000);
- NMEA_BDS_GPRMC_Analysis(&gpsmsg, (uint8_t*)gps_uart);
- ReadData->Longitude = (float)((float)gpsmsg.longitude_bd / 100000);
- ReadData->Latitude = (float)((float)gpsmsg.latitude_bd / 100000);
- }
- void BeepStatusSet(SwitchStatus status)
- {
- if (status == ON) {
- IoTGpioSetOutputVal(BEEP_GPIO, 1);
- }
- if (status == OFF) {
- IoTGpioSetOutputVal(BEEP_GPIO, 0);
- }
- }
- void LedWarnStatusSet(SwitchStatus status)
- {
- if (status == ON) {
- IoTGpioSetOutputVal(LED_GPIO, 1);
- }
- if (status == OFF) {
- IoTGpioSetOutputVal(LED_GPIO, 0);
- }
- }
|