mbed base bard check program for BlueTooth USB dongle module (3 switches, 6 leds, I2C LCD, A/D)

Dependencies:   USBHost mbed

Fork of BTstack by Norimasa Okamoto

Committer:
tamaki
Date:
Mon Oct 17 00:25:18 2016 +0000
Revision:
3:7b7d1273e2d5
Parent:
1:b657594559be
mbed base bard check program
; for BlueTooth USB dongle module
; (3 switches, 6 leds, I2C LCD, A/D)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tamaki 3:7b7d1273e2d5 1 #if 1
va009039 0:1ed23ab1345f 2 /*
va009039 0:1ed23ab1345f 3 * spp_demo
tamaki 3:7b7d1273e2d5 4 VS-02 android remotecontroler application
tamaki 3:7b7d1273e2d5 5 mbed LED1,LED2,LED3,LED4 on/off control
tamaki 3:7b7d1273e2d5 6 serial baudrate = 921600,8bit,stop 1bit,none parity
va009039 0:1ed23ab1345f 7 */
tamaki 3:7b7d1273e2d5 8 //mbed pin layout
tamaki 3:7b7d1273e2d5 9 //1 GND
tamaki 3:7b7d1273e2d5 10 //2
tamaki 3:7b7d1273e2d5 11 //3
tamaki 3:7b7d1273e2d5 12 //4
tamaki 3:7b7d1273e2d5 13 //5 SD SDI
tamaki 3:7b7d1273e2d5 14 //6 SD SDO
tamaki 3:7b7d1273e2d5 15 //7 SD SCK
tamaki 3:7b7d1273e2d5 16 //8 SD CS
tamaki 3:7b7d1273e2d5 17 //9 I2C sda
tamaki 3:7b7d1273e2d5 18 //10 I2C sci
tamaki 3:7b7d1273e2d5 19 //11 SPI mosi
tamaki 3:7b7d1273e2d5 20 //12 SPI miso
tamaki 3:7b7d1273e2d5 21 //13 SPI sck
tamaki 3:7b7d1273e2d5 22 //14 SW0
tamaki 3:7b7d1273e2d5 23 //15 SW1
tamaki 3:7b7d1273e2d5 24 //16 SW2
tamaki 3:7b7d1273e2d5 25 //17 Vr
tamaki 3:7b7d1273e2d5 26 //18 D/A
tamaki 3:7b7d1273e2d5 27 //19 Ain1
tamaki 3:7b7d1273e2d5 28 //20
tamaki 3:7b7d1273e2d5 29 //21 PWMOut1
tamaki 3:7b7d1273e2d5 30 //22 PWMOut2
tamaki 3:7b7d1273e2d5 31 //23 PWMOut3
tamaki 3:7b7d1273e2d5 32 //24 PWMOut4
tamaki 3:7b7d1273e2d5 33 //25 PWMOut5
tamaki 3:7b7d1273e2d5 34 //26 PWMOut6
tamaki 3:7b7d1273e2d5 35 //27 LCD scl : ACM1602NI-4(ACM1602NI 1Vss,2Vdd,3Vo,4SCL,5SDA,6LED+,7LED-)
tamaki 3:7b7d1273e2d5 36 //28 LCD sda : ACM1602NI-5
tamaki 3:7b7d1273e2d5 37 //29
tamaki 3:7b7d1273e2d5 38 //30
tamaki 3:7b7d1273e2d5 39 //31 USB D+
tamaki 3:7b7d1273e2d5 40 //32 USB D-
tamaki 3:7b7d1273e2d5 41 //
tamaki 3:7b7d1273e2d5 42 /*
tamaki 3:7b7d1273e2d5 43 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
tamaki 3:7b7d1273e2d5 44 0 0 0 0 1 S0 S1 S2 1 0 2 3 "LeftArrow" "RightArrow"
tamaki 3:7b7d1273e2d5 45 1
tamaki 3:7b7d1273e2d5 46 */
tamaki 3:7b7d1273e2d5 47
va009039 0:1ed23ab1345f 48 #include "mbed.h"
va009039 0:1ed23ab1345f 49 #include <btstack/hci_cmds.h>
va009039 0:1ed23ab1345f 50 #include <btstack/run_loop.h>
va009039 0:1ed23ab1345f 51 #include <btstack/sdp_util.h>
va009039 0:1ed23ab1345f 52 #include "hci.h"
va009039 0:1ed23ab1345f 53 #include "l2cap.h"
va009039 0:1ed23ab1345f 54 #include "btstack_memory.h"
va009039 0:1ed23ab1345f 55 #include "remote_device_db.h"
va009039 0:1ed23ab1345f 56 #include "rfcomm.h"
va009039 1:b657594559be 57 extern "C" {
va009039 0:1ed23ab1345f 58 #include "sdp.h"
va009039 1:b657594559be 59 }
va009039 0:1ed23ab1345f 60 #include "config.h"
va009039 0:1ed23ab1345f 61 #include "debug.h"
va009039 0:1ed23ab1345f 62 #include "bd_addr.h" // class bd_addr
va009039 0:1ed23ab1345f 63
tamaki 3:7b7d1273e2d5 64 #include "ACM1602NI.h"
tamaki 3:7b7d1273e2d5 65 //#include "SDFileSystem.h"
tamaki 3:7b7d1273e2d5 66
va009039 0:1ed23ab1345f 67 Serial pc(USBTX, USBRX);
tamaki 3:7b7d1273e2d5 68
tamaki 3:7b7d1273e2d5 69 DigitalOut brd_led1(LED1), brd_led2(LED2), brd_led3(LED3), brd_led4(LED4);
tamaki 3:7b7d1273e2d5 70
tamaki 3:7b7d1273e2d5 71 DigitalOut led1(p21);
tamaki 3:7b7d1273e2d5 72 DigitalOut led2(p22);
tamaki 3:7b7d1273e2d5 73 DigitalOut led3(p23);
tamaki 3:7b7d1273e2d5 74 DigitalOut led4(p24);
tamaki 3:7b7d1273e2d5 75 DigitalOut led5(p25);
tamaki 3:7b7d1273e2d5 76 DigitalOut led6(p26);
tamaki 3:7b7d1273e2d5 77 DigitalIn sw1(p14);
tamaki 3:7b7d1273e2d5 78 DigitalIn sw2(p15);
tamaki 3:7b7d1273e2d5 79 DigitalIn sw3(p16);
tamaki 3:7b7d1273e2d5 80 AnalogIn vr(p17);
tamaki 3:7b7d1273e2d5 81
tamaki 3:7b7d1273e2d5 82 /*
tamaki 3:7b7d1273e2d5 83 SDFileSystem *Sd;
tamaki 3:7b7d1273e2d5 84 FILE *fp;
tamaki 3:7b7d1273e2d5 85 */
va009039 0:1ed23ab1345f 86
tamaki 3:7b7d1273e2d5 87 static Timer timer;
tamaki 3:7b7d1273e2d5 88 static int VSC2btn[20];//VS-C2 button push then 1, other 0
tamaki 3:7b7d1273e2d5 89 //0:left arrow up
tamaki 3:7b7d1273e2d5 90 //1:left arrow right
tamaki 3:7b7d1273e2d5 91 //2:left arrow down
tamaki 3:7b7d1273e2d5 92 //3:left arrow left
tamaki 3:7b7d1273e2d5 93 //4:right arrow up
tamaki 3:7b7d1273e2d5 94 //5:right arrow right
tamaki 3:7b7d1273e2d5 95 //6:right arrow down
tamaki 3:7b7d1273e2d5 96 //7:right arrow left
tamaki 3:7b7d1273e2d5 97 //8:select
tamaki 3:7b7d1273e2d5 98 //9:start
tamaki 3:7b7d1273e2d5 99 static int module_status = 0;//0 timer set mode, 1 timer run mode, 2 timer complete
tamaki 3:7b7d1273e2d5 100 static int time_cnt = 0;//use run mode timer counter
tamaki 3:7b7d1273e2d5 101 static int time_set = 0;//use set mode timer counter
tamaki 3:7b7d1273e2d5 102
tamaki 3:7b7d1273e2d5 103
tamaki 3:7b7d1273e2d5 104 //LCD class
tamaki 3:7b7d1273e2d5 105 ACM1602NI lcd(p28, p27); //sda scl
tamaki 3:7b7d1273e2d5 106
tamaki 3:7b7d1273e2d5 107 #define HEARTBEAT_PERIOD_MS 100
va009039 0:1ed23ab1345f 108
va009039 0:1ed23ab1345f 109 static uint8_t rfcomm_channel_nr = 1;
va009039 0:1ed23ab1345f 110 static uint16_t rfcomm_channel_id = 0;
va009039 0:1ed23ab1345f 111 static uint8_t spp_service_buffer[128];
va009039 0:1ed23ab1345f 112
tamaki 3:7b7d1273e2d5 113 static void data_recv(uint8_t *packet, uint16_t size);
tamaki 3:7b7d1273e2d5 114
va009039 0:1ed23ab1345f 115 // Bluetooth logic
va009039 0:1ed23ab1345f 116 static void packet_handler (void * connection, uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
va009039 0:1ed23ab1345f 117 bd_addr_t event_addr;
va009039 0:1ed23ab1345f 118 uint8_t rfcomm_channel_nr;
va009039 0:1ed23ab1345f 119 uint16_t mtu;
va009039 0:1ed23ab1345f 120 int err;
va009039 0:1ed23ab1345f 121 switch (packet_type) {
va009039 0:1ed23ab1345f 122 case HCI_EVENT_PACKET:
va009039 0:1ed23ab1345f 123 switch (packet[0]) {
va009039 0:1ed23ab1345f 124
va009039 0:1ed23ab1345f 125 case BTSTACK_EVENT_STATE:
va009039 0:1ed23ab1345f 126 // bt stack activated, get started - set local name
va009039 0:1ed23ab1345f 127 if (packet[2] == HCI_STATE_WORKING) {
tamaki 3:7b7d1273e2d5 128 hci_send_cmd(&hci_write_local_name, "mbed seminar");
va009039 0:1ed23ab1345f 129 }
va009039 0:1ed23ab1345f 130 break;
va009039 0:1ed23ab1345f 131
va009039 0:1ed23ab1345f 132 case HCI_EVENT_COMMAND_COMPLETE:
va009039 0:1ed23ab1345f 133 if (COMMAND_COMPLETE_EVENT(packet, hci_read_bd_addr)){
va009039 0:1ed23ab1345f 134 bt_flip_addr(event_addr, &packet[6]);
va009039 0:1ed23ab1345f 135 log_info("BD-ADDR: %s\n\r", bd_addr_to_str(event_addr));
va009039 0:1ed23ab1345f 136 break;
va009039 0:1ed23ab1345f 137 }
va009039 0:1ed23ab1345f 138 if (COMMAND_COMPLETE_EVENT(packet, hci_write_local_name)){
va009039 0:1ed23ab1345f 139 hci_discoverable_control(1);
va009039 0:1ed23ab1345f 140 break;
va009039 0:1ed23ab1345f 141 }
va009039 0:1ed23ab1345f 142 break;
va009039 0:1ed23ab1345f 143
va009039 0:1ed23ab1345f 144 case HCI_EVENT_LINK_KEY_REQUEST:
va009039 0:1ed23ab1345f 145 // deny link key request
va009039 0:1ed23ab1345f 146 log_info("Link key request\n\r");
va009039 0:1ed23ab1345f 147 bt_flip_addr(event_addr, &packet[2]);
va009039 0:1ed23ab1345f 148 hci_send_cmd(&hci_link_key_request_negative_reply, &event_addr);
va009039 0:1ed23ab1345f 149 break;
va009039 0:1ed23ab1345f 150
va009039 0:1ed23ab1345f 151 case HCI_EVENT_PIN_CODE_REQUEST:
va009039 0:1ed23ab1345f 152 // inform about pin code request
va009039 0:1ed23ab1345f 153 log_info("Pin code request - using '0000'\n\r");
va009039 0:1ed23ab1345f 154 bt_flip_addr(event_addr, &packet[2]);
va009039 0:1ed23ab1345f 155 hci_send_cmd(&hci_pin_code_request_reply, &event_addr, 4, "0000");
va009039 0:1ed23ab1345f 156 break;
va009039 0:1ed23ab1345f 157
va009039 0:1ed23ab1345f 158 case RFCOMM_EVENT_INCOMING_CONNECTION:
va009039 0:1ed23ab1345f 159 // data: event (8), len(8), address(48), channel (8), rfcomm_cid (16)
va009039 0:1ed23ab1345f 160 bt_flip_addr(event_addr, &packet[2]);
va009039 0:1ed23ab1345f 161 rfcomm_channel_nr = packet[8];
va009039 0:1ed23ab1345f 162 rfcomm_channel_id = READ_BT_16(packet, 9);
va009039 0:1ed23ab1345f 163 log_info("RFCOMM channel %u requested for %s\n\r", rfcomm_channel_nr, bd_addr_to_str(event_addr));
va009039 0:1ed23ab1345f 164 rfcomm_accept_connection_internal(rfcomm_channel_id);
va009039 0:1ed23ab1345f 165 break;
va009039 0:1ed23ab1345f 166
va009039 0:1ed23ab1345f 167 case RFCOMM_EVENT_OPEN_CHANNEL_COMPLETE:
va009039 0:1ed23ab1345f 168 // data: event(8), len(8), status (8), address (48), server channel(8), rfcomm_cid(16), max frame size(16)
va009039 0:1ed23ab1345f 169 if (packet[2]) {
va009039 0:1ed23ab1345f 170 log_info("RFCOMM channel open failed, status %u\n\r", packet[2]);
va009039 0:1ed23ab1345f 171 } else {
va009039 0:1ed23ab1345f 172 rfcomm_channel_id = READ_BT_16(packet, 12);
va009039 0:1ed23ab1345f 173 mtu = READ_BT_16(packet, 14);
va009039 0:1ed23ab1345f 174 log_info("\n\rRFCOMM channel open succeeded. New RFCOMM Channel ID %u, max frame size %u\n\r", rfcomm_channel_id, mtu);
va009039 0:1ed23ab1345f 175 }
va009039 0:1ed23ab1345f 176 break;
va009039 0:1ed23ab1345f 177
va009039 0:1ed23ab1345f 178 case RFCOMM_EVENT_CHANNEL_CLOSED:
va009039 0:1ed23ab1345f 179 rfcomm_channel_id = 0;
va009039 0:1ed23ab1345f 180 break;
va009039 0:1ed23ab1345f 181
va009039 0:1ed23ab1345f 182 default:
va009039 0:1ed23ab1345f 183 break;
va009039 0:1ed23ab1345f 184 }
va009039 0:1ed23ab1345f 185 break;
va009039 0:1ed23ab1345f 186
va009039 0:1ed23ab1345f 187 case RFCOMM_DATA_PACKET:
va009039 0:1ed23ab1345f 188 // loopback
va009039 0:1ed23ab1345f 189 if (rfcomm_channel_id) {
va009039 0:1ed23ab1345f 190 err = rfcomm_send_internal(rfcomm_channel_id, packet, size);
va009039 0:1ed23ab1345f 191 if (err) {
va009039 0:1ed23ab1345f 192 log_info("rfcomm_send_internal -> error %d", err);
va009039 0:1ed23ab1345f 193 }
va009039 0:1ed23ab1345f 194 }
tamaki 3:7b7d1273e2d5 195
tamaki 3:7b7d1273e2d5 196 data_recv(packet, size);
tamaki 3:7b7d1273e2d5 197
tamaki 3:7b7d1273e2d5 198 // led3 = !led3;
va009039 0:1ed23ab1345f 199 break;
va009039 0:1ed23ab1345f 200 default:
va009039 0:1ed23ab1345f 201 break;
va009039 0:1ed23ab1345f 202 }
va009039 0:1ed23ab1345f 203 }
va009039 0:1ed23ab1345f 204
tamaki 3:7b7d1273e2d5 205 static void data_recv(uint8_t *packet, uint16_t size){
tamaki 3:7b7d1273e2d5 206 int i;
tamaki 3:7b7d1273e2d5 207 static int timerp[12];
tamaki 3:7b7d1273e2d5 208 static int timers[12];
tamaki 3:7b7d1273e2d5 209 // char ind[4];
tamaki 3:7b7d1273e2d5 210 log_info("packet(size:%d) = ", size);
tamaki 3:7b7d1273e2d5 211
tamaki 3:7b7d1273e2d5 212 //recive char display mode
tamaki 3:7b7d1273e2d5 213 //for analys recieve char
tamaki 3:7b7d1273e2d5 214 // for (i = 0; i < size; i++){
tamaki 3:7b7d1273e2d5 215 // log_info("%c", packet[i]);
tamaki 3:7b7d1273e2d5 216 // }
tamaki 3:7b7d1273e2d5 217 // log_info("\n\r");
tamaki 3:7b7d1273e2d5 218
tamaki 3:7b7d1273e2d5 219
tamaki 3:7b7d1273e2d5 220 //VS-02 remote controler corss key
tamaki 3:7b7d1273e2d5 221 //packet
tamaki 3:7b7d1273e2d5 222 // 9 right arrow: 1 up(triangle), 2 right(circle), 4 down(closs), 8 left(quad)
tamaki 3:7b7d1273e2d5 223 // 10 L R Button : 1 L2, 2 R2, 4 L1, 8 R1
tamaki 3:7b7d1273e2d5 224 // 12 left arrow: 1 up, 2 right, 4 down, 8 left
tamaki 3:7b7d1273e2d5 225 // 13 1 select, 2 R3, 4 L3, 8 start
tamaki 3:7b7d1273e2d5 226 if(packet[0] == 'w'){
tamaki 3:7b7d1273e2d5 227 log_info("%c", packet[9]);
tamaki 3:7b7d1273e2d5 228 log_info("%c", packet[10]);
tamaki 3:7b7d1273e2d5 229 log_info("%c", packet[12]);
tamaki 3:7b7d1273e2d5 230 log_info("%c", packet[13]);
tamaki 3:7b7d1273e2d5 231 switch (packet[9]) {
tamaki 3:7b7d1273e2d5 232 case '1':
tamaki 3:7b7d1273e2d5 233 timers[4] = timerp[4];
tamaki 3:7b7d1273e2d5 234 timerp[4] = timer.read_ms();
tamaki 3:7b7d1273e2d5 235 log_info("%d", timerp[4]-timers[4]);
tamaki 3:7b7d1273e2d5 236 if((timerp[4]-timers[4])>150){
tamaki 3:7b7d1273e2d5 237 VSC2btn[4]=1;
tamaki 3:7b7d1273e2d5 238 }
tamaki 3:7b7d1273e2d5 239 break;
tamaki 3:7b7d1273e2d5 240 case '2':
tamaki 3:7b7d1273e2d5 241 timers[5] = timerp[5];
tamaki 3:7b7d1273e2d5 242 timerp[5] = timer.read_ms();
tamaki 3:7b7d1273e2d5 243 log_info("%d", timerp[5]-timers[5]);
tamaki 3:7b7d1273e2d5 244 if((timerp[5]-timers[5])>150){
tamaki 3:7b7d1273e2d5 245 VSC2btn[5]=1;
tamaki 3:7b7d1273e2d5 246 }
tamaki 3:7b7d1273e2d5 247 break;
tamaki 3:7b7d1273e2d5 248 case '4':
tamaki 3:7b7d1273e2d5 249 timers[6] = timerp[6];
tamaki 3:7b7d1273e2d5 250 timerp[6] = timer.read_ms();
tamaki 3:7b7d1273e2d5 251 log_info("%d", timerp[6]-timers[6]);
tamaki 3:7b7d1273e2d5 252 if((timerp[6]-timers[6])>150){
tamaki 3:7b7d1273e2d5 253 VSC2btn[6]=1;
tamaki 3:7b7d1273e2d5 254 }
tamaki 3:7b7d1273e2d5 255 break;
tamaki 3:7b7d1273e2d5 256 case '8':
tamaki 3:7b7d1273e2d5 257 timers[7] = timerp[7];
tamaki 3:7b7d1273e2d5 258 timerp[7] = timer.read_ms();
tamaki 3:7b7d1273e2d5 259 log_info("%d", timerp[7]-timers[7]);
tamaki 3:7b7d1273e2d5 260 if((timerp[7]-timers[7])>150){
tamaki 3:7b7d1273e2d5 261 VSC2btn[7]=1;
tamaki 3:7b7d1273e2d5 262 }
tamaki 3:7b7d1273e2d5 263 break;
tamaki 3:7b7d1273e2d5 264 case '0':
tamaki 3:7b7d1273e2d5 265 VSC2btn[4]=0;
tamaki 3:7b7d1273e2d5 266 VSC2btn[5]=0;
tamaki 3:7b7d1273e2d5 267 VSC2btn[6]=0;
tamaki 3:7b7d1273e2d5 268 VSC2btn[7]=0;
tamaki 3:7b7d1273e2d5 269 break;
tamaki 3:7b7d1273e2d5 270
tamaki 3:7b7d1273e2d5 271 }
tamaki 3:7b7d1273e2d5 272 switch (packet[12]) {
tamaki 3:7b7d1273e2d5 273 case '1':
tamaki 3:7b7d1273e2d5 274 timers[0] = timerp[0];
tamaki 3:7b7d1273e2d5 275 timerp[0] = timer.read_ms();
tamaki 3:7b7d1273e2d5 276 log_info("%d", timerp[0]-timers[0]);
tamaki 3:7b7d1273e2d5 277 if((timerp[0]-timers[0])>150){
tamaki 3:7b7d1273e2d5 278 VSC2btn[0]=1;
tamaki 3:7b7d1273e2d5 279 }
tamaki 3:7b7d1273e2d5 280 break;
tamaki 3:7b7d1273e2d5 281 case '2':
tamaki 3:7b7d1273e2d5 282 timers[1] = timerp[1];
tamaki 3:7b7d1273e2d5 283 timerp[1] = timer.read_ms();
tamaki 3:7b7d1273e2d5 284 log_info("%d", timerp[1]-timers[1]);
tamaki 3:7b7d1273e2d5 285 if((timerp[1]-timers[1])>150){
tamaki 3:7b7d1273e2d5 286 VSC2btn[1]=1;
tamaki 3:7b7d1273e2d5 287 }
tamaki 3:7b7d1273e2d5 288 break;
tamaki 3:7b7d1273e2d5 289 case '4':
tamaki 3:7b7d1273e2d5 290 timers[2] = timerp[2];
tamaki 3:7b7d1273e2d5 291 timerp[2] = timer.read_ms();
tamaki 3:7b7d1273e2d5 292 log_info("%d", timerp[2]-timers[2]);
tamaki 3:7b7d1273e2d5 293 if((timerp[2]-timers[2])>150){
tamaki 3:7b7d1273e2d5 294 VSC2btn[2]=1;
tamaki 3:7b7d1273e2d5 295 }
tamaki 3:7b7d1273e2d5 296 break;
tamaki 3:7b7d1273e2d5 297 case '8':
tamaki 3:7b7d1273e2d5 298 timers[3] = timerp[3];
tamaki 3:7b7d1273e2d5 299 timerp[3] = timer.read_ms();
tamaki 3:7b7d1273e2d5 300 log_info("%d", timerp[3]-timers[3]);
tamaki 3:7b7d1273e2d5 301 if((timerp[3]-timers[3])>150){
tamaki 3:7b7d1273e2d5 302 VSC2btn[3]=1;
tamaki 3:7b7d1273e2d5 303 }
tamaki 3:7b7d1273e2d5 304 break;
tamaki 3:7b7d1273e2d5 305 case '0':
tamaki 3:7b7d1273e2d5 306 VSC2btn[0]=0;
tamaki 3:7b7d1273e2d5 307 VSC2btn[1]=0;
tamaki 3:7b7d1273e2d5 308 VSC2btn[2]=0;
tamaki 3:7b7d1273e2d5 309 VSC2btn[3]=0;
tamaki 3:7b7d1273e2d5 310 break;
tamaki 3:7b7d1273e2d5 311 }
tamaki 3:7b7d1273e2d5 312 switch (packet[13]) {
tamaki 3:7b7d1273e2d5 313 case '1':
tamaki 3:7b7d1273e2d5 314 timers[8] = timerp[8];
tamaki 3:7b7d1273e2d5 315 timerp[8] = timer.read_ms();
tamaki 3:7b7d1273e2d5 316 log_info("%d", timerp[8]-timers[8]);
tamaki 3:7b7d1273e2d5 317 if((timerp[8]-timers[8])>150){
tamaki 3:7b7d1273e2d5 318 VSC2btn[8]=1;
tamaki 3:7b7d1273e2d5 319 }
tamaki 3:7b7d1273e2d5 320 break;
tamaki 3:7b7d1273e2d5 321 case '8':
tamaki 3:7b7d1273e2d5 322 timers[9] = timerp[9];
tamaki 3:7b7d1273e2d5 323 timerp[9] = timer.read_ms();
tamaki 3:7b7d1273e2d5 324 log_info("%d", timerp[9]-timers[9]);
tamaki 3:7b7d1273e2d5 325 if((timerp[9]-timers[9])>150){
tamaki 3:7b7d1273e2d5 326 VSC2btn[9]=1;
tamaki 3:7b7d1273e2d5 327 }
tamaki 3:7b7d1273e2d5 328 break;
tamaki 3:7b7d1273e2d5 329 case '0':
tamaki 3:7b7d1273e2d5 330 VSC2btn[8]=0;
tamaki 3:7b7d1273e2d5 331 VSC2btn[9]=0;
tamaki 3:7b7d1273e2d5 332 break;
tamaki 3:7b7d1273e2d5 333 }
tamaki 3:7b7d1273e2d5 334 //
tamaki 3:7b7d1273e2d5 335 //
tamaki 3:7b7d1273e2d5 336
tamaki 3:7b7d1273e2d5 337 }
tamaki 3:7b7d1273e2d5 338 log_info("\n\r");
tamaki 3:7b7d1273e2d5 339 }
tamaki 3:7b7d1273e2d5 340
tamaki 3:7b7d1273e2d5 341 //switch status 0:off, 1:posEdge, 2:on, 3:negEdge
tamaki 3:7b7d1273e2d5 342 int sw_st[3];
tamaki 3:7b7d1273e2d5 343 int sw_cnt[3];//past counter
tamaki 3:7b7d1273e2d5 344
tamaki 3:7b7d1273e2d5 345 void chksw(void)
tamaki 3:7b7d1273e2d5 346 {
tamaki 3:7b7d1273e2d5 347 static int ssw[3], psw[3], cnt[3], tcnt[3];
tamaki 3:7b7d1273e2d5 348 int i;
tamaki 3:7b7d1273e2d5 349 psw[0] = sw1;
tamaki 3:7b7d1273e2d5 350 psw[1] = sw2;
tamaki 3:7b7d1273e2d5 351 psw[2] = sw3;
tamaki 3:7b7d1273e2d5 352 //switch status 0:off, 1:posEdge, 2:on, 3:negEdge
tamaki 3:7b7d1273e2d5 353 for(i = 0; i < 3; i++){
tamaki 3:7b7d1273e2d5 354 if((ssw[i] == 0)&&(psw[i] == 0)){
tamaki 3:7b7d1273e2d5 355 sw_st[i] = 2;//on
tamaki 3:7b7d1273e2d5 356 tcnt[i] ++;
tamaki 3:7b7d1273e2d5 357 sw_cnt[i] = tcnt[i];
tamaki 3:7b7d1273e2d5 358 }
tamaki 3:7b7d1273e2d5 359 if((ssw[i] == 0)&&(psw[i] == 1)){
tamaki 3:7b7d1273e2d5 360 sw_st[i] = 3;//negEdge
tamaki 3:7b7d1273e2d5 361 cnt[i] = tcnt[i];
tamaki 3:7b7d1273e2d5 362 tcnt[i] = 0;
tamaki 3:7b7d1273e2d5 363 sw_cnt[i] = tcnt[i];
tamaki 3:7b7d1273e2d5 364 }
tamaki 3:7b7d1273e2d5 365 if((ssw[i] == 1)&&(psw[i] == 1)){
tamaki 3:7b7d1273e2d5 366 sw_st[i] = 0;//off
tamaki 3:7b7d1273e2d5 367 tcnt[i] ++;
tamaki 3:7b7d1273e2d5 368 }
tamaki 3:7b7d1273e2d5 369 if((ssw[i] == 1)&&(psw[i] == 0)){
tamaki 3:7b7d1273e2d5 370 sw_st[i] = 1;//posEdge
tamaki 3:7b7d1273e2d5 371 cnt[i] = tcnt[i];
tamaki 3:7b7d1273e2d5 372 tcnt[i] = 0;
tamaki 3:7b7d1273e2d5 373 sw_cnt[i] = tcnt[i];
tamaki 3:7b7d1273e2d5 374 }
tamaki 3:7b7d1273e2d5 375 ssw[i] = psw[i];
tamaki 3:7b7d1273e2d5 376 }
tamaki 3:7b7d1273e2d5 377 }
tamaki 3:7b7d1273e2d5 378
tamaki 3:7b7d1273e2d5 379
va009039 0:1ed23ab1345f 380 static void heartbeat_handler(struct timer *ts){
tamaki 3:7b7d1273e2d5 381 static int counter = 0, tmp_counter=0;
tamaki 3:7b7d1273e2d5 382 static int c_pos = 2;// 4:32:10
tamaki 3:7b7d1273e2d5 383 // 0:55:00
tamaki 3:7b7d1273e2d5 384 static char line1[20], line2[20];
tamaki 3:7b7d1273e2d5 385
va009039 0:1ed23ab1345f 386 run_loop_set_timer(ts, HEARTBEAT_PERIOD_MS);
va009039 0:1ed23ab1345f 387 run_loop_add_timer(ts);
tamaki 3:7b7d1273e2d5 388
tamaki 3:7b7d1273e2d5 389 brd_led2 = !brd_led2;
tamaki 3:7b7d1273e2d5 390 counter ++;
tamaki 3:7b7d1273e2d5 391 // tmp_counter = time_cnt;
tamaki 3:7b7d1273e2d5 392
tamaki 3:7b7d1273e2d5 393 if(module_status == 1){
tamaki 3:7b7d1273e2d5 394 }
tamaki 3:7b7d1273e2d5 395
tamaki 3:7b7d1273e2d5 396 if(module_status == 0){//set mode
tamaki 3:7b7d1273e2d5 397 // int cd[5]={1,10,60,600,3600};
tamaki 3:7b7d1273e2d5 398 // if(VSC2btn[3] == 1){//left arrow left
tamaki 3:7b7d1273e2d5 399 // c_pos++;
tamaki 3:7b7d1273e2d5 400 // if(c_pos == 5) c_pos=0;
tamaki 3:7b7d1273e2d5 401 // VSC2btn[3] = 0;
tamaki 3:7b7d1273e2d5 402 // }
tamaki 3:7b7d1273e2d5 403 // if(VSC2btn[1] == 1){//left arrow right
tamaki 3:7b7d1273e2d5 404 // c_pos--;
tamaki 3:7b7d1273e2d5 405 // if(c_pos == -1) c_pos=4;
tamaki 3:7b7d1273e2d5 406 // VSC2btn[1] = 0;
tamaki 3:7b7d1273e2d5 407 // }
tamaki 3:7b7d1273e2d5 408 /*
tamaki 3:7b7d1273e2d5 409 if(VSC2btn[0] == 1){//left arrow up
tamaki 3:7b7d1273e2d5 410 time_set = time_set + cd[c_pos];
tamaki 3:7b7d1273e2d5 411 VSC2btn[0] = 0;
tamaki 3:7b7d1273e2d5 412 }
tamaki 3:7b7d1273e2d5 413 if(VSC2btn[2] == 1){//left arrow down
tamaki 3:7b7d1273e2d5 414 if(time_set - cd[c_pos]>=0){
tamaki 3:7b7d1273e2d5 415 time_set = time_set - cd[c_pos];
tamaki 3:7b7d1273e2d5 416 }
tamaki 3:7b7d1273e2d5 417 VSC2btn[2] = 0;
tamaki 3:7b7d1273e2d5 418 }
tamaki 3:7b7d1273e2d5 419 */
tamaki 3:7b7d1273e2d5 420 if(VSC2btn[9] == 1){//start
tamaki 3:7b7d1273e2d5 421 time_cnt = time_set;//set time
tamaki 3:7b7d1273e2d5 422 //relay on
tamaki 3:7b7d1273e2d5 423 module_status = 1;
tamaki 3:7b7d1273e2d5 424 VSC2btn[9] = 0;
tamaki 3:7b7d1273e2d5 425 }
tamaki 3:7b7d1273e2d5 426 // int sec=(time_set%3600)%60, min=(time_set%3600)/60, time = time_set/3600;
tamaki 3:7b7d1273e2d5 427 }else if(module_status == 1){//run mode
tamaki 3:7b7d1273e2d5 428 // int sec=(time_cnt%3600)%60, min=(time_cnt%3600)/60, time = time_cnt/3600;
tamaki 3:7b7d1273e2d5 429 // strcpy(line1, "timer run mode ");
tamaki 3:7b7d1273e2d5 430 // sprintf(line2, "%2d:%2d:%2d ", time, min, sec);
tamaki 3:7b7d1273e2d5 431 // if(time_cnt == 0){
tamaki 3:7b7d1273e2d5 432 // module_status = 2;
tamaki 3:7b7d1273e2d5 433 // }
tamaki 3:7b7d1273e2d5 434 if(VSC2btn[6] == 1){//closs
tamaki 3:7b7d1273e2d5 435 time_set = 0;
tamaki 3:7b7d1273e2d5 436 module_status = 0;
tamaki 3:7b7d1273e2d5 437 VSC2btn[6] = 0;
tamaki 3:7b7d1273e2d5 438 }
tamaki 3:7b7d1273e2d5 439
tamaki 3:7b7d1273e2d5 440 }else if(module_status == 2){//complete
tamaki 3:7b7d1273e2d5 441 strcpy(line1, "timer up!! ");
tamaki 3:7b7d1273e2d5 442 sprintf(line2, "push start");
tamaki 3:7b7d1273e2d5 443 //relay off
tamaki 3:7b7d1273e2d5 444
tamaki 3:7b7d1273e2d5 445 if(VSC2btn[9] == 1){//start
tamaki 3:7b7d1273e2d5 446 module_status = 0;//
tamaki 3:7b7d1273e2d5 447 VSC2btn[9] = 0;
tamaki 3:7b7d1273e2d5 448 }
tamaki 3:7b7d1273e2d5 449 }
tamaki 3:7b7d1273e2d5 450 chksw();
tamaki 3:7b7d1273e2d5 451 if(sw_st[0] == 1){
tamaki 3:7b7d1273e2d5 452 led1 = 1;
tamaki 3:7b7d1273e2d5 453 }else{
tamaki 3:7b7d1273e2d5 454 led1 = 0;
tamaki 3:7b7d1273e2d5 455 }
tamaki 3:7b7d1273e2d5 456 if(sw_st[1] == 1){
tamaki 3:7b7d1273e2d5 457 led2 = 1;
tamaki 3:7b7d1273e2d5 458 }else{
tamaki 3:7b7d1273e2d5 459 led2 = 0;
tamaki 3:7b7d1273e2d5 460 }
tamaki 3:7b7d1273e2d5 461 if(sw_st[2] == 1){
tamaki 3:7b7d1273e2d5 462 led3 = 1;
tamaki 3:7b7d1273e2d5 463 }else{
tamaki 3:7b7d1273e2d5 464 led3 = 0;
tamaki 3:7b7d1273e2d5 465 }
tamaki 3:7b7d1273e2d5 466 if(sw_st[0] == 2){
tamaki 3:7b7d1273e2d5 467 led4 = 1;
tamaki 3:7b7d1273e2d5 468 }else{
tamaki 3:7b7d1273e2d5 469 led4 = 0;
tamaki 3:7b7d1273e2d5 470 }
tamaki 3:7b7d1273e2d5 471 if(sw_st[1] == 2){
tamaki 3:7b7d1273e2d5 472 led5 = 1;
tamaki 3:7b7d1273e2d5 473 }else{
tamaki 3:7b7d1273e2d5 474 led5 = 0;
tamaki 3:7b7d1273e2d5 475 }
tamaki 3:7b7d1273e2d5 476 if(sw_st[2] == 2){
tamaki 3:7b7d1273e2d5 477 led6 = 1;
tamaki 3:7b7d1273e2d5 478 }else{
tamaki 3:7b7d1273e2d5 479 led6 = 0;
tamaki 3:7b7d1273e2d5 480 }
tamaki 3:7b7d1273e2d5 481 sprintf(line2, "%4d:%d%d%d %4d %d%d",
tamaki 3:7b7d1273e2d5 482 time_cnt, sw_st[0], sw_st[1], sw_st[2], (int)(vr.read() * 1023),
tamaki 3:7b7d1273e2d5 483 VSC2btn[0]/*left up*/, VSC2btn[2]/*left down*/ );
tamaki 3:7b7d1273e2d5 484
tamaki 3:7b7d1273e2d5 485 {
tamaki 3:7b7d1273e2d5 486 //display LCD
tamaki 3:7b7d1273e2d5 487 lcd.locate(0,0);
tamaki 3:7b7d1273e2d5 488 lcd.printf(line1);
tamaki 3:7b7d1273e2d5 489 lcd.locate(0,1);
tamaki 3:7b7d1273e2d5 490 lcd.printf(line2);
tamaki 3:7b7d1273e2d5 491 }
tamaki 3:7b7d1273e2d5 492 /*
tamaki 3:7b7d1273e2d5 493 {
tamaki 3:7b7d1273e2d5 494 Sd = new SDFileSystem(p5, p6, p7, p8, "sd");
tamaki 3:7b7d1273e2d5 495 // new sd object *** unable to draw sd card ***
tamaki 3:7b7d1273e2d5 496
tamaki 3:7b7d1273e2d5 497 //write to SD card
tamaki 3:7b7d1273e2d5 498 FILE *fp = fopen("/sdtest.txt", "w");
tamaki 3:7b7d1273e2d5 499 if(fp == NULL) {
tamaki 3:7b7d1273e2d5 500 error("Could not open file for write\n\r");
tamaki 3:7b7d1273e2d5 501 }else{
tamaki 3:7b7d1273e2d5 502 fprintf(fp, line2);
tamaki 3:7b7d1273e2d5 503 fclose(fp);
tamaki 3:7b7d1273e2d5 504 }
tamaki 3:7b7d1273e2d5 505 delete Sd;// delete object *** enable to draw sd card ***
tamaki 3:7b7d1273e2d5 506 }
tamaki 3:7b7d1273e2d5 507 */
va009039 0:1ed23ab1345f 508 }
va009039 0:1ed23ab1345f 509
tamaki 3:7b7d1273e2d5 510
tamaki 3:7b7d1273e2d5 511
tamaki 3:7b7d1273e2d5 512 Ticker t1s;
tamaki 3:7b7d1273e2d5 513 void t1scall(void)
tamaki 3:7b7d1273e2d5 514 {
tamaki 3:7b7d1273e2d5 515 if(module_status == 1){
tamaki 3:7b7d1273e2d5 516 time_cnt ++;
tamaki 3:7b7d1273e2d5 517 }
tamaki 3:7b7d1273e2d5 518 }
tamaki 3:7b7d1273e2d5 519
va009039 0:1ed23ab1345f 520 // main
va009039 0:1ed23ab1345f 521 int main(void)
va009039 0:1ed23ab1345f 522 {
tamaki 3:7b7d1273e2d5 523 t1s.attach(&t1scall, 1);
tamaki 3:7b7d1273e2d5 524 timer.start();
tamaki 3:7b7d1273e2d5 525
va009039 0:1ed23ab1345f 526 pc.baud(921600);
tamaki 3:7b7d1273e2d5 527 pc.printf("mbed BoardChk1");
tamaki 3:7b7d1273e2d5 528 lcd.printf("mbed BoardChk1");
va009039 0:1ed23ab1345f 529
tamaki 3:7b7d1273e2d5 530 sw1.mode(PullUp);
tamaki 3:7b7d1273e2d5 531 sw2.mode(PullUp);
tamaki 3:7b7d1273e2d5 532 sw3.mode(PullUp);
tamaki 3:7b7d1273e2d5 533
tamaki 3:7b7d1273e2d5 534 log_info("%s\n", __FILE__);
va009039 0:1ed23ab1345f 535 // init LEDs
tamaki 3:7b7d1273e2d5 536 brd_led1 = brd_led2 = brd_led3 = brd_led4 = 0;
va009039 0:1ed23ab1345f 537
va009039 0:1ed23ab1345f 538 /// GET STARTED with BTstack ///
va009039 0:1ed23ab1345f 539 btstack_memory_init();
va009039 0:1ed23ab1345f 540 run_loop_init(RUN_LOOP_EMBEDDED);
va009039 0:1ed23ab1345f 541
va009039 0:1ed23ab1345f 542 // init HCI
va009039 0:1ed23ab1345f 543 hci_transport_t* transport = hci_transport_usb_instance();
va009039 0:1ed23ab1345f 544 remote_device_db_t * remote_db = (remote_device_db_t *) &remote_device_db_memory;
va009039 0:1ed23ab1345f 545 hci_init(transport, NULL, NULL, remote_db);
va009039 0:1ed23ab1345f 546
va009039 0:1ed23ab1345f 547 // init L2CAP
va009039 0:1ed23ab1345f 548 l2cap_init();
va009039 0:1ed23ab1345f 549 l2cap_register_packet_handler(packet_handler);
va009039 0:1ed23ab1345f 550
va009039 0:1ed23ab1345f 551 // init RFCOMM
va009039 0:1ed23ab1345f 552 rfcomm_init();
va009039 0:1ed23ab1345f 553 rfcomm_register_packet_handler(packet_handler);
va009039 0:1ed23ab1345f 554 rfcomm_register_service_internal(NULL, rfcomm_channel_nr, 100); // reserved channel, mtu=100
va009039 0:1ed23ab1345f 555
va009039 0:1ed23ab1345f 556 // init SDP, create record for SPP and register with SDP
va009039 0:1ed23ab1345f 557 sdp_init();
va009039 0:1ed23ab1345f 558 memset(spp_service_buffer, 0, sizeof(spp_service_buffer));
va009039 0:1ed23ab1345f 559 service_record_item_t * service_record_item = (service_record_item_t *) spp_service_buffer;
va009039 0:1ed23ab1345f 560 sdp_create_spp_service( (uint8_t*) &service_record_item->service_record, 1, "loopback");
va009039 0:1ed23ab1345f 561 log_info("SDP service buffer size: %u\n\r", (uint16_t) (sizeof(service_record_item_t) + de_get_len((uint8_t*) &service_record_item->service_record)));
va009039 0:1ed23ab1345f 562 sdp_register_service_internal(NULL, service_record_item);
va009039 0:1ed23ab1345f 563
va009039 0:1ed23ab1345f 564 // set one-shot timer
va009039 0:1ed23ab1345f 565 timer_source_t heartbeat;
va009039 0:1ed23ab1345f 566 heartbeat.process = &heartbeat_handler;
va009039 0:1ed23ab1345f 567 run_loop_set_timer(&heartbeat, HEARTBEAT_PERIOD_MS);
va009039 0:1ed23ab1345f 568 run_loop_add_timer(&heartbeat);
va009039 0:1ed23ab1345f 569
va009039 0:1ed23ab1345f 570 log_info("SPP loopback demo...\n\r");
va009039 0:1ed23ab1345f 571
va009039 0:1ed23ab1345f 572 // turn on!
va009039 0:1ed23ab1345f 573 hci_power_control(HCI_POWER_ON);
va009039 0:1ed23ab1345f 574
va009039 0:1ed23ab1345f 575 // go!
va009039 0:1ed23ab1345f 576 run_loop_execute();
va009039 0:1ed23ab1345f 577
va009039 0:1ed23ab1345f 578 return 0;
va009039 0:1ed23ab1345f 579 }
va009039 0:1ed23ab1345f 580 #endif