Simple USBHost library for Nucleo F446RE/F411RE/F401RE FRDM-KL46Z/KL25Z/F64F LPC4088/LPC1768
Dependents: F401RE-BTstack_example F401RE-USBHostMSD_HelloWorld
Fork of KL46Z-USBHost by
簡易USBホストライブラリです。
official-USBHostの下位互換で対応プログラムを僅かな修正で動かすことが出来ます。
Platforms
- Nucleo F446RE
- Nucleo F411RE
- Nucleo F401RE
- FRDM-K64F
- FRDM-KL46Z
- FRDM-KL25Z
- LPC4088
- LPC1768
Nucleo F446RE/F411RE/F401REのUSB接続方法
| ST morpho | USB |
|---|---|
| U5V (CN10-8) | VBUS (1 RED) |
| PA11 (CN10-14) | DM (2 WHITE) |
| PA12 (CN10-12) | DP (3 GREEN) |
| GND (CN10-20) | GND (4 BLACK) |
Examples
Import programF446RE-USBHostMouse_HelloWorld
USBHostMouse Hello World for ST-Nucleo-F446RE
Import programF401RE-USBHostMSD_HelloWorld
Simple USBHost MSD(USB flash drive) for Nucleo F401RE/FRDM-KL46Z test program
Import programF401RE-USBHostC270_example
Simple USBHost WebCam test program
Import programK64F_USBHostC270_example
Simple USBHost C270 example
Import programF401RE-BTstack_example
BTstack for Nucleo F401RE/FRDM-KL46Z example program
Import programUSBHostRSSI_example
Bluetooth device discovery example program.
Import programKL46Z-USBHostGPS_HelloWorld
Simple USBHost GPS Dongle Receiver for FRDM-KL46Z test program
USBHostGPS/decodeNMEA.cpp
- Committer:
- va009039
- Date:
- 2016-05-01
- Revision:
- 23:4ab8bc835303
- Parent:
- 13:8774c07f12a5
File content as of revision 23:4ab8bc835303:
// decodeNMEA.cpp 2012/12/13
#include "mbed.h"
#include "decodeNMEA.h"
#define SEQ_INIT 0
#define SEQ_DATA 1
#define SEQ_SUM0 2
#define SEQ_SUM1 3
#define GPGGA 1
#define GPGLL 2
#define GPGSV 3
#define GPRMC 4
#define GPVTG 5
#define GPZDA 6
decodeNMEA::decodeNMEA():m_seq(0) {
gprmc_t = 0;
update_t = 0;
m_status = false;
}
void decodeNMEA::inputNMEA(char* buf, int len) {
for(int i = 0; i < len; i++) {
inputNMEA(buf[i]);
}
}
static int ctoh(char c) {
if (c >= '0' && c <= '9') {
return c-'0';
}
return c-'A'+10;
}
void decodeNMEA::inputNMEA(char c) {
switch(m_seq) {
case SEQ_INIT:
if (c == '$') {
m_type = 0;
m_row = 0;
m_buf_pos = 0;
m_sum = 0x00;
m_seq = SEQ_DATA;
}
break;
case SEQ_DATA:
m_sum ^= c;
if (c == ',' || c == '*') {
m_buf[m_buf_pos] = '\0';
parse(m_type, m_row, m_buf);
m_row++;
m_buf_pos =0;
if (c == '*') { // check sum ?
m_sum ^= c;
m_seq = SEQ_SUM0;
}
} else {
if (m_buf_pos < sizeof(m_buf)-1) {
m_buf[m_buf_pos++] = c;
}
}
break;
case SEQ_SUM0:
if (ctoh(c) == (m_sum>>4)) {
m_seq = SEQ_SUM1;
} else {
m_seq = SEQ_INIT;
}
break;
case SEQ_SUM1:
if (ctoh(c) == (m_sum&0x0f)) {
update(m_type, m_row);
} else {
m_seq = SEQ_INIT;
}
break;
default:
m_seq = SEQ_INIT;
break;
}
}
float DMMtoDegree(const char *s)
{
char *p = strchr(const_cast<char*>(s), '.');
if (p == NULL) {
return 0.0;
}
const uint32_t k[] = {10000,1000,100,10,1};
uint32_t i3 = atoi(p+1) * k[strlen(p+1)];
uint32_t i2 = atoi(p-2);
uint32_t i1 = atoi(s) / 100;
uint32_t i = i1*10000*60 + (i2*10000 + i3);
return i / 10000.0 / 60.0;
}
void decodeNMEA::parse(int type, int row, char* buf) {
if (row == 0) {
if (strcmp(buf, "GPRMC") == 0) {
m_type = GPRMC;
m_status = false;
} else {
m_type = 0;
}
return;
}
if (type == GPRMC) {
switch(row) {
case 1:
tmp_timeinfo.tm_sec = atoi(buf+4);
buf[4] = '\0';
tmp_timeinfo.tm_min = atoi(buf+2);
buf[2] = '\0';
tmp_timeinfo.tm_hour = atoi(buf);
break;
case 2:
if (buf[0] == 'A') {
m_status = true;
}
break;
case 3:
tmp_lat = DMMtoDegree(buf);
break;
case 4:
if (buf[0] == 'S') {
tmp_lat *= -1;
}
break;
case 5:
tmp_lon = DMMtoDegree(buf);
break;
case 6:
if (buf[0] == 'W') {
tmp_lon *= -1;
}
break;
case 9:
tmp_timeinfo.tm_year = 2000 - 1900 + atoi(buf+4);
buf[4] = '\0';
tmp_timeinfo.tm_mon = atoi(buf+2) - 1;
buf[2] = '\0';
tmp_timeinfo.tm_mday = atoi(buf);
break;
}
}
}
void decodeNMEA::update(int type, int row) {
if (type == GPRMC && m_status) {
lat = tmp_lat;
lon = tmp_lon;
gprmc_t = mktime(&tmp_timeinfo);
update_t = gprmc_t;
}
}

