Kenji Arai / TYBLE16_mbedlized_os5_EddystoneBeacon

Dependencies:  

Committer:
kenjiArai
Date:
Tue Apr 10 12:50:20 2018 +0000
Revision:
0:47dfd44d8b78
Eddystone Beacon only for TYBLE16 Module

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:47dfd44d8b78 1 /* mbed Microcontroller Library
kenjiArai 0:47dfd44d8b78 2 * Copyright (c) 2006-2015 ARM Limited
kenjiArai 0:47dfd44d8b78 3 *
kenjiArai 0:47dfd44d8b78 4 * Licensed under the Apache License, Version 2.0 (the "License");
kenjiArai 0:47dfd44d8b78 5 * you may not use this file except in compliance with the License.
kenjiArai 0:47dfd44d8b78 6 * You may obtain a copy of the License at
kenjiArai 0:47dfd44d8b78 7 *
kenjiArai 0:47dfd44d8b78 8 * http://www.apache.org/licenses/LICENSE-2.0
kenjiArai 0:47dfd44d8b78 9 *
kenjiArai 0:47dfd44d8b78 10 * Unless required by applicable law or agreed to in writing, software
kenjiArai 0:47dfd44d8b78 11 * distributed under the License is distributed on an "AS IS" BASIS,
kenjiArai 0:47dfd44d8b78 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
kenjiArai 0:47dfd44d8b78 13 * See the License for the specific language governing permissions and
kenjiArai 0:47dfd44d8b78 14 * limitations under the License.
kenjiArai 0:47dfd44d8b78 15 */
kenjiArai 0:47dfd44d8b78 16
kenjiArai 0:47dfd44d8b78 17 #include "URLFrame.h"
kenjiArai 0:47dfd44d8b78 18
kenjiArai 0:47dfd44d8b78 19 URLFrame::URLFrame(void)
kenjiArai 0:47dfd44d8b78 20 {
kenjiArai 0:47dfd44d8b78 21 urlDataLength = 0;
kenjiArai 0:47dfd44d8b78 22 memset(urlData, 0, sizeof(UrlData_t));
kenjiArai 0:47dfd44d8b78 23 }
kenjiArai 0:47dfd44d8b78 24
kenjiArai 0:47dfd44d8b78 25 URLFrame::URLFrame(const char *urlDataIn)
kenjiArai 0:47dfd44d8b78 26 {
kenjiArai 0:47dfd44d8b78 27 encodeURL(urlDataIn);
kenjiArai 0:47dfd44d8b78 28 }
kenjiArai 0:47dfd44d8b78 29
kenjiArai 0:47dfd44d8b78 30 URLFrame::URLFrame(UrlData_t urlDataIn, uint8_t urlDataLength)
kenjiArai 0:47dfd44d8b78 31 {
kenjiArai 0:47dfd44d8b78 32 if (urlDataLength > URL_DATA_MAX) {
kenjiArai 0:47dfd44d8b78 33 memcpy(urlData, urlDataIn, URL_DATA_MAX);
kenjiArai 0:47dfd44d8b78 34 } else {
kenjiArai 0:47dfd44d8b78 35 memcpy(urlData, urlDataIn, urlDataLength);
kenjiArai 0:47dfd44d8b78 36 }
kenjiArai 0:47dfd44d8b78 37 }
kenjiArai 0:47dfd44d8b78 38
kenjiArai 0:47dfd44d8b78 39 void URLFrame::constructURLFrame(uint8_t* rawFrame, int8_t advPowerLevel)
kenjiArai 0:47dfd44d8b78 40 {
kenjiArai 0:47dfd44d8b78 41 size_t index = 0;
kenjiArai 0:47dfd44d8b78 42 rawFrame[index++] = EDDYSTONE_UUID[0]; // 16-bit Eddystone UUID
kenjiArai 0:47dfd44d8b78 43 rawFrame[index++] = EDDYSTONE_UUID[1];
kenjiArai 0:47dfd44d8b78 44 rawFrame[index++] = FRAME_TYPE_URL; // 1B Type
kenjiArai 0:47dfd44d8b78 45 rawFrame[index++] = advPowerLevel; // 1B Power @ 0meter
kenjiArai 0:47dfd44d8b78 46 memcpy(rawFrame + index, urlData, urlDataLength); // Encoded URL
kenjiArai 0:47dfd44d8b78 47 }
kenjiArai 0:47dfd44d8b78 48
kenjiArai 0:47dfd44d8b78 49 size_t URLFrame::getRawFrameSize(void) const
kenjiArai 0:47dfd44d8b78 50 {
kenjiArai 0:47dfd44d8b78 51 return urlDataLength + FRAME_MIN_SIZE_URL + EDDYSTONE_UUID_SIZE;
kenjiArai 0:47dfd44d8b78 52 }
kenjiArai 0:47dfd44d8b78 53
kenjiArai 0:47dfd44d8b78 54 uint8_t* URLFrame::getEncodedURLData(void)
kenjiArai 0:47dfd44d8b78 55 {
kenjiArai 0:47dfd44d8b78 56 return urlData;
kenjiArai 0:47dfd44d8b78 57 }
kenjiArai 0:47dfd44d8b78 58
kenjiArai 0:47dfd44d8b78 59 uint8_t URLFrame::getEncodedURLDataLength(void) const
kenjiArai 0:47dfd44d8b78 60 {
kenjiArai 0:47dfd44d8b78 61 return urlDataLength;
kenjiArai 0:47dfd44d8b78 62 }
kenjiArai 0:47dfd44d8b78 63
kenjiArai 0:47dfd44d8b78 64 void URLFrame::setURLData(const char *urlDataIn)
kenjiArai 0:47dfd44d8b78 65 {
kenjiArai 0:47dfd44d8b78 66 encodeURL(urlDataIn);
kenjiArai 0:47dfd44d8b78 67 }
kenjiArai 0:47dfd44d8b78 68
kenjiArai 0:47dfd44d8b78 69 void URLFrame::setEncodedURLData(const uint8_t* urlEncodedDataIn, const uint8_t urlEncodedDataLengthIn)
kenjiArai 0:47dfd44d8b78 70 {
kenjiArai 0:47dfd44d8b78 71 urlDataLength = urlEncodedDataLengthIn;
kenjiArai 0:47dfd44d8b78 72 memcpy(urlData, urlEncodedDataIn, urlEncodedDataLengthIn);
kenjiArai 0:47dfd44d8b78 73 }
kenjiArai 0:47dfd44d8b78 74
kenjiArai 0:47dfd44d8b78 75 void URLFrame::encodeURL(const char *urlDataIn)
kenjiArai 0:47dfd44d8b78 76 {
kenjiArai 0:47dfd44d8b78 77 const char *prefixes[] = {
kenjiArai 0:47dfd44d8b78 78 "http://www.",
kenjiArai 0:47dfd44d8b78 79 "https://www.",
kenjiArai 0:47dfd44d8b78 80 "http://",
kenjiArai 0:47dfd44d8b78 81 "https://",
kenjiArai 0:47dfd44d8b78 82 };
kenjiArai 0:47dfd44d8b78 83 const size_t NUM_PREFIXES = sizeof(prefixes) / sizeof(char *);
kenjiArai 0:47dfd44d8b78 84 const char *suffixes[] = {
kenjiArai 0:47dfd44d8b78 85 ".com/",
kenjiArai 0:47dfd44d8b78 86 ".org/",
kenjiArai 0:47dfd44d8b78 87 ".edu/",
kenjiArai 0:47dfd44d8b78 88 ".net/",
kenjiArai 0:47dfd44d8b78 89 ".info/",
kenjiArai 0:47dfd44d8b78 90 ".biz/",
kenjiArai 0:47dfd44d8b78 91 ".gov/",
kenjiArai 0:47dfd44d8b78 92 ".com",
kenjiArai 0:47dfd44d8b78 93 ".org",
kenjiArai 0:47dfd44d8b78 94 ".edu",
kenjiArai 0:47dfd44d8b78 95 ".net",
kenjiArai 0:47dfd44d8b78 96 ".info",
kenjiArai 0:47dfd44d8b78 97 ".biz",
kenjiArai 0:47dfd44d8b78 98 ".gov"
kenjiArai 0:47dfd44d8b78 99 };
kenjiArai 0:47dfd44d8b78 100 const size_t NUM_SUFFIXES = sizeof(suffixes) / sizeof(char *);
kenjiArai 0:47dfd44d8b78 101
kenjiArai 0:47dfd44d8b78 102 urlDataLength = 0;
kenjiArai 0:47dfd44d8b78 103 memset(urlData, 0, sizeof(UrlData_t));
kenjiArai 0:47dfd44d8b78 104
kenjiArai 0:47dfd44d8b78 105 if ((urlDataIn == NULL) || (strlen(urlDataIn) == 0)) {
kenjiArai 0:47dfd44d8b78 106 return;
kenjiArai 0:47dfd44d8b78 107 }
kenjiArai 0:47dfd44d8b78 108
kenjiArai 0:47dfd44d8b78 109 /*
kenjiArai 0:47dfd44d8b78 110 * handle prefix
kenjiArai 0:47dfd44d8b78 111 */
kenjiArai 0:47dfd44d8b78 112 for (size_t i = 0; i < NUM_PREFIXES; i++) {
kenjiArai 0:47dfd44d8b78 113 size_t prefixLen = strlen(prefixes[i]);
kenjiArai 0:47dfd44d8b78 114 if (strncmp(urlDataIn, prefixes[i], prefixLen) == 0) {
kenjiArai 0:47dfd44d8b78 115 urlData[urlDataLength++] = i;
kenjiArai 0:47dfd44d8b78 116 urlDataIn += prefixLen;
kenjiArai 0:47dfd44d8b78 117 break;
kenjiArai 0:47dfd44d8b78 118 }
kenjiArai 0:47dfd44d8b78 119 }
kenjiArai 0:47dfd44d8b78 120
kenjiArai 0:47dfd44d8b78 121 /*
kenjiArai 0:47dfd44d8b78 122 * handle suffixes
kenjiArai 0:47dfd44d8b78 123 */
kenjiArai 0:47dfd44d8b78 124 while (*urlDataIn && (urlDataLength < URL_DATA_MAX)) {
kenjiArai 0:47dfd44d8b78 125 /* check for suffix match */
kenjiArai 0:47dfd44d8b78 126 size_t i;
kenjiArai 0:47dfd44d8b78 127 for (i = 0; i < NUM_SUFFIXES; i++) {
kenjiArai 0:47dfd44d8b78 128 size_t suffixLen = strlen(suffixes[i]);
kenjiArai 0:47dfd44d8b78 129 if (strncmp(urlDataIn, suffixes[i], suffixLen) == 0) {
kenjiArai 0:47dfd44d8b78 130 urlData[urlDataLength++] = i;
kenjiArai 0:47dfd44d8b78 131 urlDataIn += suffixLen;
kenjiArai 0:47dfd44d8b78 132 break; /* from the for loop for checking against suffixes */
kenjiArai 0:47dfd44d8b78 133 }
kenjiArai 0:47dfd44d8b78 134 }
kenjiArai 0:47dfd44d8b78 135 /* This is the default case where we've got an ordinary character which doesn't match a suffix. */
kenjiArai 0:47dfd44d8b78 136 if (i == NUM_SUFFIXES) {
kenjiArai 0:47dfd44d8b78 137 urlData[urlDataLength++] = *urlDataIn;
kenjiArai 0:47dfd44d8b78 138 ++urlDataIn;
kenjiArai 0:47dfd44d8b78 139 }
kenjiArai 0:47dfd44d8b78 140 }
kenjiArai 0:47dfd44d8b78 141 }