From 5d91dc66fe0f49ab5cb9d5dc7459a9abba5ea7de Mon Sep 17 00:00:00 2001 From: Erik Nyquist Date: Thu, 29 Dec 2016 17:57:17 -0800 Subject: [PATCH 01/91] libarc32_arduino101/Makefile: Add 'strip' target The file libarc32drv_arduino101.a is built with debugging symbols by default, however the version we ship needs to be stripped. The new "strip" target makes it easy for us to strip when committing, and the default target still behaves the same way, so the library can be re-compiled for debugging purposes --- system/libarc32_arduino101/Makefile | 4 ++++ variants/arduino_101/libarc32drv_arduino101.a | Bin 797726 -> 190802 bytes 2 files changed, 4 insertions(+) diff --git a/system/libarc32_arduino101/Makefile b/system/libarc32_arduino101/Makefile index a9ef7d07..bccd2ab3 100644 --- a/system/libarc32_arduino101/Makefile +++ b/system/libarc32_arduino101/Makefile @@ -17,6 +17,7 @@ C_SRC+=$(wildcard $(PWD)/framework/src/os/*.c) ARCH=ARC CC=arc-elf32-gcc AS=arc-elf32-as +STRIP=arc-elf32-strip RM=rm -f INSTALL=install @@ -56,6 +57,9 @@ $(TARGET_LIB): $(C_OBJ) $(ASM_OBJ) @echo "Link $@" @$(AR) rcs $@ $^ +strip: $(TARGET_LIB) + @$(STRIP) --strip-unneeded $^ + %.o: %.S @echo "Assembling $<" $(CC) -c $(CFLAGS) $< -o $@ diff --git a/variants/arduino_101/libarc32drv_arduino101.a b/variants/arduino_101/libarc32drv_arduino101.a index e739392b68fe6bcc004fd02643674f32668ec6b9..af098ec4401f2ef6f736eea7d93191a21cdd229d 100644 GIT binary patch delta 49343 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.FZ+TDzDk>Th==>81e_-u+ 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ΝeD7nHoI0~4aIg%%^l*wT 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 Z7(NH=HYksnd9r&8D0&4K5vVbF{|^*@%2faW From 17d2e2fb22ba0cd239c46973cca0006704534195 Mon Sep 17 00:00:00 2001 From: Erik Nyquist Date: Mon, 9 Jan 2017 10:55:34 -0800 Subject: [PATCH 02/91] Rebuild libarc32drv_arduino101.a --- variants/arduino_101/libarc32drv_arduino101.a | Bin 190802 -> 190802 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/variants/arduino_101/libarc32drv_arduino101.a b/variants/arduino_101/libarc32drv_arduino101.a index af098ec4401f2ef6f736eea7d93191a21cdd229d..c3fc2f474992a2b910fb4489b33188904f4941f7 100644 GIT binary patch delta 3015 zcmcJQZA@Eb6oB9N(3W>%j)!hk-NAmLxxqIJFIpQubF?KIJS<6^anZxX=93x5?+^F=Hdv|uF~ImT*Nu1Q_X@_B1{uK35XwV?kY{Z_gImOpGq@Xu zI0m=a+s5EddgK}IXH5(q6pmU3&1Ezv_A}_{V(#VJn&=B2K`0*&Gq``03_MB8pk9$< z@&$YT7gO;J*2=7g!3sE{IE7~#cHy{c6TTaHJksW}RMt0D)>*2{T{dY(^)Sa5)V&f{ z_Hm5b_=WU#go0yf_-FV`lnZ}Wzk?SxzKN&0voKG+O&W{(Axt_G_c|A|I=)3J-`oJ= zQWt+n`X*);#HLZcLs+)*Z6a`kAHsvW13M~QmgeS~DobU9omJG^EKZxFrKZwmu{D+l z!#`8OC620BgdqaVs7uJi*mUa%!sh#*lst&(Q>p*LI zI6j`P#p?6|&B`xEug}iT+mmg`30~6Y=^x3dyme2@o z3WTH4OFFZ64sga!xzU#zw_s5(rKI{^MGTgdlFn6ncr$)|g>+Z1#OSbKEQZ>Gb?i_q z78}VryKyc-EN$SF^rWfzH5EFBC@Fn7)E|vEe!D^%jG^RzvEo+ru0;1X@G?u0Cv@P`34 z1<#EzXwziu-jn~=3|5ngFu8RE~Kr!5CSP;w4Juo?QjXi;U3z))&pLRsCCe`+X0y} zQPfJ?`c^247K5F%o#=#inJ^B});s_uTH$S>?R*PVhlx+UKz;+0UYJpeqRVt`{beYQ e6eSmF>$(Vjl^FKXcG3rJa&dN^w%^V}i}DYvR}+T- delta 3028 zcmc)LeN0dZ6^@HMUmSwPLTowa0S?0FjB*rCGCvh4x{vdXu3ob7oL5(+g zZqobfIrsFQHjPFTqS1stlhR@CuAX~10h0A2NpJBBjiH)%1oRkWJ#WRZ~AJKkmdSihLAe;3|GV4j+XFHYJB{Bz8# zv^qYoCa_#z#y`*Uu`|k3Y-`eo(jCoF%8JS!W1Xs0mbr7i^o&|g`6Vq~!+TSxo(-g| zXU}N{n3&v^q>~Q?~)I&pOS*og_JuomZLZEMiaLi#$blB(;2g4Zg#{Jj51nx|@O^E3$JD^i)h1=y(Z6MiuRa@Y=25<8OF z$1C$d$C^wpr`CJjLaRH_?h)OB+vlqHvgE98cFk1If7=bKr5Cf`r!1WHL8`|u3azjC zL_u_Uz4b1!nIHQYvSr?uM&20)1N+E4#K4@+!{PYE%{h6@VD?Fea|$Sn=C&C9E}usv zg5YY6-zzBWae2H%u)Es4L1xH1#I~-x#xCadvbuat%KQbn{2nIeKdGDh$1$5XTP&9N z*;;Cr&gCCbVAq|SVk+!pVYcVuh_}d!cpLYF1@Ko8K0bGoKx8Z`yrp zc)5mRG2+xvDS^qHY1nEuIF)HEFog}2-kLh5Wlh`A*0*gE*wi4})Tf?LXO0TAbymbw zZ0I1`#t)`tveJ9#I&1HJqhHtXs^GDTg)K$q__4X9tQgs_Z)o0u?^@*QEG?Atj#7N)6QwY?iW@9=ecS?-D(<u%z;>?U+5xN!onTP7f?;X`A19Up_L OBtCo_ueWYPyZU!#qZ0}M From 7c97231c087929a90ae880486b3c0ce539a9b326 Mon Sep 17 00:00:00 2001 From: Erik Nyquist Date: Tue, 10 Jan 2017 10:31:56 -0800 Subject: [PATCH 03/91] CurieIMU.cpp: initialize saved accel/gyro ranges in begin() This ensures that "read[Accelerometer/Gyro]Scaled()" will work as expected even if a range has not been explicitly set using the API --- libraries/CurieIMU/src/CurieIMU.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/libraries/CurieIMU/src/CurieIMU.cpp b/libraries/CurieIMU/src/CurieIMU.cpp index 8b24c5a5..0def7306 100644 --- a/libraries/CurieIMU/src/CurieIMU.cpp +++ b/libraries/CurieIMU/src/CurieIMU.cpp @@ -47,7 +47,12 @@ bool CurieIMUClass::begin() * MakgetGyroRatee sure the device is connected and responds as expected. * @return True if connection is valid, false otherwise */ - return (CURIE_IMU_CHIP_ID == getDeviceID()); + if (CURIE_IMU_CHIP_ID != getDeviceID()) + return false; + + accel_range = (float) getAccelerometerRange(); + gyro_range = (float) getGyroRange(); + return true; } void CurieIMUClass::end() From 90e8bc65828a7e65f5a59d9a64c3db7df185e0a3 Mon Sep 17 00:00:00 2001 From: Dino Tinitigan Date: Tue, 10 Jan 2017 09:55:59 -0800 Subject: [PATCH 04/91] shared memory structure changes for CODK-M -added struct for ipm using shared memory -added cdc-acm buffer space on shared memory which is used by the new firmware --- .../framework/include/platform.h | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/system/libarc32_arduino101/framework/include/platform.h b/system/libarc32_arduino101/framework/include/platform.h index 583fcf71..3fe25184 100644 --- a/system/libarc32_arduino101/framework/include/platform.h +++ b/system/libarc32_arduino101/framework/include/platform.h @@ -40,6 +40,7 @@ #define NUM_CPU 4 #define CDCACM_BUFFER_SIZE 256 +#define SHARED_BUFFER_SIZE 64 struct cdc_ring_buffer { @@ -62,6 +63,30 @@ struct cdc_acm_shared_data { int device_open; }; +struct shared_ring_buffer +{ + /** Ring buffer data */ + volatile uint8_t data[SHARED_BUFFER_SIZE]; + /** Ring buffer head index, modified by producer */ + volatile int head; + /** Ring buffer tail index, modified by consumer */ + volatile int tail; + + /** Buffer status + * 0 - locked by X86 core + * 1 - locked by arc core + * 2 - available to be taken by any core + **/ + volatile int flag; +}; + +struct ipm_shared_data +{ + struct shared_ring_buffer *quark_buffer; + struct shared_ring_buffer *arc_buffer; +}; + + /** * LMT / ARC global shared structure. This structure lies in the beginning of * the RAM. @@ -109,6 +134,18 @@ struct platform_shared_block_ { * The ARC core counts on QRK to find valid pointers in place. */ struct cdc_acm_shared_data * cdc_acm_buffers; + + struct cdc_acm_shared_data cdc_acm_buffers_obj; + + struct cdc_ring_buffer cdc_acm_shared_rx_buffer; + struct cdc_ring_buffer cdc_acm_shared_tx_buffer; + + struct ipm_shared_data *ipm_shared_data_ptr; + + struct ipm_shared_data ipm_shared_data_obj; + + struct shared_ring_buffer quark_to_ARC; + struct shared_ring_buffer ARC_to_quark; }; #define RAM_START 0xA8000000 From cd3215bd5929dd83004cdf3b94e32726ff2eba2e Mon Sep 17 00:00:00 2001 From: Dino Tinitigan Date: Tue, 10 Jan 2017 10:17:13 -0800 Subject: [PATCH 05/91] expose all AON-GPIOs -expose AON-GPIOs since they are available on the TinyTILE --- variants/arduino_101/pins_arduino.h | 2 +- variants/arduino_101/variant.cpp | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/variants/arduino_101/pins_arduino.h b/variants/arduino_101/pins_arduino.h index e447277c..8be94f07 100644 --- a/variants/arduino_101/pins_arduino.h +++ b/variants/arduino_101/pins_arduino.h @@ -25,7 +25,7 @@ #ifndef Pins_Arduino_h #define Pins_Arduino_h -#define NUM_DIGITAL_PINS 29 +#define NUM_DIGITAL_PINS 32 #define NUM_ANALOG_INPUTS 6 #define NUM_PWM 4 #define NUM_UARTS 1 diff --git a/variants/arduino_101/variant.cpp b/variants/arduino_101/variant.cpp index 6993d2f5..9e9b52ce 100644 --- a/variants/arduino_101/variant.cpp +++ b/variants/arduino_101/variant.cpp @@ -87,15 +87,18 @@ PinDescription g_APinDescription[]= { 5, SS_GPIO_8B0, SS_GPIO, SS_GPIO_8B0_BASE_ADDR, 13, GPIO_MUX_MODE, INVALID, INVALID, 13, INPUT_MODE }, // Arduino IO17 { 6, SS_GPIO_8B0, SS_GPIO, SS_GPIO_8B0_BASE_ADDR, 14, GPIO_MUX_MODE, INVALID, INVALID, 14, INPUT_MODE }, // Arduino IO18 { 1, SS_GPIO_8B0, SS_GPIO, SS_GPIO_8B0_BASE_ADDR, 9, GPIO_MUX_MODE, INVALID, INVALID, 9, INPUT_MODE }, // Arduino IO19 - { 0, SS_GPIO_8B0, SS_GPIO, SS_GPIO_8B0_BASE_ADDR, 8, GPIO_MUX_MODE, INVALID, INVALID, INVALID, INPUT_MODE }, // Arduino IO20 + { 0, SS_GPIO_8B0, SS_GPIO, SS_GPIO_8B0_BASE_ADDR, 8, GPIO_MUX_MODE, INVALID, INVALID, INVALID, INPUT_MODE }, // Arduino IO20 { 24, SOC_GPIO_32, SOC_GPIO, SOC_GPIO_BASE_ADDR, 58, GPIO_MUX_MODE, INVALID, INVALID, INVALID, INPUT_MODE }, // Arduino IO21 { 12, SOC_GPIO_32, SOC_GPIO, SOC_GPIO_BASE_ADDR, 46, GPIO_MUX_MODE, INVALID, INVALID, INVALID, INPUT_MODE }, // Arduino IO22 { 13, SOC_GPIO_32, SOC_GPIO, SOC_GPIO_BASE_ADDR, 47, GPIO_MUX_MODE, INVALID, INVALID, INVALID, INPUT_MODE }, // Arduino IO23 { 14, SOC_GPIO_32, SOC_GPIO, SOC_GPIO_BASE_ADDR, 48, GPIO_MUX_MODE, INVALID, INVALID, INVALID, INPUT_MODE }, // Arduino IO24 { 26, SOC_GPIO_32, SOC_GPIO, SOC_GPIO_BASE_ADDR, 60, GPIO_MUX_MODE, INVALID, INVALID, INVALID, INPUT_MODE }, // Arduino IO25 - { 1, SOC_GPIO_32, SOC_GPIO, SOC_GPIO_AON_BASE_ADDR, 1, GPIO_MUX_MODE, INVALID, INVALID, INVALID, INPUT_MODE }, // Arduino IO26 - { 2, SOC_GPIO_32, SOC_GPIO, SOC_GPIO_AON_BASE_ADDR, 2, GPIO_MUX_MODE, INVALID, INVALID, INVALID, INPUT_MODE }, // Arduino IO27 - { 3, SOC_GPIO_32, SOC_GPIO, SOC_GPIO_AON_BASE_ADDR, 3, GPIO_MUX_MODE, INVALID, INVALID, INVALID, INPUT_MODE }, // Arduino IO28 + { 0, SOC_GPIO_32, SOC_GPIO, SOC_GPIO_AON_BASE_ADDR, 0, GPIO_MUX_MODE, INVALID, INVALID, INVALID, INPUT_MODE }, // Arduino IO26 *soft reset button + { 1, SOC_GPIO_32, SOC_GPIO, SOC_GPIO_AON_BASE_ADDR, 1, GPIO_MUX_MODE, INVALID, INVALID, INVALID, INPUT_MODE }, // Arduino IO27 + { 2, SOC_GPIO_32, SOC_GPIO, SOC_GPIO_AON_BASE_ADDR, 2, GPIO_MUX_MODE, INVALID, INVALID, INVALID, INPUT_MODE }, // Arduino IO28 + { 3, SOC_GPIO_32, SOC_GPIO, SOC_GPIO_AON_BASE_ADDR, 3, GPIO_MUX_MODE, INVALID, INVALID, INVALID, INPUT_MODE }, // Arduino IO29 + { 4, SOC_GPIO_32, SOC_GPIO, SOC_GPIO_AON_BASE_ADDR, 4, GPIO_MUX_MODE, INVALID, INVALID, INVALID, INPUT_MODE }, // Arduino IO30 *imu_int + { 5, SOC_GPIO_32, SOC_GPIO, SOC_GPIO_AON_BASE_ADDR, 5, GPIO_MUX_MODE, INVALID, INVALID, INVALID, INPUT_MODE }, // Arduino IO31 *ble_int } ; uint32_t pwmPeriod[] = {PWM_PERIOD, PWM_PERIOD/2, PWM_PERIOD/2, PWM_PERIOD}; From 29daefb64ae643a0cb2bcb15b586e90a206bf7e8 Mon Sep 17 00:00:00 2001 From: Dino Tinitigan Date: Tue, 10 Jan 2017 10:24:15 -0800 Subject: [PATCH 06/91] add support for Power Management library --- system/libarc32_arduino101/drivers/soc_gpio.c | 3 +++ system/libarc32_arduino101/drivers/soc_gpio.h | 1 + .../drivers/ss_gpio_iface.c | 3 +++ .../drivers/ss_gpio_iface.h | 1 + .../framework/include/platform.h | 10 ++++++++++ variants/arduino_101/libarc32drv_arduino101.a | Bin 190802 -> 190830 bytes 6 files changed, 18 insertions(+) diff --git a/system/libarc32_arduino101/drivers/soc_gpio.c b/system/libarc32_arduino101/drivers/soc_gpio.c index c06f14e4..382f8c61 100644 --- a/system/libarc32_arduino101/drivers/soc_gpio.c +++ b/system/libarc32_arduino101/drivers/soc_gpio.c @@ -34,6 +34,7 @@ #include "soc_register.h" #include "portable.h" +#include "platform.h" #define GPIO_CLKENA_POS (31) #define GPIO_LS_SYNC_POS (0) @@ -429,6 +430,8 @@ static void soc_gpio_ISR_proc( uint32_t dev_id ) uint32_t status = MMIO_REG_VAL_FROM_BASE(dev->reg_base, SOC_GPIO_INTSTATUS); // Mask the pending interrupts MMIO_REG_VAL_FROM_BASE(dev->reg_base, SOC_GPIO_INTMASK) |= status; + // Save a copy of the INTSTATUS register + shared_data->pm_int_status = status; // Clear interrupt flag (write 1 to clear) MMIO_REG_VAL_FROM_BASE(dev->reg_base, SOC_GPIO_PORTA_EOI) = status; diff --git a/system/libarc32_arduino101/drivers/soc_gpio.h b/system/libarc32_arduino101/drivers/soc_gpio.h index 401011cb..a2623f2d 100644 --- a/system/libarc32_arduino101/drivers/soc_gpio.h +++ b/system/libarc32_arduino101/drivers/soc_gpio.h @@ -43,6 +43,7 @@ #include "data_type.h" #include "gpio.h" +#include "platform.h" // soc gpio 32 bit count #if defined(CONFIG_SOC_GPIO_32) diff --git a/system/libarc32_arduino101/drivers/ss_gpio_iface.c b/system/libarc32_arduino101/drivers/ss_gpio_iface.c index 9d8543b6..fad7743e 100644 --- a/system/libarc32_arduino101/drivers/ss_gpio_iface.c +++ b/system/libarc32_arduino101/drivers/ss_gpio_iface.c @@ -37,6 +37,7 @@ #include "io_config.h" #include "eiaextensions.h" #include "portable.h" +#include "platform.h" /* EIA GPIO device registers */ #define SWPORTA_DR (0x00) /* GPIO Port A Data Register*/ @@ -355,6 +356,8 @@ static void ss_gpio_ISR_proc( uint32_t dev_id ) uint32_t status = REG_READ( INTSTATUS ); /* Mask the pending IRQ in order to avoid a storm of interrupts */ REG_WRITE(INTMASK, REG_READ(INTMASK) | status); + // Save a copy of the INTSTATUS register + shared_data->pm_int_status = status; // Clear interrupt flag (write 1 to clear) REG_WRITE( PORTA_EOI, status ); diff --git a/system/libarc32_arduino101/drivers/ss_gpio_iface.h b/system/libarc32_arduino101/drivers/ss_gpio_iface.h index 86630387..58acfc7b 100644 --- a/system/libarc32_arduino101/drivers/ss_gpio_iface.h +++ b/system/libarc32_arduino101/drivers/ss_gpio_iface.h @@ -41,6 +41,7 @@ #include "data_type.h" #include "gpio.h" +#include "platform.h" #define SS_GPIO_8B0_BITS (8) #define SS_GPIO_8B1_BITS (8) diff --git a/system/libarc32_arduino101/framework/include/platform.h b/system/libarc32_arduino101/framework/include/platform.h index 3fe25184..71c7e7f2 100644 --- a/system/libarc32_arduino101/framework/include/platform.h +++ b/system/libarc32_arduino101/framework/include/platform.h @@ -146,6 +146,16 @@ struct platform_shared_block_ { struct shared_ring_buffer quark_to_ARC; struct shared_ring_buffer ARC_to_quark; + + uint32_t arc_cpu_context[33]; + + uint32_t pm_status; + + void* arc_restore_addr; + + void* quark_restore_addr; + + uint32_t pm_int_status; }; #define RAM_START 0xA8000000 diff --git a/variants/arduino_101/libarc32drv_arduino101.a b/variants/arduino_101/libarc32drv_arduino101.a index c3fc2f474992a2b910fb4489b33188904f4941f7..db6e5b4591162ed7abd8d50f81b0b7d077847d32 100644 GIT binary patch delta 5559 zcmcgv32>9g72bW4EE^kJ@*!hHY=g1o1M9LZ+Z@H=PNBvr45UC1@&PusWg#0dgozx; z023%sHp6BDB&J->Q7$$9UCcCe!Zi&Oj?l!@WD;W1b{Z~YQbIZ@^sOW}stdnK+Gc0I zx4ZAXeQ*EWx4ZAZcro(E#mFsswar|RS7^2z9`+jbmJ!nN9niUukiO_zNr)V7|Co@6 z!HWVKQSzTi$RIR*+y5Qj|Jq6E%Y+KdF@7I-A3UhZO6W5qe*kzxob0|q=noC=gB)JH zN2owI#>T_&^)f>59VMWM?jH$92=rp`Cj>&^4efy0O8$j{mkB%w;}#O=57UqpITnEz*@+kY@%7dt$FW)oY&>{J4$&|RD_TUgdPTDr+6}?n;+$Y~>KuKp_5-j8qS-YH^J- z$axkyT75wJx?dV-|5osa1lnC8{2sx7EWjrettkU-CAPJ~JeFj^2WG1=jR|^j`8fe; zQ*e|pzA9u?YfvW>`A7V1)>4z06twU~P%3Qn1f=I{(!_U#BPSN2hpn}vD6rABGrTyd zLSzY3dQ=wWM~L1DPQtccA-II#Ye=*Pf0N9_N*{Ds7Hp5eIy%@EuEaO?>IffV0jjVT z_Vp?xSXgx3dORhf#3_S6%S@OEcX-Zx^0(7xf8dj_;B`GRq%Kedm(hP~5n zpl8`tq(fNTZwwHxV%^<3?V3J{nXDXzqg8CnEuD5(AEAx;P*|m63ohxjC;AABnc}Dc zcBokMMV2PK`9n@C&U$EspJluKQg(S_hH6zLA$InvBMpN@-(gT4Ld`OE zZeJps-w`7pi3NC+L?pI#bPSP;=?$HKkC3-yv)cUEJ1*9_uAvJ<19kiO{Z-lN#c|5U z?4gA0U6F(I+mKC~l9Ns}*WJoZNf@@;K4E(Y!!|HZgs#w3#_MfSALD9~%T4UPpQrj3 zU)iCiE}!~pje^b39!{q*enZ6D+eqE)FG$;2%uNGb#R`y~VGgA0**c`7*+HZ)vJa7V zvinHenW5W28`<=31CR*T)SW?3uvd{4#ZDs~&Tb+d#1d~A(9Kw+!`ULFJJ@EVW+ov$ z!#=%bfHO+5t1P)kgI-KM26~sx_ET?OJ(%WcdZNm~HGAomtYP zYgD0>zmTm~aUn}vyXlp1Ij@_)rrG_aVdxdlo&@)4WIwr+t-#{n(OC+Z8!PAb-2{m3 z$8EmNEIt-mV%YhvcxkjA)+%B=m>)T7YwOD$2wyxvn;TV2+W>-1DCMS;a^$#vHuhi9fhiPV?^QkX_O;#gim=+&6c@KG6% zMqlEN3^36{d~*hrYJxX;Mo{OxbTb1gs3w>y7=!G~ygU=q27HO#X@aGawq(Ly3I%z5 zXf`B3k%c=BLV{GD4RI7bEYE@IbQM1>surF&0;@OqB2l$-NmM7eIv1t`iQ-S?LJ6J8 z_hXli;9rUA5T9&>9FbP=wMNj;v%KDjYjHrdKM%A&FhV>H=U0v56;W}G2{N!|mp{<) z5))_yZvpbyE1pbxj2|?CfllEcimH|0H$guK-BO5mvMVQ3@|Yn-Ew|Zk6u^-I@{yf~ z`MXH%ck+-BC2_@s3N%A3zL%~2pNv+ zZAbL}iA)gdAHmOi@$^OTF9X$}W*CLNnazG?6ZXW=Yp5!Q_YM^~ISxJBjPAmD>T{4b z5Vb^V?9bf8q|)bLE{*TIDVBWveS2*+n7I2OD5aj&a9j~B-s@oGkV^`YVa`WZ=xXBO ziigBl@jvu$Y=t;XI<5F05=MHH_Ro3DI!KgC)`5b`#dXbkuq)*hIyS;jHS(v(VhOwt zvv$Iwes1b~Tb}=>4*MnKB*?j)DuG8K@75Yjsid$DkizA4^YRM)PgvLqFbtFrMyrh- gPtTT?U4VlTax)zJ5xmgPTVk~Yl0GT+Gbj%KCs&ydwEzGB delta 5467 zcmcgw3sBU@8Q=ZxjspSx1M)n=Q#jy+dvL%Z#^N(p9kkVn78_3#6$AkfocJ1##7^p1 zd<>g$GotovMXj2N_9A}+PGX~}8I!7^PU6JcSRJi{L=Y|0s1y6`JuGANkLe>j^Sj;s z?Qi$n|F_>h;C5$lXJ_zMoi?}7W;5j$97*{db(Rv+@jY;H9wATSs)Gj<9JGNipG=Q6Q9KqcwSrzC*a4G zHUeJQmz7o4kjk0{HgRSw8)jVUo}hgtAWX*+q%-%OANktK(GBiO$PG6 z_mr8dDmvCTLYJ>qjM3+9Jzte7zAF%!aD-0PTwO#}Y;^TZCr-+Slo(2feh_I4!au=D zSk|cpOUM*NnBG$)voO>73@-4MM`AwIR~DwkH~KZghHyXy=3;yuPD~^=blKQ6-#8|$ z`}I~Vhlv3(1t4@PeqtkxWj)I@tbN%HFz2)LHPK+RvE4Ohp4Lyz{BjuGkgsV7cZnP;|fb2rVThuDwyCBL|7n3zRt@x%C!+j<+b z8(YR-UzP1@E&fy8U6*=O^iYj7Y}n?A)`=&69K7;s5|EFU|Km<;adu-s@;TMl?$&*+ zLG-8YsYi;`bPls;rP2^~@TeY|h{rXo>!?Ic>;W=6e9WjeiH>Gd+w_`4Xt$c%k3cG& z%vz9$LDy{Hx)z#BXR%vtdg@{kvYxJFMY0|)0C$~*D7IRb=zjJqWY(&--K0_M3=*HR zOGw;PaTA~E6>rh=wQKLPhC&5=~-N$XJoVC1wYZ8Ob`3nXlo8W6{WcWNa+BT~FU+x%fMQ&287i zDb%Y_zr9@&W$7}F3eU!P!7n2s7)3gzVOJ)mYZ`(H$!EW|r-lY%IJ!`jiH*_xkr5JE zNrzr39=3FJ#VfC}CC}nnW%q{{KM7KnS}nQk4{4cHVqaWMF5TjZhwGkrXc>RHA}hTy zVnjt&N-_CpwE=%)CmYg<^md(kOLQp4#?X?8>l0nR*l5MrxL&Mo$V$d7mb_Udl3_q*p^JFcbWZr!aa6~Fow`n;r5qQ&gs?Z?ru%_V&bMY@O`U(+%uaj~+gy+@+yWyksm$7~Dm@dZrM!J1G%lJ z6S2^ay4A>ij@)t2re;I>Bzm0b`t&%V@%Y=#s`~WM?QJ~JCy64idBFT2Lf)pVac?RM zzN@D*Snk~{rFDMwZdas2ySyfdz8^fu>YAT2ta3u_&V zsw)@NXPZst?8UW?Dn2d|O62B5I2s`No*28ZvrbD$1D~Ca2liIJCLN4)KR=ibGbC}H zVoFB{&Bt=E9?GfYyX13x^hNH>fYc$~Se+&)wR|W8T4`*4ftlnuYRk(S%5v=X#VcwS z+U+^!{6Z`LNga)pommh;(I7LxblSkLiR>+&I})=!e7(pH^FNF1I8V)n>G02B-jEF? zbQ(X2)u0ifc*ml-WPa|iG?9t*T=taE zVsz(xd?%!!#VB^puA?rlGl9|}Alpq)qE+7HmIChsSMD!>^+S}kxfbsmT>fwzoDNZb zgxd=7Ra9fhkUOWtEG-{18)A6#9Eg!$o(-cZ+maZ=A%;4b>1L8V`e%5`W5&V=n&pLAJ$V1uPcLSs*yL80RyV#@#QcR8|%t3nuc(fsHyqAa%iE!^43LQ zP{lnN8J0pzA<0=#U!TKwFNP>u&$}xiNoC73d*X#}eFuWMu@Z)@YuaB2d$?mcjG(hPUk-YHV>!5$9hYC2pX71e zRR5*MkvBsowxR;w|2e} z*CmkOY{b#EeDrI8?-J~cVeWZE2g%j1!CcBOzYf{Fe+o!yv$fD72d;-ds+?eQnm*+gOVT8`V=Y-Z@UW_`?$NxSSI^2AZlL#wOUE$MVKRj|U-Soc3<)yy_6;<{) zp30uT2j#X6pdI7{x0-$0fK8Ap4RSA-xv86G$&Q_{WRPL=te!`gobnqmC|>bPWN@gI zKgVM6O);ed#1Sghzh8ol8l}7I(G{o-{1*~9 B64(F$ From b60860237540cde903b81615c3324f47f03cd756 Mon Sep 17 00:00:00 2001 From: Erik Nyquist Date: Tue, 10 Jan 2017 15:18:27 -0800 Subject: [PATCH 07/91] Add new library MemoryFree This is the MemoryFree libary from http://playground.arduino.cc/code/AvailableMemory, rewritten specifically for Arduino 101 and tinyTILE. It provides some functions for querying available stack & heap space. --- libraries/MemoryFree/README.md | 41 +++++++++++++ .../examples/freeMemory/freeMemory.ino | 46 +++++++++++++++ libraries/MemoryFree/keywords.txt | 11 ++++ libraries/MemoryFree/library.properties | 10 ++++ libraries/MemoryFree/src/MemoryFree.cpp | 58 +++++++++++++++++++ libraries/MemoryFree/src/MemoryFree.h | 48 +++++++++++++++ 6 files changed, 214 insertions(+) create mode 100644 libraries/MemoryFree/README.md create mode 100644 libraries/MemoryFree/examples/freeMemory/freeMemory.ino create mode 100644 libraries/MemoryFree/keywords.txt create mode 100644 libraries/MemoryFree/library.properties create mode 100644 libraries/MemoryFree/src/MemoryFree.cpp create mode 100644 libraries/MemoryFree/src/MemoryFree.h diff --git a/libraries/MemoryFree/README.md b/libraries/MemoryFree/README.md new file mode 100644 index 00000000..d08aa930 --- /dev/null +++ b/libraries/MemoryFree/README.md @@ -0,0 +1,41 @@ +## MemoryFree library for Arduino/Genuino101 and tinyTILE + +This library is a re-write of http://playground.arduino.cc/Code/AvailableMemory +specifically for Curie-based devices. This library defines the same header file +`MemoryFree.h`, and provides the function `freeMemory()`. In addition, two extra +functions are provided; `freeHeap()`, for heap space only, and `freeStack()`, +for free stack space. `freeStack()` can also be used to detect a stack overflow. + +The rewrite is necessary for two reasons: + +* AVR-based boards use a different implementation of `malloc()` than Curie-based + boards, and in order to determine the amount of free heap space, we depend + on specific symbols defined by the `malloc()` implementation. The `malloc()` + implementation used by Curie-based devices + [can be seen here](https://github.com/foss-for-synopsys-dwc-arc-processors/glibc). + +* Curie-based boards have a different memory layout than AVR-based boards. See + the [linker script](https://github.com/01org/corelibs-arduino101/blob/master/variants/arduino_101/linker_scripts/flash.ld) + for Arduino/Genuino 101 for details of the memory layout + for Curie-based devices. + +## Functions + + +`int freeHeap (void)` + +Returns the number of bytes free in the heap, i.e. the number of bytes free +to be allocated using `malloc()`. + +`int freeStack (void)` + +Returns the number of bytes free in the stack, i.e. the space between the +current stack frame and the end of the stack area. This function will return +a negative number in the event of a stack overflow, representing the size of +the overflow; for example, a return value of -20 means that the current stack +frame is 20 bytes past the end of the stack area. + +`int freeMemory (void)` + +Returns the number of bytes free in both the stack and the heap. If a stack +overflow has occurred, only the number of bytes free in the heap is returned. diff --git a/libraries/MemoryFree/examples/freeMemory/freeMemory.ino b/libraries/MemoryFree/examples/freeMemory/freeMemory.ino new file mode 100644 index 00000000..724f81ac --- /dev/null +++ b/libraries/MemoryFree/examples/freeMemory/freeMemory.ino @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2016 Intel Corporation. All rights reserved. + * See the bottom of this file for the license terms. + */ + +#include + +void setup () { + Serial.begin(9600); + while(!Serial); +} + +void loop() { + char *p; + + Serial.println("Free memory: " + String(freeMemory())); + Serial.println("Allocating 24 bytes ..."); + + p = (char *)malloc(24); + Serial.println("Free memory: " + String(freeMemory())); + + Serial.println("Freeing 24 bytes ..."); + free(p); + Serial.println("Free memory: " + String(freeMemory())); + + delay(2000); +} + +/* + * Copyright (c) 2017 Intel Corporation. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ diff --git a/libraries/MemoryFree/keywords.txt b/libraries/MemoryFree/keywords.txt new file mode 100644 index 00000000..9da291a1 --- /dev/null +++ b/libraries/MemoryFree/keywords.txt @@ -0,0 +1,11 @@ +####################################### +# Syntax Coloring Map For MemoryFree +####################################### + +####################################### +# Methods and Functions (KEYWORD2) +####################################### + +freeStack KEYWORD2 +freeHeap KEYWORD2 +freeMemory KEYWORD2 diff --git a/libraries/MemoryFree/library.properties b/libraries/MemoryFree/library.properties new file mode 100644 index 00000000..1acd530e --- /dev/null +++ b/libraries/MemoryFree/library.properties @@ -0,0 +1,10 @@ +name=MemoryFree +version=1.0 +author=Erik Nyquist +maintainer=Erik Nyquist +sentence=Determines the amount of available memory in the heap +paragraph=Determines the amount of memory, in bytes, that is available for allocation using malloc() +category=Uncategorized +url= +architectures=arc32 + diff --git a/libraries/MemoryFree/src/MemoryFree.cpp b/libraries/MemoryFree/src/MemoryFree.cpp new file mode 100644 index 00000000..8fbba7ee --- /dev/null +++ b/libraries/MemoryFree/src/MemoryFree.cpp @@ -0,0 +1,58 @@ +/* + * MemoryFree.cpp: taken from http://playground.arduino.cc/Code/AvailableMemory, + * re-written for the Arduino 101 which uses a different malloc implementation. + * + * Arduino 101 malloc source: + * https://github.com/foss-for-synopsys-dwc-arc-processors/glibc + * + * mallinfo() struct details: + * http://man7.org/linux/man-pages/man3/mallinfo.3.html + * + * Copyright (c) 2017 Intel Corporation. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include +#include "MemoryFree.h" + +extern char __start_heap; +extern char __end_heap; +extern char __stack_size; +extern char __stack_start; + +int freeStack() { + int stack_end; + int mark; + + stack_end = ((int)&__stack_start) - ((int)&__stack_size); + return ((int)&mark) - stack_end; +} + +int freeHeap (void) { + int hsize; + struct mallinfo mi; + + mi = mallinfo(); + hsize = (int)&__end_heap - (int)&__start_heap; + return (hsize - mi.arena) + mi.fordblks; +} + +int freeMemory (void) { + int heap = freeHeap(); + int stack = freeStack(); + return (stack < 0) ? heap : stack + heap; +} diff --git a/libraries/MemoryFree/src/MemoryFree.h b/libraries/MemoryFree/src/MemoryFree.h new file mode 100644 index 00000000..bf532bc2 --- /dev/null +++ b/libraries/MemoryFree/src/MemoryFree.h @@ -0,0 +1,48 @@ +/* + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef MEMORYFREE_H +#define MEMORYFREE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* freeHeap: returns the size (in bytes) of unused space on the heap, + * i.e. the number of bytes available for allocation by 'malloc()' */ +int freeHeap(void); + +/* freeStack: returns the size (in bytes) of remaining free space in the stack, + * i.e. the difference between our current position in the stack, and the end + * of usable stack space. + * + * NOTE: This function will return a negative number to indicate a stack + * overflow, i.e. a return value of -20 means you have overrun the allocated + * stack area by 20 bytes. */ +int freeStack(void); + +/* freeMemory: returns the combined free memory in both the stack and heap, + * except in the case where a stack overflow has occurred (i.e. freeStack + * returns a negative number). In this case, only the amount of free heap + * space will be returned. */ +int freeMemory(void); + +#ifdef __cplusplus +} +#endif + +#endif From 001cab44592510cf9ea799d7a6f34d237d5b149c Mon Sep 17 00:00:00 2001 From: Erik Nyquist Date: Wed, 1 Feb 2017 11:36:59 -0800 Subject: [PATCH 08/91] freeMemory.ino: add introductory comment --- libraries/MemoryFree/examples/freeMemory/freeMemory.ino | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libraries/MemoryFree/examples/freeMemory/freeMemory.ino b/libraries/MemoryFree/examples/freeMemory/freeMemory.ino index 724f81ac..15c08d28 100644 --- a/libraries/MemoryFree/examples/freeMemory/freeMemory.ino +++ b/libraries/MemoryFree/examples/freeMemory/freeMemory.ino @@ -1,4 +1,8 @@ /* + * freeMemory.ino: This sketch demonstrates the use of the freeMemory() + * function to measure the amount of free memory available in the system, + * before and after using 'malloc' to allocate some memory. + * * Copyright (c) 2016 Intel Corporation. All rights reserved. * See the bottom of this file for the license terms. */ From 78c3d0ad0a5475f7809d31dfd1c2d75cbcf4a58c Mon Sep 17 00:00:00 2001 From: Erik Nyquist Date: Thu, 2 Feb 2017 13:49:50 -0800 Subject: [PATCH 09/91] EEPROM library: move function definitions into separate .cpp files --- libraries/EEPROM/src/EEPROM.cpp | 125 ++++++++++++++++++++++++++++++++ libraries/EEPROM/src/EEPROM.h | 113 +++-------------------------- 2 files changed, 134 insertions(+), 104 deletions(-) create mode 100644 libraries/EEPROM/src/EEPROM.cpp diff --git a/libraries/EEPROM/src/EEPROM.cpp b/libraries/EEPROM/src/EEPROM.cpp new file mode 100644 index 00000000..8295c064 --- /dev/null +++ b/libraries/EEPROM/src/EEPROM.cpp @@ -0,0 +1,125 @@ +/* + EEPROM.h - EEPROM library + Original Copyright (c) 2006 David A. Mellis. All right reserved. + New version by Christopher Andrews 2015. + Curie porting by Intel and Arduino LLC - 2016 + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include + +EEPROMClass EEPROM; + +void CurieClear() +{ + //erase the 2k bytes of the eeprom section inside the otp area + *(uint32_t*)(ROM_WR_CTRL) = 0x4002; + //wait for erase to be complete + #if 0 + // TODO: wait for FLASH_STTS.ER_DONE to be set to 1 + while(((*(uint32_t*)FLASH_STTS) & 0x01) == 0) { + delay(1); + } + #endif + delay(5); +} + +void CurieRestoreMemory(uint32_t* buffer, uint32_t size) +{ + uint32_t rom_wr_ctrl = 0; + uint32_t address; + + for (uint32_t i=0; i 0x7FF)) + { + return 0; + } + int offset = address%4; + uint32_t value = *(uint32_t*)(EEPROM_ADDR+(address/4)*4); + value = (value >> ((3-offset)*8)) & 0xFF; + return (uint8_t)value; +} + +uint32_t CurieRead32(uint32_t address) +{ + if((address > 0x7FF)) + { + return 0; + } + uint32_t value = *(uint32_t*)(EEPROM_ADDR+(address/4)*4); + return value; +} + +void CurieWrite8(uint32_t address, uint8_t data) +{ + //make sure address is valid + if((address > 0x7FF)) + { + return; + } + + uint8_t currentValue = CurieRead8(address); + //only do something if value is different from what is currently stored + if(currentValue==data) + { + return; + } + + uint32_t currentDword = CurieRead32(address); + + int offset = address%4; + + uint32_t data32 = (currentDword & ~(uint32_t)(0xFF << ((3-offset)*8))); + data32 = data32 | (data << ((3-offset)*8)); + + if (currentValue != 0xFF) { + uint32_t dump[EEPROM_SIZE/4]; + memcpy(dump, (uint32_t *)EEPROM_ADDR, EEPROM_SIZE); + dump[(address >> 2)] = data32; + CurieClear(); + CurieRestoreMemory((uint32_t *)dump, EEPROM_SIZE/sizeof(uint32_t)); + return; + } + + uint32_t rom_wr_ctrl = 0; + + //store data into ROM_WR_DATA register + *(uint32_t*)(ROM_WR_DATA) = data32; + address = ((address >> 2) << 2) + EEPROM_OFFSET; + //shift left 2 bits to store offset into bits 19:2 (WR_ADDR) + rom_wr_ctrl = (address)<<2; + rom_wr_ctrl |= 0x00000001; //set (WR_REQ) bit + *(uint32_t*)(ROM_WR_CTRL) = rom_wr_ctrl; + + delay(3); //give it enough time to finish writing +} diff --git a/libraries/EEPROM/src/EEPROM.h b/libraries/EEPROM/src/EEPROM.h index c52737c7..ac5e05f4 100644 --- a/libraries/EEPROM/src/EEPROM.h +++ b/libraries/EEPROM/src/EEPROM.h @@ -16,8 +16,8 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef EEPROM_h -#define EEPROM_h +#ifndef EEPROM_H +#define EEPROM_H #define ROM_WR_CTRL 0xb0100004 #define ROM_WR_DATA 0xb0100008 @@ -28,112 +28,17 @@ #define EEPROM_SIZE 2048 //EEPROM size in bytes - #include #include "Arduino.h" /* Curie specific implementation of "atomic" read8 and write8 on OTP flash storage */ -void CurieClear() -{ - //erase the 2k bytes of the eeprom section inside the otp area - *(uint32_t*)(ROM_WR_CTRL) = 0x4002; - //wait for erase to be complete - #if 0 - while(((*(uint32_t*)FLASH_STTS) & 0x01) == 0) { // TODO: wait for FLASH_STTS.ER_DONE to be set to 1 - delay(1); - } - #endif - delay(5); -} - -void CurieRestoreMemory(uint32_t* buffer, uint32_t size) -{ - uint32_t rom_wr_ctrl = 0; - uint32_t address; - - for (uint32_t i=0; i 0x7FF)) - { - return 0; - } - int offset = address%4; - uint32_t value = *(uint32_t*)(EEPROM_ADDR+(address/4)*4); - value = (value >> ((3-offset)*8)) & 0xFF; - return (uint8_t)value; -} - -uint32_t CurieRead32(uint32_t address) -{ - if((address > 0x7FF)) - { - return 0; - } - uint32_t value = *(uint32_t*)(EEPROM_ADDR+(address/4)*4); - return value; -} - -void CurieWrite8(uint32_t address, uint8_t data) -{ - //make sure address is valid - if((address > 0x7FF)) - { - return; - } - - uint8_t currentValue = CurieRead8(address); - //only do something if value is different from what is currently stored - if(currentValue==data) - { - return; - } - - uint32_t currentDword = CurieRead32(address); - - int offset = address%4; - - uint32_t data32 = (currentDword & ~(uint32_t)(0xFF << ((3-offset)*8))); - data32 = data32 | (data << ((3-offset)*8)); - - if (currentValue != 0xFF) { - uint32_t dump[EEPROM_SIZE/4]; - memcpy(dump, (uint32_t *)EEPROM_ADDR, EEPROM_SIZE); - dump[(address >> 2)] = data32; - CurieClear(); - CurieRestoreMemory((uint32_t *)dump, EEPROM_SIZE/sizeof(uint32_t)); - return; - } - - uint32_t rom_wr_ctrl = 0; - - //store data into ROM_WR_DATA register - *(uint32_t*)(ROM_WR_DATA) = data32; - address = ((address >> 2) << 2) + EEPROM_OFFSET; - rom_wr_ctrl = (address)<<2; //shift left 2 bits to store offset into bits 19:2 (WR_ADDR) - rom_wr_ctrl |= 0x00000001; //set (WR_REQ) bit - *(uint32_t*)(ROM_WR_CTRL) = rom_wr_ctrl; +void CurieClear(); +void CurieRestoreMemory(uint32_t* buffer, uint32_t size); - delay(3); //give it enough time to finish writing -} +uint8_t CurieRead8(uint32_t address); +uint32_t CurieRead32(uint32_t address); +void CurieWrite8(uint32_t address, uint8_t data); /*** EERef class. @@ -252,5 +157,5 @@ struct EEPROMClass{ } }; -static EEPROMClass EEPROM; -#endif \ No newline at end of file +extern EEPROMClass EEPROM; +#endif From 40b0c43967187137c9bde6bf88f57732a8a30aa4 Mon Sep 17 00:00:00 2001 From: lianggao Date: Mon, 9 Jan 2017 10:50:13 +0800 Subject: [PATCH 10/91] Jira 797, Central can scan with MAC address, git 376 New feature: - Add the capability for a Central to scan for a Peripheral using its MAC address. Code Modifications: - Added the API for MAC address scanning. - For Device Manager, added provision for holding the MAC address of a Peripheral. - For scan discovery handler, added the checking for MAC address comparison, if MAC address scanning is requested. File changes: 1. libraries/CurieBLE/src/BLEDevice.cpp: - Added API for MAC address scanning. 2. libraries/CurieBLE/src/BLEDevice.h: - API definition. 3. libraries/CurieBLE/src/internal/BLEDeviceManager.cpp: - Added provision for storing the MAC address. - Added MAC address comparison in the scan discovery handle if MAC address scanning is selected. 4. libraries/CurieBLE/src/internal/BLEDeviceManager.h: - Prototyping. --- libraries/CurieBLE/src/BLEDevice.cpp | 6 ++++++ libraries/CurieBLE/src/BLEDevice.h | 3 ++- .../CurieBLE/src/internal/BLEDeviceManager.cpp | 14 ++++++++++++++ libraries/CurieBLE/src/internal/BLEDeviceManager.h | 2 ++ 4 files changed, 24 insertions(+), 1 deletion(-) diff --git a/libraries/CurieBLE/src/BLEDevice.cpp b/libraries/CurieBLE/src/BLEDevice.cpp index e59b5462..d96b70c2 100644 --- a/libraries/CurieBLE/src/BLEDevice.cpp +++ b/libraries/CurieBLE/src/BLEDevice.cpp @@ -275,6 +275,12 @@ void BLEDevice::scanForUuid(String uuid, bool withDuplicates) startScan(withDuplicates); } +void BLEDevice::scanForAddress(String macaddr, bool withDuplicates) +{ + BLEDeviceManager::instance()->setAdvertiseCritical(macaddr.c_str()); + startScan(withDuplicates); +} + void BLEDevice::stopScan() { BLEDeviceManager::instance()->stopScanning(); diff --git a/libraries/CurieBLE/src/BLEDevice.h b/libraries/CurieBLE/src/BLEDevice.h index 590d933a..6d3315fe 100644 --- a/libraries/CurieBLE/src/BLEDevice.h +++ b/libraries/CurieBLE/src/BLEDevice.h @@ -420,8 +420,9 @@ class BLEDevice * @note option to filter out duplicate addresses for Arduino. * The current only support fileter duplicate mode. */ - void scanForUuid(String uuid, bool withDuplicates); + void scanForUuid(String uuid, bool withDuplicates); + void scanForAddress(String macaddr, bool withDuplicates = true); /** * @brief Stop scanning for peripherals * diff --git a/libraries/CurieBLE/src/internal/BLEDeviceManager.cpp b/libraries/CurieBLE/src/internal/BLEDeviceManager.cpp index 930e9faf..14f7a4c6 100644 --- a/libraries/CurieBLE/src/internal/BLEDeviceManager.cpp +++ b/libraries/CurieBLE/src/internal/BLEDeviceManager.cpp @@ -77,6 +77,7 @@ BLEDeviceManager::BLEDeviceManager(): memset(_peer_adv_mill, 0, sizeof(_peer_adv_mill)); memset(&_adv_accept_critical, 0, sizeof(_adv_accept_critical)); memset(&_adv_critical_service_uuid, 0, sizeof(_adv_critical_service_uuid)); + memset(&_adv_accept_device, 0, sizeof(_adv_accept_device)); memset(_peer_peripheral, 0, sizeof(_peer_peripheral)); memset(_peer_peripheral_adv_data, 0, sizeof(_peer_peripheral_adv_data)); @@ -562,6 +563,7 @@ bool BLEDeviceManager::stopScanning() void BLEDeviceManager::clearAdvertiseCritical() { memset(&_adv_accept_critical, 0, sizeof(_adv_accept_critical)); + memset(&_adv_accept_device, 0, sizeof(_adv_accept_device)); //memset(&_adv_critical_service_uuid, 0, sizeof(_adv_critical_service_uuid)); } @@ -598,6 +600,11 @@ void BLEDeviceManager::setAdvertiseCritical(BLEService& service) _adv_accept_critical.data = data; } +void BLEDeviceManager::setAdvertiseCritical(const char* macaddress) +{ + BLEUtils::macAddressString2BT(macaddress, _adv_accept_device); +} + bool BLEDeviceManager::hasLocalName(const BLEDevice* device) const { if (BLEUtils::isLocalBLE(*device) == true) @@ -1248,6 +1255,13 @@ void BLEDeviceManager::handleDeviceFound(const bt_addr_le_t *addr, if (type == BT_LE_ADV_IND || type == BT_LE_ADV_DIRECT_IND) { //pr_debug(LOG_MODULE_BLE, "%s-%d", __FUNCTION__, __LINE__); + // Filter address + if (BLEUtils::macAddressValid(_adv_accept_device) == true && + (memcmp(addr->val, _adv_accept_device.val, sizeof (addr->val)) != 0)) + { + return; + } + while (data_len > 1) { uint8_t len = data[0]; diff --git a/libraries/CurieBLE/src/internal/BLEDeviceManager.h b/libraries/CurieBLE/src/internal/BLEDeviceManager.h index 3ad80a41..2e9d93b0 100644 --- a/libraries/CurieBLE/src/internal/BLEDeviceManager.h +++ b/libraries/CurieBLE/src/internal/BLEDeviceManager.h @@ -305,6 +305,7 @@ class BLEDeviceManager void clearAdvertiseCritical(); void setAdvertiseCritical(String name); void setAdvertiseCritical(BLEService& service); + void setAdvertiseCritical(const char* macaddress); bool startScanning(); // start scanning for peripherals bool startScanningWithDuplicates(); // start scanning for peripherals, and report all duplicates bool stopScanning(); // stop scanning for peripherals @@ -378,6 +379,7 @@ class BLEDeviceManager bt_data_t _adv_accept_critical; // The filters for central device String _adv_critical_local_name; bt_uuid_128_t _adv_critical_service_uuid; + bt_addr_le_t _adv_accept_device; bt_addr_le_t _wait_for_connect_peripheral; uint8_t _wait_for_connect_peripheral_adv_data[BLE_MAX_ADV_SIZE]; From 0eac6a00a766e424b87aecbbb734eb76bcb71694 Mon Sep 17 00:00:00 2001 From: lianggao Date: Fri, 13 Jan 2017 22:07:08 +0800 Subject: [PATCH 11/91] Jira 794 Inconsistent writeInt() result with different Peripherals, git 385 Root cause: - As a Central, the write() operation can produce two different commands to a Peripheral depending on the Characteristic. - One command is a simple write without aknowledgement from Peripheral and the other requires a complete handshake for each write operation. - Root cause of the issue was that the function, BLECharacteristicImp::write(), did not check the characteristic property to determine if the caller requires a response. It just treats all calls do not require a response. Feature added: - For write with respond from Peripheral, it is now a blocking call (it also satisfied Arduino's request). Modifications: 1. libraries/CurieBLE/src/internal/BLECallbacks.cpp: - ble_on_write_no_rsp_complete: CB to process Peripheral Response to complete a write operation. 2. libraries/CurieBLE/src/internal/BLECallbacks.h: - Function definition added. 3. libraries/CurieBLE/src/internal/BLECharacteristicImp.cpp: - In function write(), check the characteristic property to determine whether the call requires a response. - Added a flag to signal the waiting on Peripheral Response for a write operation. - Write with response is now a blocking call. 4. BLECharacteristicImp.h: - Prototyping. --- .../CurieBLE/src/internal/BLECallbacks.cpp | 5 +++ .../CurieBLE/src/internal/BLECallbacks.h | 3 ++ .../src/internal/BLECharacteristicImp.cpp | 39 +++++++++++++++---- .../src/internal/BLECharacteristicImp.h | 5 +++ 4 files changed, 45 insertions(+), 7 deletions(-) diff --git a/libraries/CurieBLE/src/internal/BLECallbacks.cpp b/libraries/CurieBLE/src/internal/BLECallbacks.cpp index b6234750..568c54f8 100644 --- a/libraries/CurieBLE/src/internal/BLECallbacks.cpp +++ b/libraries/CurieBLE/src/internal/BLECallbacks.cpp @@ -223,4 +223,9 @@ void ble_central_device_found(const bt_addr_le_t *addr, ad, len); } +void ble_on_write_no_rsp_complete(struct bt_conn *conn, uint8_t err, + const void *data) +{ + BLECharacteristicImp::writeResponseReceived(conn, err, data); +} diff --git a/libraries/CurieBLE/src/internal/BLECallbacks.h b/libraries/CurieBLE/src/internal/BLECallbacks.h index 882c134a..213bd794 100644 --- a/libraries/CurieBLE/src/internal/BLECallbacks.h +++ b/libraries/CurieBLE/src/internal/BLECallbacks.h @@ -74,5 +74,8 @@ uint8_t profile_service_read_rsp_process(bt_conn_t *conn, const void *data, uint16_t length); +void ble_on_write_no_rsp_complete(struct bt_conn *conn, uint8_t err, + const void *data); + #endif diff --git a/libraries/CurieBLE/src/internal/BLECharacteristicImp.cpp b/libraries/CurieBLE/src/internal/BLECharacteristicImp.cpp index a5a60c57..91c46a8a 100644 --- a/libraries/CurieBLE/src/internal/BLECharacteristicImp.cpp +++ b/libraries/CurieBLE/src/internal/BLECharacteristicImp.cpp @@ -27,6 +27,7 @@ bt_uuid_16_t BLECharacteristicImp::_gatt_chrc_uuid = {BT_UUID_TYPE_16, BT_UUID_GATT_CHRC_VAL}; bt_uuid_16_t BLECharacteristicImp::_gatt_ccc_uuid = {BT_UUID_TYPE_16, BT_UUID_GATT_CCC_VAL}; +volatile bool BLECharacteristicImp::_gattc_writing = false; BLECharacteristicImp::BLECharacteristicImp(const bt_uuid_t* uuid, unsigned char properties, @@ -637,13 +638,20 @@ bool BLECharacteristicImp::read() return _reading; } +void BLECharacteristicImp::writeResponseReceived(struct bt_conn *conn, + uint8_t err, + const void *data) +{ + _gattc_writing = false; +} + bool BLECharacteristicImp::write(const unsigned char value[], uint16_t length) { int retval = 0; bt_conn_t* conn = NULL; - if (true == BLEUtils::isLocalBLE(_ble_device)) + if (true == BLEUtils::isLocalBLE(_ble_device) || true == _gattc_writing) { // GATT server can't write return false; @@ -655,12 +663,29 @@ bool BLECharacteristicImp::write(const unsigned char value[], return false; } - // Send read request - retval = bt_gatt_write_without_response(conn, - _value_handle, - value, - length, - false); + // Send write request + if (_gatt_chrc.properties | BT_GATT_CHRC_WRITE_WITHOUT_RESP) + { + retval = bt_gatt_write_without_response(conn, + _value_handle, + value, + length, + false); + } + else if (_gatt_chrc.properties | BT_GATT_CHRC_WRITE) + { + _gattc_writing = true; + retval = bt_gatt_write(conn, + _value_handle, + 0, + value, + length, + ble_on_write_no_rsp_complete); + while (_gattc_writing) + { + delay(2); + } + } bt_conn_unref(conn); return (0 == retval); } diff --git a/libraries/CurieBLE/src/internal/BLECharacteristicImp.h b/libraries/CurieBLE/src/internal/BLECharacteristicImp.h index c6cee5ab..1066992c 100644 --- a/libraries/CurieBLE/src/internal/BLECharacteristicImp.h +++ b/libraries/CurieBLE/src/internal/BLECharacteristicImp.h @@ -168,6 +168,10 @@ class BLECharacteristicImp: public BLEAttribute{ */ bool write(const unsigned char value[], uint16_t length); + + static void writeResponseReceived(struct bt_conn *conn, + uint8_t err, + const void *data); int descriptorCount() const; uint8_t discoverResponseProc(bt_conn_t *conn, @@ -325,6 +329,7 @@ class BLECharacteristicImp: public BLEAttribute{ bool _subscribed; bool _reading; + static volatile bool _gattc_writing; bt_gatt_read_params_t _read_params; // GATT read parameter typedef LinkNode BLEDescriptorLinkNodeHeader; From fe14b8bd2600544330e95ccf22f7f91c114467c0 Mon Sep 17 00:00:00 2001 From: lianggao Date: Mon, 6 Feb 2017 14:13:37 +0800 Subject: [PATCH 12/91] Fix #380 characteristic written returns incorrect value after first connect 1. Not set the flage when local device try to set the value. 2. Changed file libraries/CurieBLE/src/internal/BLECharacteristicImp.cpp --- libraries/CurieBLE/src/internal/BLECharacteristicImp.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/CurieBLE/src/internal/BLECharacteristicImp.cpp b/libraries/CurieBLE/src/internal/BLECharacteristicImp.cpp index 91c46a8a..415aa5ff 100644 --- a/libraries/CurieBLE/src/internal/BLECharacteristicImp.cpp +++ b/libraries/CurieBLE/src/internal/BLECharacteristicImp.cpp @@ -260,6 +260,7 @@ bool BLECharacteristicImp::setValue(const unsigned char value[], uint16_t length) { _setValue(value, length, 0); + _value_updated = true; if (BLEUtils::isLocalBLE(_ble_device) == true) { // GATT server @@ -555,7 +556,6 @@ BLECharacteristicImp::_setValue(const uint8_t value[], uint16_t length, uint16_t } } - _value_updated = true; memcpy(_value + offset, value, length); _value_length = length; } From 547ecd723e39da4044cb636d6bdbb8956cb2f2f2 Mon Sep 17 00:00:00 2001 From: lianggao Date: Fri, 13 Jan 2017 09:04:29 +0800 Subject: [PATCH 13/91] Sketch crash using both Firmata and BLE library, gitHub issue #377 1. The BLEStream object adds profile when boot but the HW doesn't be initialized and makes APP crash. 2. Change the BLE initial process not depend on HW. Buffer the attributes if HW not initialized. 3. Changed files libraries/CurieBLE/src/BLEDevice.h - expose constructor libraries/CurieBLE/src/BLEPeripheral.cpp - not call HW init function libraries/CurieBLE/src/internal/BLEDeviceManager.cpp - change init order libraries/CurieBLE/src/internal/BLEProfileManager.cpp - change constructor --- libraries/CurieBLE/src/BLEDevice.h | 20 +++++----- libraries/CurieBLE/src/BLEPeripheral.cpp | 37 +------------------ .../src/internal/BLEDeviceManager.cpp | 12 ++++-- .../src/internal/BLEProfileManager.cpp | 2 +- 4 files changed, 20 insertions(+), 51 deletions(-) diff --git a/libraries/CurieBLE/src/BLEDevice.h b/libraries/CurieBLE/src/BLEDevice.h index 6d3315fe..56742f1b 100644 --- a/libraries/CurieBLE/src/BLEDevice.h +++ b/libraries/CurieBLE/src/BLEDevice.h @@ -59,6 +59,16 @@ class BLEDevice */ BLEDevice(const BLEDevice* bledevice); BLEDevice(const BLEDevice& bledevice); + /** + * @brief The BLE device constructure + * + * @param[in] bleaddress BLE device address + * + * @return none + * + * @note none + */ + BLEDevice(const bt_addr_le_t* bleaddress); virtual ~BLEDevice(); @@ -654,16 +664,6 @@ class BLEDevice void setAddress(const bt_addr_le_t& addr); void setAdvertiseData(const uint8_t* adv_data, uint8_t len); - /** - * @brief The BLE device constructure - * - * @param[in] bleaddress BLE device address - * - * @return none - * - * @note none - */ - BLEDevice(const bt_addr_le_t* bleaddress); private: void preCheckProfile(); diff --git a/libraries/CurieBLE/src/BLEPeripheral.cpp b/libraries/CurieBLE/src/BLEPeripheral.cpp index 84b85c88..760d374f 100644 --- a/libraries/CurieBLE/src/BLEPeripheral.cpp +++ b/libraries/CurieBLE/src/BLEPeripheral.cpp @@ -55,67 +55,37 @@ BLEPeripheral::~BLEPeripheral(void) void BLEPeripheral::setAdvertisedServiceUuid(const char* advertisedServiceUuid) { - if (!_initCalled) { - init(); - } - BLE.setAdvertisedServiceUuid(advertisedServiceUuid); } + void BLEPeripheral::setLocalName(const char* localName) { - if (!_initCalled) { - init(); - } - BLE.setLocalName(localName); } - void BLEPeripheral::setDeviceName(const char *deviceName) { - if (!_initCalled) { - init(); - } - BLE.setDeviceName(deviceName); } void BLEPeripheral::setAppearance(const unsigned short appearance) { - if (!_initCalled) { - init(); - } - BLE.setAppearance(appearance); } void BLEPeripheral::setConnectionInterval(const unsigned short minConnInterval, const unsigned short maxConnInterval) { - if (!_initCalled) { - init(); - } - BLE.setConnectionInterval(minConnInterval, maxConnInterval); } void BLEPeripheral::addAttribute(BLEService& service) { - if (!_initCalled) - { - init(); - } - BLE.addService(service); _lastService = &service; } void BLEPeripheral::addAttribute(BLECharacteristic& characteristic) { - if (!_initCalled) - { - init(); - } - if (_lastService) { _lastService->addCharacteristic(characteristic); @@ -125,11 +95,6 @@ void BLEPeripheral::addAttribute(BLECharacteristic& characteristic) void BLEPeripheral::addAttribute(BLEDescriptor& descriptor) { - if (!_initCalled) - { - init(); - } - if (_lastCharacteristic) { _lastCharacteristic->addDescriptor(descriptor); diff --git a/libraries/CurieBLE/src/internal/BLEDeviceManager.cpp b/libraries/CurieBLE/src/internal/BLEDeviceManager.cpp index 14f7a4c6..e21c40f5 100644 --- a/libraries/CurieBLE/src/internal/BLEDeviceManager.cpp +++ b/libraries/CurieBLE/src/internal/BLEDeviceManager.cpp @@ -98,11 +98,11 @@ BLEDeviceManager::~BLEDeviceManager() bool BLEDeviceManager::begin(BLEDevice *device) { - if (NULL == _local_ble && false == *device) + if (NULL == _local_ble) { _local_ble = device; - _local_ble->setAddress(_local_bda); bt_le_set_mac_address(_local_bda); + // Set device name setDeviceName(); _state = BLE_PERIPH_STATE_READY; @@ -134,7 +134,8 @@ void BLEDeviceManager::poll() } void BLEDeviceManager::end() -{} +{ +} bool BLEDeviceManager::connected(const BLEDevice *device) const { @@ -288,7 +289,10 @@ void BLEDeviceManager::setDeviceName(const char* deviceName) if (len > BLE_MAX_DEVICE_NAME) len = BLE_MAX_DEVICE_NAME; memcpy(_device_name, deviceName, len); - setDeviceName(); + if (NULL != _local_ble) + { + setDeviceName(); + } } } diff --git a/libraries/CurieBLE/src/internal/BLEProfileManager.cpp b/libraries/CurieBLE/src/internal/BLEProfileManager.cpp index c3b9cd58..df34c996 100644 --- a/libraries/CurieBLE/src/internal/BLEProfileManager.cpp +++ b/libraries/CurieBLE/src/internal/BLEProfileManager.cpp @@ -25,7 +25,7 @@ #include "BLECallbacks.h" #include "BLEUtils.h" -BLEDevice BLE; +BLEDevice BLE(BLEUtils::bleGetLoalAddress()); BLEProfileManager* BLEProfileManager::_instance = NULL; From 0285190f5d94dd2228a33ec5ef91d0e3cecfed56 Mon Sep 17 00:00:00 2001 From: Erik Nyquist Date: Thu, 9 Feb 2017 10:18:37 -0800 Subject: [PATCH 14/91] EEPROM.cpp: Use double quotes for include file works in the Arduino IDE, but it's not actually in a system include location so it makes non-IDE (i.e. Klocwork) builds fail --- libraries/EEPROM/src/EEPROM.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/EEPROM/src/EEPROM.cpp b/libraries/EEPROM/src/EEPROM.cpp index 8295c064..327061fc 100644 --- a/libraries/EEPROM/src/EEPROM.cpp +++ b/libraries/EEPROM/src/EEPROM.cpp @@ -16,7 +16,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#include +#include "EEPROM.h" EEPROMClass EEPROM; From d6c68f26914bf9508e8b76081d383a5cd432c7b6 Mon Sep 17 00:00:00 2001 From: Erik Nyquist Date: Tue, 14 Feb 2017 12:40:25 -0800 Subject: [PATCH 15/91] flash.ld: fix mis-aligned .data section The end of the .data section in flash must be explicitly word-aligned, otherwise corruption can occur in a .data section that happens to contain non-word aligned data. --- variants/arduino_101/linker_scripts/flash.ld | 1 + 1 file changed, 1 insertion(+) diff --git a/variants/arduino_101/linker_scripts/flash.ld b/variants/arduino_101/linker_scripts/flash.ld index 03344a54..335f7ef6 100644 --- a/variants/arduino_101/linker_scripts/flash.ld +++ b/variants/arduino_101/linker_scripts/flash.ld @@ -113,6 +113,7 @@ SECTIONS __data_ram_start = .; *(.data) *(".data.*") + . = ALIGN(4); } > SRAM __data_ram_end = .; From ff32c97b547b42e8afa3e423c7ad9ddf4057b4dd Mon Sep 17 00:00:00 2001 From: lianggao Date: Tue, 20 Dec 2016 18:21:23 +0800 Subject: [PATCH 16/91] BLE Peripheral cannot discover Central attributes 1. Add test sketches discoveratperipheral.ino and profileatcentral.ino 2. Modify BLEDeviceManager.cpp to add central to profile buffer in peripheral role. --- .../BatteryMonitor_Central.ino | 51 ++++++- .../central/CentralDouble/CentralDouble.ino | 126 ++++++++++++++++++ .../central/IMUBleCentral/IMUBleCentral.ino | 61 +++++---- .../central/led_control/led_control.ino | 58 +++++--- .../peripheral_explorer.ino | 53 +++++--- .../CurieBLE/examples/central/scan/scan.ino | 50 ++++--- .../central/scan_callback/scan_callback.ino | 63 ++++++--- .../sensortag_button/sensortag_button.ino | 51 ++++--- .../BatteryMonitor_Notification.ino | 26 ++-- .../IMUBleNotification/IMUBleNotification.ino | 55 +++++--- .../PeripheralDouble/PeripheralDouble.ino | 95 +++++++++++++ .../CurieBLE/examples/peripheral/led/led.ino | 49 ++++--- .../peripheral/led_callback/led_callback.ino | 43 +++--- .../AccelerometerBLE/AccelerometerBLE.ino | 94 ------------- .../Genuino101CurieBLEHeartRateMonitor.ino | 52 +++++--- .../StandardFirmataBLE/StandardFirmataBLE.ino | 56 +++++--- .../StarterKit101_BLE/StarterKit101_BLE.ino | 37 ----- .../examples/test/central/central.ino | 86 ------------ .../discoveratperipheral.ino | 124 +++++++++++++++++ .../test/notification/notification.ino | 78 ----------- .../test/notifycentral/notifycentral.ino | 89 ------------- .../profileatcentral/profileatcentral.ino | 91 +++++++++++++ .../CurieBLE/examples/test/test/test.ino | 71 ---------- .../src/internal/BLEDeviceManager.cpp | 5 +- 24 files changed, 894 insertions(+), 670 deletions(-) create mode 100644 libraries/CurieBLE/examples/central/CentralDouble/CentralDouble.ino create mode 100644 libraries/CurieBLE/examples/peripheral/PeripheralDouble/PeripheralDouble.ino delete mode 100644 libraries/CurieBLE/examples/test/CommunitySketches/AccelerometerBLE/AccelerometerBLE.ino delete mode 100644 libraries/CurieBLE/examples/test/CommunitySketches/StarterKit101_BLE/StarterKit101_BLE.ino delete mode 100644 libraries/CurieBLE/examples/test/central/central.ino create mode 100644 libraries/CurieBLE/examples/test/discoveratperipheral/discoveratperipheral.ino delete mode 100644 libraries/CurieBLE/examples/test/notification/notification.ino delete mode 100644 libraries/CurieBLE/examples/test/notifycentral/notifycentral.ino create mode 100644 libraries/CurieBLE/examples/test/profileatcentral/profileatcentral.ino delete mode 100644 libraries/CurieBLE/examples/test/test/test.ino diff --git a/libraries/CurieBLE/examples/central/BatteryMonitor_Central/BatteryMonitor_Central.ino b/libraries/CurieBLE/examples/central/BatteryMonitor_Central/BatteryMonitor_Central.ino index 89469631..90a39dfb 100644 --- a/libraries/CurieBLE/examples/central/BatteryMonitor_Central/BatteryMonitor_Central.ino +++ b/libraries/CurieBLE/examples/central/BatteryMonitor_Central/BatteryMonitor_Central.ino @@ -1,13 +1,27 @@ -#include +/* + * Copyright (c) 2016 Intel Corporation. All rights reserved. + * See the bottom of this file for the license terms. + */ /* - This sketch example works with BatteryMonitor_Notification.ino + * Sketch: BatteryMonitor_Central.ino + * + * Description: + * This sketch will receive the notifications and output the received + * data in the serial monitor. It also illustrates using a non-typed + * characteristic. + * + * Notes: + * + * - Set the baud rate to 115200 on the serial monitor to accomodate + * the speed of constant data updates + * - Expected Peripheral name: BatteryMonitorSketch + * - Expected Peripheral Characteristic: 2A19 + * - Expected Peripheral sketch: BatteryMonitor_Notification.ino + * + */ - BatteryMonitor_Notification will send notification to this central sketch. - This sketch will receive the notifications and output the received data in the serial monitor. - It also illustrates using a non-typed characteristic. - Set the baud rate to 115200 on the serial monitor to accomodate the speed of constant data updates -*/ +#include #define LED_PIN 13 @@ -123,3 +137,26 @@ void printData(const unsigned char data[], int length) { Serial.print(b); } } + +/* + Copyright (c) 2016 Intel Corporation. All rights reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + + + + + diff --git a/libraries/CurieBLE/examples/central/CentralDouble/CentralDouble.ino b/libraries/CurieBLE/examples/central/CentralDouble/CentralDouble.ino new file mode 100644 index 00000000..45089df4 --- /dev/null +++ b/libraries/CurieBLE/examples/central/CentralDouble/CentralDouble.ino @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2016 Intel Corporation. All rights reserved. + * See the bottom of this file for the license terms. + */ + +/* + * Sketch: CentralDouble.ino. + * + * Description: + * This is a simple BLE sketch that initiates the + * Arduino platform as a Central. It reads a double value from + * a connected Peripheral. The sketch exercises: Scanning for + * a specific Peripheral, connecting to it, discover its Attributes, + * and exercise a specific Characteristic to read a double value + * from the Peripheral. + * + * Notes: + * Expected Peripheral name: DataTest + * Expected Peripheral Characteristic: 19b20001e8f2537e4f6cd104768a1214 + * Expected Characteristic read value: double. + */ + +#include "CurieBLE.h" + + +// LED pin +#define LED_PIN 13 + +void setup() { + Serial.begin(9600); + + // set LED pin to output mode + pinMode(LED_PIN, OUTPUT); + + // begin initialization + BLE.begin(); + Serial.println(BLE.address()); + + BLE.scanForName("DataTest"); +} + +void loop() { + BLEDevice peripheral = BLE.available(); + if (peripheral) + { + Serial.println(peripheral.address()); + BLE.stopScan(); + // central connected to peripheral + controlLogic(peripheral); + BLE.scanForName("DataTest"); + } +} + + +void controlLogic(BLEDevice &peripheral) +{ + // connect to the peripheral + Serial.print("Connecting ... "); + Serial.println(peripheral.address()); + + if (peripheral.connect()) + { + Serial.print("Connected: "); + Serial.println(peripheral.address()); + } + else + { + Serial.println("Failed to connect!"); + return; + } + + if (peripheral.discoverAttributes() == false) + { + Serial.println("Discover failed, Disconnecting..."); + peripheral.disconnect(); + return; + } + + BLECharacteristic doubleCharacteristic = peripheral.characteristic("19b20001e8f2537e4f6cd104768a1214"); + + if (!doubleCharacteristic) + { + peripheral.disconnect(); + Serial.println("Peripheral does not have test double characteristic!"); + delay(5000); + return; + } + doubleCharacteristic.subscribe(); + + while (peripheral.connected()) + { + doubleCharacteristic.read(); + delay(1000); + if (doubleCharacteristic.valueUpdated()) + { + Serial.print("Double characteristic value: "); + Serial.println(doubleCharacteristic.doubleValue()); + } + delay(1000); + } + Serial.print("Disconnected"); + Serial.println(peripheral.address()); +} + + + +/* + Arduino BLE Peripheral Double read/write test example + Copyright (c) 2016 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + + diff --git a/libraries/CurieBLE/examples/central/IMUBleCentral/IMUBleCentral.ino b/libraries/CurieBLE/examples/central/IMUBleCentral/IMUBleCentral.ino index 60748578..739a8b05 100644 --- a/libraries/CurieBLE/examples/central/IMUBleCentral/IMUBleCentral.ino +++ b/libraries/CurieBLE/examples/central/IMUBleCentral/IMUBleCentral.ino @@ -1,30 +1,24 @@ /* - Copyright (c) 2016 Arduino LLC. All right reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ -#include + * Copyright (c) 2016 Intel Corporation. All rights reserved. + * See the bottom of this file for the license terms. + */ /* - This sketch example works with IMUBleNotification.ino + * Sketch: IMUBleCentral.ino + * + * Description: + * This sketch will receive the notifications and output the + * received data in the serial monitor. It also illustrates + * using a non-typed characteristic. + * + * Notes: + * + * - Expected Peripheral name: Imu + * - Expected Peripheral Characteristic: F7580003-153E-D4F6-F26D-43D8D98EEB13 + * - Expected Peripheral sketch: IMUBleNotification.ino + */ - IMUBleNotification.ino will send notification to this central sketch. - This sketch will receive the notifications and output the received data in the serial monitor. - It also illustrates using a non-typed characteristic. - Set the baud rate to 115200 on the serial monitor to accomodate the speed of constant data updates from IMU subsystem. -*/ +#include #define LED_PIN 13 #define MAX_IMU_RECORD 1 @@ -123,3 +117,24 @@ void controlImu(BLEDevice peripheral) Serial.print("Disconnected"); Serial.println(peripheral.address()); } + + +/* + Copyright (c) 2016 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + + diff --git a/libraries/CurieBLE/examples/central/led_control/led_control.ino b/libraries/CurieBLE/examples/central/led_control/led_control.ino index 8983a2ef..fd8ce3c2 100644 --- a/libraries/CurieBLE/examples/central/led_control/led_control.ino +++ b/libraries/CurieBLE/examples/central/led_control/led_control.ino @@ -1,22 +1,24 @@ /* - Arduino BLE Central LED Control example - Copyright (c) 2016 Arduino LLC. All right reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ + * Copyright (c) 2016 Intel Corporation. All rights reserved. + * See the bottom of this file for the license terms. + */ +/* + * Sketch: led_control.ino + * + * Description: + * This is a Central sketch that looks for a particular Sevice with a + * certain Characteristic from a Peripheral. Upon succesful discovery, + * it reads the state of a button and write that value to the + * Peripheral Characteristic. + * + * Notes: + * + * - Expected Peripheral Service: 19b10000-e8f2-537e-4f6c-d104768a1214 + * - Expected Peripheral Characteristic: 19b10001-e8f2-537e-4f6c-d104768a1214 + * - Expected Peripheral sketch: + * + */ #include @@ -125,3 +127,25 @@ void controlLed(BLEDevice peripheral) { } } } + +/* + Arduino BLE Central LED Control example + Copyright (c) 2016 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + + + diff --git a/libraries/CurieBLE/examples/central/peripheral_explorer/peripheral_explorer.ino b/libraries/CurieBLE/examples/central/peripheral_explorer/peripheral_explorer.ino index 5014b7ee..45429655 100644 --- a/libraries/CurieBLE/examples/central/peripheral_explorer/peripheral_explorer.ino +++ b/libraries/CurieBLE/examples/central/peripheral_explorer/peripheral_explorer.ino @@ -1,21 +1,21 @@ /* - Arduino BLE Central peripheral explorer example - Copyright (c) 2016 Arduino LLC. All right reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. + * Copyright (c) 2016 Intel Corporation. All rights reserved. + * See the bottom of this file for the license terms. + */ - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ +/* + * Sketch: peripheral_explorer.ino + * + * Description: + * This is a Central sketch demonstrating the discovery process + * of a Peripheral. The discovered Attributes are being + * display onto the serial output. + * + * Notes: + * + * - Expected Peripheral name: LED + * + */ #include @@ -150,3 +150,24 @@ void printData(const unsigned char data[], int length) { } } + +/* + Arduino BLE Central peripheral explorer example + Copyright (c) 2016 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + + diff --git a/libraries/CurieBLE/examples/central/scan/scan.ino b/libraries/CurieBLE/examples/central/scan/scan.ino index 32c77c97..d191d033 100644 --- a/libraries/CurieBLE/examples/central/scan/scan.ino +++ b/libraries/CurieBLE/examples/central/scan/scan.ino @@ -1,21 +1,19 @@ /* - Arduino BLE Central scan example - Copyright (c) 2016 Arduino LLC. All right reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. + * Copyright (c) 2016 Intel Corporation. All rights reserved. + * See the bottom of this file for the license terms. + */ - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ +/* + * Sketch: scan.ino + * + * Description: + * This is a Central sketch that performs scanning of Peripherals + * only. It does not perform connection. The Advertized info + * of a Peripheral are display. + * + * Notes: + * + */ #include @@ -68,3 +66,23 @@ void loop() { } } + +/* + Arduino BLE Central scan example + Copyright (c) 2016 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + diff --git a/libraries/CurieBLE/examples/central/scan_callback/scan_callback.ino b/libraries/CurieBLE/examples/central/scan_callback/scan_callback.ino index ddb8b14c..fe853cd6 100644 --- a/libraries/CurieBLE/examples/central/scan_callback/scan_callback.ino +++ b/libraries/CurieBLE/examples/central/scan_callback/scan_callback.ino @@ -1,21 +1,30 @@ /* - Arduino BLE Central scan callback example - Copyright (c) 2016 Arduino LLC. All right reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. + * Copyright (c) 2016 Intel Corporation. All rights reserved. + * See the bottom of this file for the license terms. + */ - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ +/* + * Sketch: scan_callback.ino + * + * Description: + * This is a Central Sketch that scan for Peripherals without + * performing connection. It displays the Adv info for each + * Peripheral scanned. Notice that this sketch makes use of + * the Event Handler, a call back routine, to display the + * info onto the serial output. + * + * Notes: + * + * - It is highly recommended not to use the Event Handler to + * dump information to the serial monitor. Please note + * that Event Handler executes in interrupt context and it + * is expected to perform short execution task. It is due + * to the fact that the entire system timing is impact by the + * execution time of the Event Handler. Accessing the serial + * monitor is relatively time consuming, it is highly desirable + * to perform that in the background. + * + */ #include @@ -70,3 +79,25 @@ void bleCentralDiscoverHandler(BLEDevice peripheral) { Serial.println(); } + + + +/* + Arduino BLE Central scan callback example + Copyright (c) 2016 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + diff --git a/libraries/CurieBLE/examples/central/sensortag_button/sensortag_button.ino b/libraries/CurieBLE/examples/central/sensortag_button/sensortag_button.ino index 7f3f1aa2..786ff051 100644 --- a/libraries/CurieBLE/examples/central/sensortag_button/sensortag_button.ino +++ b/libraries/CurieBLE/examples/central/sensortag_button/sensortag_button.ino @@ -1,21 +1,17 @@ /* - Arduino BLE Central SensorTag button example - Copyright (c) 2016 Arduino LLC. All right reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. + * Copyright (c) 2016 Intel Corporation. All rights reserved. + * See the bottom of this file for the license terms. + */ - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ +/* + * Sketch: sensortag_button.ino + * + * Description: + * This Central sketch scan for a Peripheral called the SensorTag. + * It looks for particular Service, discovers all its attributes, + * and them on the serial monitor. + * + */ #include @@ -179,3 +175,26 @@ void monitorSensorTagButtons(BLEDevice peripheral) } } + + + +/* + Arduino BLE Central SensorTag button example + Copyright (c) 2016 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + + diff --git a/libraries/CurieBLE/examples/peripheral/BatteryMonitor_Notification/BatteryMonitor_Notification.ino b/libraries/CurieBLE/examples/peripheral/BatteryMonitor_Notification/BatteryMonitor_Notification.ino index 2325f351..a44cd6b6 100644 --- a/libraries/CurieBLE/examples/peripheral/BatteryMonitor_Notification/BatteryMonitor_Notification.ino +++ b/libraries/CurieBLE/examples/peripheral/BatteryMonitor_Notification/BatteryMonitor_Notification.ino @@ -3,18 +3,24 @@ See the bottom of this file for the license terms. */ -#include - /* - This sketch can work with BatteryMonitor_Central. - - You can also use an android or IOS app that supports notifications. - This sketch example partially implements the standard Bluetooth Low-Energy Battery service - and connection interval paramater update. - For more information: https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx -*/ - + * Sketch: BatteryMonitor_Notification.ino + * + * Description: + * This sketch example partially implements the standard Bluetooth + * Low-Energy Battery service and connection interval paramater update. + * + * For more information: + * https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx + * + * Notes: + * + * - Expected to work with BatteryMonitor_Central sketch. + * You can also use an android or IOS app that supports notifications. + * + */ +#include BLEService batteryService("180F"); // BLE Battery Service diff --git a/libraries/CurieBLE/examples/peripheral/IMUBleNotification/IMUBleNotification.ino b/libraries/CurieBLE/examples/peripheral/IMUBleNotification/IMUBleNotification.ino index c3ac0ff0..e8ad758b 100644 --- a/libraries/CurieBLE/examples/peripheral/IMUBleNotification/IMUBleNotification.ino +++ b/libraries/CurieBLE/examples/peripheral/IMUBleNotification/IMUBleNotification.ino @@ -1,30 +1,24 @@ /* - Copyright (c) 2016 Arduino LLC. All right reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. + * Copyright (c) 2016 Intel Corporation. All rights reserved. + * See the bottom of this file for the license terms. + */ - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. +/* + * Sketch: IMUBleNotification.ino + * + * Description: + * This is a Peripheral sketch that reads IMU data from sensor and sends + * via notifications to a connected Central. + * + * Notes: + * + * - This sketch is inteneded to pair up with IMUBleCentral.ino. + * + */ - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ #include #include -/* - This sketch example works with IMUBleCentral.ino. - - This sketch will read IMU data from sensor and send notifications to IMUBleCentral.ino. - IMUBleCentral.ino will receive the notifications and output the received data. -*/ - #define MAX_IMU_RECORD 1 typedef struct { @@ -125,3 +119,22 @@ void recordImuData(int index) imuBuf[index].slot[2] = (unsigned int)((gy << 16) | (gz & 0x0FFFF)); } + +/* + Copyright (c) 2016 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + diff --git a/libraries/CurieBLE/examples/peripheral/PeripheralDouble/PeripheralDouble.ino b/libraries/CurieBLE/examples/peripheral/PeripheralDouble/PeripheralDouble.ino new file mode 100644 index 00000000..658822e2 --- /dev/null +++ b/libraries/CurieBLE/examples/peripheral/PeripheralDouble/PeripheralDouble.ino @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2016 Intel Corporation. All rights reserved. + * See the bottom of this file for the license terms. + */ + +/* + * Sketch: PeripheralDouble.ino + * + * Description: + * This is a Peripheral sketch that has a Characteristic of double. + * It demonstrates the usage of double in a BLE exchange. + * + * Notes: + * + * - Peripheral Characteristic: 19b20001e8f2537e4f6cd104768a1214 + */ + +#include + +// LED pin +#define LED_PIN 13 + +// create service +BLEService dataService("19b20000e8f2537e4f6cd104768a1214"); + +// create data characteristic +BLEDoubleCharacteristic doubleCharacteristic("19b20001e8f2537e4f6cd104768a1214", BLERead | BLEWrite); + +void setup() { + Serial.begin(9600); + + // set LED pin to output mode + pinMode(LED_PIN, OUTPUT); + + // begin initialization + BLE.begin(); + Serial.println(BLE.address()); + + // set advertised local name and service UUID + BLE.setLocalName("DataTest"); + + dataService.addCharacteristic(doubleCharacteristic); + + // add service and characteristic + BLE.addService(dataService); + + BLE.advertise(); + + Serial.println(F("BLE Test Double Peripheral")); +} + +void loop() { + BLEDevice central = BLE.central(); + double test_value = 0.1; + + if (central) { + // central connected to peripheral + Serial.print(F("Connected to central: ")); + Serial.println(central.address()); + + while (central.connected()) + { + // central still connected to peripheral + doubleCharacteristic.writeDouble(test_value); + test_value += 0.3; + delay(2000); + } + + // central disconnected + Serial.print(F("Disconnected from central: ")); + Serial.println(central.address()); + } +} + + +/* + Arduino BLE Peripheral Double read/write test example + Copyright (c) 2016 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + + diff --git a/libraries/CurieBLE/examples/peripheral/led/led.ino b/libraries/CurieBLE/examples/peripheral/led/led.ino index 55948fd1..4cbb25dd 100644 --- a/libraries/CurieBLE/examples/peripheral/led/led.ino +++ b/libraries/CurieBLE/examples/peripheral/led/led.ino @@ -1,21 +1,16 @@ /* - Arduino BLE Peripheral LED example - Copyright (c) 2016 Arduino LLC. All right reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. + * Copyright (c) 2016 Intel Corporation. All rights reserved. + * See the bottom of this file for the license terms. + */ - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ +/* + * Sketch: led.ino + * + * Description: + * This is a Peripheral sketch that works with a connected Central. + * It allows the Central to write a value and set/reset the led + * accordingly. + */ #include @@ -82,3 +77,25 @@ void loop() { Serial.println(central.address()); } } + + +/* + Arduino BLE Peripheral LED example + Copyright (c) 2016 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + + diff --git a/libraries/CurieBLE/examples/peripheral/led_callback/led_callback.ino b/libraries/CurieBLE/examples/peripheral/led_callback/led_callback.ino index e00bf419..54a5c659 100644 --- a/libraries/CurieBLE/examples/peripheral/led_callback/led_callback.ino +++ b/libraries/CurieBLE/examples/peripheral/led_callback/led_callback.ino @@ -1,21 +1,7 @@ /* - Arduino BLE Peripheral LED callback example - Copyright (c) 2016 Arduino LLC. All right reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ + * Copyright (c) 2016 Intel Corporation. All rights reserved. + * See the bottom of this file for the license terms. + */ // Import libraries #include @@ -88,3 +74,26 @@ void switchCharacteristicWritten(BLEDevice central, BLECharacteristic characteri digitalWrite(LED_PIN, LOW); } } + + + +/* + Arduino BLE Peripheral LED callback example + Copyright (c) 2016 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + + diff --git a/libraries/CurieBLE/examples/test/CommunitySketches/AccelerometerBLE/AccelerometerBLE.ino b/libraries/CurieBLE/examples/test/CommunitySketches/AccelerometerBLE/AccelerometerBLE.ino deleted file mode 100644 index 0e660cb6..00000000 --- a/libraries/CurieBLE/examples/test/CommunitySketches/AccelerometerBLE/AccelerometerBLE.ino +++ /dev/null @@ -1,94 +0,0 @@ -#include -#include "CurieIMU.h" - - -BLEPeripheral blePeripheral; // BLE Peripheral Device (the board you're programming) -BLEService accelService("19B10010-E8F2-537E-4F6C-D104768A1214"); // BLE LED Service - -// BLE accelerometer Characteristic - custom 128-bit UUID, read by central -BLEFloatCharacteristic accelX("19B10011-E8F2-537E-4F6C-D104768A1214", BLERead | BLENotify); -BLEFloatCharacteristic accelY("19B10012-E8F2-537E-4F6C-D104768A1214", BLERead | BLENotify); -BLEFloatCharacteristic accelZ("19B10013-E8F2-537E-4F6C-D104768A1214", BLERead | BLENotify); - -long lastUpdate = 0; - -void setup() { - Serial.begin(9600); - - // set advertised local name and service UUID: - blePeripheral.setLocalName("tigoeAcc"); - blePeripheral.setAdvertisedServiceUuid(accelService.uuid()); - - // add service and characteristic: - blePeripheral.addAttribute(accelService); - blePeripheral.addAttribute(accelX); - blePeripheral.addAttribute(accelY); - blePeripheral.addAttribute(accelZ); - - CurieIMU.begin(); - - // Set the accelerometer range to 2G - CurieIMU.setAccelerometerRange(2); - // set the initial value for the characeristic: - accelX.setValue(0); - accelY.setValue(0); - accelZ.setValue(0); - - // begin advertising BLE service: - blePeripheral.begin(); - pinMode(13, OUTPUT); - Serial.println("Starting"); -} - -void loop() { - // listen for BLE peripherals to connect: - BLECentral central = blePeripheral.central(); - - // if a central is connected to peripheral: - if (central) { - digitalWrite(13, HIGH); - Serial.print("Connected to central: "); - // print the central's MAC address: - Serial.println(central.address()); - - // while the central is still connected to peripheral: - while (central.connected()) { - long now = millis(); - if (now - lastUpdate > 1000) { - updateAccelerometer(); - lastUpdate = now; - } - } - // when the central disconnects, print it out: - Serial.print("Disconnected from central: "); - Serial.println(central.address()); - digitalWrite(13, LOW); - - } -} - -void updateAccelerometer() { - int axRaw, ayRaw, azRaw; // raw accelerometer values - float ax, ay, az; - - // read raw accelerometer measurements from device - CurieIMU.readAccelerometer(axRaw, ayRaw, azRaw); - - // convert the raw accelerometer data to G's - ax = convertRawAcceleration(axRaw); - ay = convertRawAcceleration(ayRaw); - az = convertRawAcceleration(azRaw); - - accelX.setValue(ax); - accelY.setValue(ay); - accelZ.setValue(az); -} - -float convertRawAcceleration(int aRaw) { - // since we are using 2G range - // -2g maps to a raw value of -32768 - // +2g maps to a raw value of 32767 - - float a = (aRaw * 2.0) / 32768.0; - return a; -} diff --git a/libraries/CurieBLE/examples/test/CommunitySketches/Genuino101CurieBLEHeartRateMonitor/Genuino101CurieBLEHeartRateMonitor.ino b/libraries/CurieBLE/examples/test/CommunitySketches/Genuino101CurieBLEHeartRateMonitor/Genuino101CurieBLEHeartRateMonitor.ino index b7062f34..5428572f 100644 --- a/libraries/CurieBLE/examples/test/CommunitySketches/Genuino101CurieBLEHeartRateMonitor/Genuino101CurieBLEHeartRateMonitor.ino +++ b/libraries/CurieBLE/examples/test/CommunitySketches/Genuino101CurieBLEHeartRateMonitor/Genuino101CurieBLEHeartRateMonitor.ino @@ -1,25 +1,17 @@ /* - Copyright (c) 2015 Intel Corporation. All rights reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ + * Copyright (c) 2016 Intel Corporation. All rights reserved. + * See the bottom of this file for the license terms. + */ /* - This sketch example partially implements the standard Bluetooth Low-Energy Heart Rate service. - For more information: https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx -*/ + * Sketch: Genuino101CurieBLEHeartRateMonitor.ino. + * + * Description: + * This sketch example partially implements the standard Bluetooth Low-Energy + * Heart Rate service. For more information: + * https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx + * + */ #include @@ -97,4 +89,24 @@ void updateHeartRate() { heartRateChar.setValue(heartRateCharArray, 2); // and update the heart rate measurement characteristic oldHeartRate = heartRate; // save the level for next comparison } -} +} + +/* + Copyright (c) 2015 Intel Corporation. All rights reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + + diff --git a/libraries/CurieBLE/examples/test/CommunitySketches/StandardFirmataBLE/StandardFirmataBLE.ino b/libraries/CurieBLE/examples/test/CommunitySketches/StandardFirmataBLE/StandardFirmataBLE.ino index cf1e3a74..398993f9 100644 --- a/libraries/CurieBLE/examples/test/CommunitySketches/StandardFirmataBLE/StandardFirmataBLE.ino +++ b/libraries/CurieBLE/examples/test/CommunitySketches/StandardFirmataBLE/StandardFirmataBLE.ino @@ -1,21 +1,20 @@ /* - Firmata is a generic protocol for communicating with microcontrollers - from software on a host computer. It is intended to work with - any host computer software package. - To download a host software package, please click on the following link - to open the list of Firmata client libraries in your default browser. - https://github.com/firmata/arduino#firmata-client-libraries - Copyright (C) 2006-2008 Hans-Christoph Steiner. All rights reserved. - Copyright (C) 2010-2011 Paul Stoffregen. All rights reserved. - Copyright (C) 2009 Shigeru Kobayashi. All rights reserved. - Copyright (C) 2009-2016 Jeff Hoefs. All rights reserved. - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - See file LICENSE.txt for further informations on licensing terms. - Last updated October 16th, 2016 -*/ + * Copyright (c) 2016 Intel Corporation. All rights reserved. + * See the bottom of this file for the license terms. + */ + +/* + * Sketch: StandardFirmataBLE.ino. + * + * Description: + * Firmata is a generic protocol for communicating with microcontrollers + * from software on a host computer. It is intended to work with + * any host computer software package. + * + * Notes: + * - Please use the link stated at the end of this file to + * download a host s/w package. + */ #include #include @@ -830,4 +829,25 @@ void loop() #ifdef FIRMATA_SERIAL_FEATURE serialFeature.update(); #endif -} +} + +/* + Firmata is a generic protocol for communicating with microcontrollers + from software on a host computer. It is intended to work with + any host computer software package. + To download a host software package, please click on the following link + to open the list of Firmata client libraries in your default browser. + https://github.com/firmata/arduino#firmata-client-libraries + Copyright (C) 2006-2008 Hans-Christoph Steiner. All rights reserved. + Copyright (C) 2010-2011 Paul Stoffregen. All rights reserved. + Copyright (C) 2009 Shigeru Kobayashi. All rights reserved. + Copyright (C) 2009-2016 Jeff Hoefs. All rights reserved. + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + See file LICENSE.txt for further informations on licensing terms. + Last updated October 16th, 2016 +*/ + + diff --git a/libraries/CurieBLE/examples/test/CommunitySketches/StarterKit101_BLE/StarterKit101_BLE.ino b/libraries/CurieBLE/examples/test/CommunitySketches/StarterKit101_BLE/StarterKit101_BLE.ino deleted file mode 100644 index 641af931..00000000 --- a/libraries/CurieBLE/examples/test/CommunitySketches/StarterKit101_BLE/StarterKit101_BLE.ino +++ /dev/null @@ -1,37 +0,0 @@ -#include -// change the next line based on what your smartphone is configured to advertise -const String deviceName = "Nexus 5X"; -const int rssiTrigger = -50; -const int ledPin = 13; - -void setup() { - Serial.begin(9600); - BLE.begin(); - pinMode(ledPin, OUTPUT); - BLE.setEventHandler(BLEDiscovered, bleCentralDiscoverHandler); - while (!Serial) ; - Serial.println("Bluetooth device active, start scanning..."); - BLE.scan(true); -} - -void loop() { - BLE.poll(); -} - -void bleCentralDiscoverHandler(BLEDevice peripheral) { - if (peripheral.hasLocalName()) { - Serial.println(peripheral.localName()); - if (peripheral.localName().indexOf(deviceName) != -1) { - Serial.println(" found"); - Serial.print("Rssi: "); - Serial.println(peripheral.rssi()); - if (peripheral.rssi() > rssiTrigger) { - Serial.println("LED ON"); - digitalWrite(ledPin, HIGH); - } else { - Serial.println("LED OFF"); - digitalWrite(ledPin, LOW); - } - } - } -} diff --git a/libraries/CurieBLE/examples/test/central/central.ino b/libraries/CurieBLE/examples/test/central/central.ino deleted file mode 100644 index 5bc13524..00000000 --- a/libraries/CurieBLE/examples/test/central/central.ino +++ /dev/null @@ -1,86 +0,0 @@ - -#include "CurieBLE.h" - -// LED pin -#define LED_PIN 13 - -void setup() { - Serial.begin(9600); - Serial.println("test---"); - - // set LED pin to output mode - pinMode(LED_PIN, OUTPUT); - - // begin initialization - BLE.begin(); - Serial.println(BLE.address()); - - BLE.scanForName("LED"); -} - -void controlLed(BLEDevice &peripheral) -{ - static bool discovered = false; - // connect to the peripheral - Serial.print("Connecting ... "); - Serial.println(peripheral.address()); - - if (peripheral.connect()) - { - Serial.print("Connected: "); - Serial.println(peripheral.address()); - } - else - { - Serial.println("Failed to connect!"); - return; - } - - peripheral.discoverAttributes(); - - BLECharacteristic ledCharacteristic = peripheral.characteristic("19b10101-e8f2-537e-4f6c-d104768a1214"); - - if (!ledCharacteristic) - { - peripheral.disconnect(); - Serial.println("Peripheral does not have LED characteristic!"); - delay(5000); - return; - } - - - unsigned char ledstate = 0; - - discovered = false; - while (peripheral.connected()) - { - if (ledstate == 1) - { - ledstate = 0; - } - else - { - ledstate = 1; - } - ledCharacteristic.write(&ledstate, sizeof(ledstate)); - delay(5000); - } - Serial.print("Disconnected"); - Serial.println(peripheral.address()); -} - -void loop() { - BLEDevice peripheral = BLE.available(); - if (peripheral) - { - Serial.println(peripheral.address()); - BLE.stopScan(); - delay (1000); - // central connected to peripheral - controlLed(peripheral); - delay (4000); - BLE.scanForName("LED"); - } -} - - diff --git a/libraries/CurieBLE/examples/test/discoveratperipheral/discoveratperipheral.ino b/libraries/CurieBLE/examples/test/discoveratperipheral/discoveratperipheral.ino new file mode 100644 index 00000000..8de71767 --- /dev/null +++ b/libraries/CurieBLE/examples/test/discoveratperipheral/discoveratperipheral.ino @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2016 Intel Corporation. All rights reserved. + * See the bottom of this file for the license terms. + */ + +/* + * Sketch: discoveratperipheral.ino. + * + * Description: + * This is a BLE Central sketch that looks for a particular + * Characteristic in a connected Peripheral to write to. The + * Peripheral with the special Characteristic will blink its + * LED. + * + * Notes: + * - This sketch is Arduino BLE Peripheral LED example. + * Please see licensing at the bottom of this file. + * - Expected Peripheral Characteristic: 19b10000e8f2537e4f6cd104768a1214 + */ + +#include + +// LED pin +#define LED_PIN 13 + +// create service +BLEService ledService("19b10000e8f2537e4f6cd104768a1214"); + +void setup() { + Serial.begin(9600); + + // set LED pin to output mode + pinMode(LED_PIN, OUTPUT); + + // begin initialization + BLE.begin(); + Serial.println(BLE.address()); + + // set advertised local name and service UUID + BLE.setLocalName("LED"); + + BLE.advertise(); + + Serial.println(F("BLE LED Peripheral")); +} + +void loop() { + BLEDevice central = BLE.central(); + + if (central) { + // central connected to peripheral + Serial.print(F("Connected to central: ")); + Serial.println(central.address()); + + controlLed(central); + // central disconnected + Serial.print(F("Disconnected from central: ")); + Serial.println(central.address()); + } +} + +void controlLed(BLEDevice ¢ral) +{ + if (central.discoverAttributes() == false) + { + Serial.println("Discover failed, Disconnecting..."); + central.disconnect(); + return; + } + + BLECharacteristic ledCharacteristic = central.characteristic("19b10101-e8f2-537e-4f6c-d104768a1214"); + + if (!ledCharacteristic) + { + central.disconnect(); + //while(1) + { + Serial.println("Central does not have LED characteristic!"); + delay(5000); + } + return; + } + + ledCharacteristic.subscribe(); + + unsigned char ledstate = 0; + + while (central.connected()) + { + if (ledstate == 1) + { + ledstate = 0; + } + else + { + ledstate = 1; + } + ledCharacteristic.write(&ledstate, sizeof(ledstate)); + delay(5000); + } + Serial.print("Disconnected"); + Serial.println(central.address()); +} + + +/* + Arduino BLE Peripheral LED example + Copyright (c) 2016 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + diff --git a/libraries/CurieBLE/examples/test/notification/notification.ino b/libraries/CurieBLE/examples/test/notification/notification.ino deleted file mode 100644 index 542102bb..00000000 --- a/libraries/CurieBLE/examples/test/notification/notification.ino +++ /dev/null @@ -1,78 +0,0 @@ - -#include "CurieBLE.h" - -// LED pin -#define LED_PIN 13 - -// create service -BLEService ledService("19b10100e8f2537e4f6cd104768a1214"); - -BLECharacteristic switchCharacteristic("19b10101e8f2537e4f6cd104768a1214", BLERead | BLEWrite | BLENotify, 1); - -BLEDescriptor switchDescriptor("2901", "switch"); - -void setup() { - Serial.begin(9600); - Serial.println("test---"); - - // set LED pin to output mode - pinMode(LED_PIN, OUTPUT); - - // begin initialization - BLE.begin(); - Serial.println(BLE.address()); - - // set advertised local name and service UUID - BLE.setLocalName("LED"); - BLE.setAdvertisedServiceUuid(ledService.uuid()); - - // add service and characteristic - BLE.addService(ledService); - ledService.addCharacteristic(switchCharacteristic); - switchCharacteristic.addDescriptor(switchDescriptor); - unsigned char test = 1; - switchCharacteristic.writeValue(&test,1); - BLE.advertise(); -} - -void loop() { - static int i = 0; - BLEDevice central = BLE.central(); - bool temp = central; -i++; - if (temp) { - // central connected to peripheral - Serial.print(i); - Serial.print(F("Connected to central: ")); - Serial.println(central.address()); - - Serial.print(temp); - - unsigned char ledstate = 0; - - while (central.connected()) { - // central still connected to peripheral - if (switchCharacteristic.canNotify()) - { - - if (ledstate == 1) - { - ledstate = 0; - digitalWrite(LED_PIN, LOW); - } - else - { - ledstate = 1; - digitalWrite(LED_PIN, HIGH); - } - switchCharacteristic.writeValue(&ledstate, sizeof(ledstate)); - delay(5000); - } - } - - // central disconnected - Serial.print(F("Disconnected from central: ")); - Serial.println(central.address()); - } - //delay (1000); -} diff --git a/libraries/CurieBLE/examples/test/notifycentral/notifycentral.ino b/libraries/CurieBLE/examples/test/notifycentral/notifycentral.ino deleted file mode 100644 index 47086b18..00000000 --- a/libraries/CurieBLE/examples/test/notifycentral/notifycentral.ino +++ /dev/null @@ -1,89 +0,0 @@ - -#include "CurieBLE.h" - -// LED pin -#define LED_PIN 13 - -void setup() { - Serial.begin(9600); - Serial.println("test---"); - - // set LED pin to output mode - pinMode(LED_PIN, OUTPUT); - - // begin initialization - BLE.begin(); - Serial.println(BLE.address()); - - BLE.scanForName("LED"); -} - -void controlLed(BLEDevice &peripheral) -{ - static bool discovered = false; - // connect to the peripheral - Serial.print("Connecting ... "); - Serial.println(peripheral.address()); - - if (peripheral.connect()) - { - Serial.print("Connected: "); - Serial.println(peripheral.address()); - } - else - { - Serial.println("Failed to connect!"); - return; - } - - peripheral.discoverAttributes(); - - BLECharacteristic ledCharacteristic = peripheral.characteristic("19b10101-e8f2-537e-4f6c-d104768a1214"); - - if (!ledCharacteristic) - { - peripheral.disconnect(); - Serial.println("Peripheral does not have LED characteristic!"); - delay(5000); - return; - } - ledCharacteristic.subscribe(); - - - discovered = false; - while (peripheral.connected()) - { - if (ledCharacteristic.valueUpdated()) - { - char ledValue = *ledCharacteristic.value(); - - if (ledValue) { - Serial.println(F("LED on")); - digitalWrite(LED_PIN, HIGH); - } else { - Serial.println(F("LED off")); - digitalWrite(LED_PIN, LOW); - } - } - } - Serial.print("Disconnected"); - Serial.println(peripheral.address()); -} - -void loop() { - //pr_debug(LOG_MODULE_BLE, "%s-%d",__FUNCTION__, __LINE__); - BLEDevice peripheral = BLE.available(); - //pr_debug(LOG_MODULE_BLE, "%s-%d",__FUNCTION__, __LINE__); - if (peripheral) - { - Serial.println(peripheral.address()); - BLE.stopScan(); - delay (1000); - // central connected to peripheral - controlLed(peripheral); - delay (4000); - BLE.scanForName("LED"); - } -} - - diff --git a/libraries/CurieBLE/examples/test/profileatcentral/profileatcentral.ino b/libraries/CurieBLE/examples/test/profileatcentral/profileatcentral.ino new file mode 100644 index 00000000..2fe20520 --- /dev/null +++ b/libraries/CurieBLE/examples/test/profileatcentral/profileatcentral.ino @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2017 Intel Corporation. All rights reserved. + * See the bottom of this file for the license terms. + */ + +/* + * Sketch: profileatcentral.ino + * + * Description: + * This is a BLE Central sketch that demostrates the setting of the + * BLE descriptor. + * + * Notes: + * - This sketch is based on the Arduino BLE Peripheral LED example. + * Please refer to licensing agreement at the bottom of this file. + */ + +#include "CurieBLE.h" +#include +// LED pin +#define LED_PIN 13 +BLEService ledService("19b10100e8f2537e4f6cd104768a1214"); + +BLECharacteristic switchCharacteristic("19b10101e8f2537e4f6cd104768a1214", BLERead | BLEWrite | BLENotify, 1); + +BLEDescriptor switchDescriptor("2901", "switch"); + +void setup() { + Serial.begin(115200); + + // set LED pin to output mode + pinMode(LED_PIN, OUTPUT); + + // begin initialization + BLE.begin(); + Serial.println(BLE.address()); + ledService.addCharacteristic(switchCharacteristic); + switchCharacteristic.addDescriptor(switchDescriptor); + BLE.addService(ledService); + + BLE.scanForName("LED"); +} + + +void loop() { + BLEDevice peripheral = BLE.available(); + if (peripheral) + { + Serial.println(peripheral.address()); + + BLE.stopScan(); + + if (peripheral.connect()) + { + Serial.print("Connected: "); + Serial.println(peripheral.address()); + while (peripheral.connected()) + { + delay (1000); + } + } + else + { + Serial.println("Failed to connect!"); + } + delay (4000); + BLE.scanForName("LED"); + } +} + + +/* + Arduino BLE Peripheral LED example + Copyright (c) 2016 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + + diff --git a/libraries/CurieBLE/examples/test/test/test.ino b/libraries/CurieBLE/examples/test/test/test.ino deleted file mode 100644 index bd4da60c..00000000 --- a/libraries/CurieBLE/examples/test/test/test.ino +++ /dev/null @@ -1,71 +0,0 @@ - -#include "CurieBLE.h" - -// LED pin -#define LED_PIN 13 - -// create service -BLEService ledService("19b10100e8f2537e4f6cd104768a1214"); - -BLECharacteristic switchCharacteristic("19b10101e8f2537e4f6cd104768a1214", BLERead | BLEWrite | BLENotify, 1); - -BLEDescriptor switchDescriptor("2901", "switch"); - -void setup() { - Serial.begin(9600); - Serial.println("test---"); - - // set LED pin to output mode - pinMode(LED_PIN, OUTPUT); - - // begin initialization - BLE.begin(); - Serial.println(BLE.address()); - - // set advertised local name and service UUID - BLE.setLocalName("LED"); - BLE.setAdvertisedServiceUuid(ledService.uuid()); - - // add service and characteristic - BLE.addService(ledService); - ledService.addCharacteristic(switchCharacteristic); - switchCharacteristic.addDescriptor(switchDescriptor); - unsigned char test = 1; - switchCharacteristic.writeValue(&test,1); - BLE.advertise(); -} - -void loop() { - static int i = 0; - BLEDevice central = BLE.central(); - bool temp = central; -i++; - if (temp) { - // central connected to peripheral - Serial.print(i); - Serial.print(F("Connected to central: ")); - Serial.println(central.address()); - - Serial.print(temp); - - while (central.connected()) { - // central still connected to peripheral - if (switchCharacteristic.written()) { - char ledValue = *switchCharacteristic.value(); - // central wrote new value to characteristic, update LED - if (ledValue) { - Serial.println(F("LED on")); - digitalWrite(LED_PIN, HIGH); - } else { - Serial.println(F("LED off")); - digitalWrite(LED_PIN, LOW); - } - } - } - - // central disconnected - Serial.print(F("Disconnected from central: ")); - Serial.println(central.address()); - } - //delay (1000); -} diff --git a/libraries/CurieBLE/src/internal/BLEDeviceManager.cpp b/libraries/CurieBLE/src/internal/BLEDeviceManager.cpp index e21c40f5..5162f593 100644 --- a/libraries/CurieBLE/src/internal/BLEDeviceManager.cpp +++ b/libraries/CurieBLE/src/internal/BLEDeviceManager.cpp @@ -1062,11 +1062,12 @@ void BLEDeviceManager::handleConnectEvent(bt_conn_t *conn, uint8_t err) } else { + // Peripheral has established the connection with this Central device memset(&_wait_for_connect_peripheral, 0, sizeof(_wait_for_connect_peripheral)); _connecting = false; - // Peripheral has established the connection with this Central device - BLEProfileManager::instance()->handleConnectedEvent(bt_conn_get_dst(conn)); } + // The peripheral and central can work as GATT server. Reserve one buffer for peer device + BLEProfileManager::instance()->handleConnectedEvent(bt_conn_get_dst(conn)); if (NULL != _device_events[BLEConnected]) { From f61091473e5888337098a103daccf321e3fe328c Mon Sep 17 00:00:00 2001 From: lianggao Date: Wed, 8 Feb 2017 10:59:09 +0800 Subject: [PATCH 17/91] Jira 804 BLE Characteristic initialization issue, git 366 Issue: - Created Characteristic failed to reflect the initialized value. Root cause: - During initialization, the length field was incorrectly skipped over. --- libraries/CurieBLE/src/internal/BLECharacteristicImp.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/CurieBLE/src/internal/BLECharacteristicImp.cpp b/libraries/CurieBLE/src/internal/BLECharacteristicImp.cpp index 415aa5ff..23e55f20 100644 --- a/libraries/CurieBLE/src/internal/BLECharacteristicImp.cpp +++ b/libraries/CurieBLE/src/internal/BLECharacteristicImp.cpp @@ -171,6 +171,7 @@ BLECharacteristicImp::BLECharacteristicImp(BLECharacteristic& characteristic, if (NULL != characteristic._value) { memcpy(_value, characteristic._value, _value_size); + _value_length = _value_size; } // Update BLE device object From fb578000afad9bc5cdf74358e8c3acbc7a04f9e8 Mon Sep 17 00:00:00 2001 From: Sidney Leung Date: Wed, 15 Feb 2017 22:28:08 -0800 Subject: [PATCH 18/91] Jira 792, Support addition UUID types, git PR 386. Features added: 1. Add the support for two addition UUID types, UUID16_SOME and UUID128_SOME. These types, practically, behaves the same as their related ALL types. Sandeep found that the Apple devices made use of these additional types and requested for their support. File mods: 1. BLEDeviceManager.cpp: - Add UUID16_SOME and UUID128_SOME at places checking for UUID types. --- .../src/internal/BLEDeviceManager.cpp | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/libraries/CurieBLE/src/internal/BLEDeviceManager.cpp b/libraries/CurieBLE/src/internal/BLEDeviceManager.cpp index 5162f593..b3e74278 100644 --- a/libraries/CurieBLE/src/internal/BLEDeviceManager.cpp +++ b/libraries/CurieBLE/src/internal/BLEDeviceManager.cpp @@ -742,8 +742,13 @@ int BLEDeviceManager::advertisedServiceUuidCount(const BLEDevice* device) const return service_cnt; } + /* Sid, 2/15/2017. Sandeep reported that Apple devices may use + BT_DATA_UUID16_SOME and BT_DATA_UUID128_SOME in addition to ALL. + Practically, these types are same as ALL. */ if (type == BT_DATA_UUID16_ALL || - type == BT_DATA_UUID128_ALL) + type == BT_DATA_UUID128_ALL || + type == BT_DATA_UUID16_SOME || + type == BT_DATA_UUID128_SOME) { service_cnt++; } @@ -791,7 +796,10 @@ String BLEDeviceManager::localName(const BLEDevice* device) const return temp; } - if (type == BT_DATA_NAME_COMPLETE) + /* Sid, 2/15/2017. Support both forms of data name. + */ + if (type == BT_DATA_NAME_COMPLETE || + type == BT_DATA_NAME_SHORTENED) { if (len >= BLE_MAX_ADV_SIZE) { @@ -862,14 +870,17 @@ String BLEDeviceManager::advertisedServiceUuid(const BLEDevice* device, int inde } if (type == BT_DATA_UUID16_ALL || - type == BT_DATA_UUID128_ALL) + type == BT_DATA_UUID128_ALL || + type == BT_DATA_UUID16_SOME || + type == BT_DATA_UUID128_SOME) { service_cnt++; } if (index < service_cnt) { - if (type == BT_DATA_UUID16_ALL) + if (type == BT_DATA_UUID16_ALL || + type == BT_DATA_UUID16_SOME) { service_uuid.uuid.type = BT_UUID_TYPE_16; memcpy(&BT_UUID_16(&service_uuid.uuid)->val, &adv_data[2], 2); From ee08a03b21d5c141020b328974c2392a8484dfa9 Mon Sep 17 00:00:00 2001 From: Erik Nyquist Date: Fri, 27 Jan 2017 16:28:38 -0800 Subject: [PATCH 19/91] Use single dataReady() method, instead of accelDataReady/gyroDataReady This method is a bit more flexible. There is a version with no parameters, which will return true if all enabled sensors have new data. There is one overload, that takes a single 'flags' parameter, which returns true if all enabled *and* selected sensors have new data. Sensors are selectable through bit flags. For example; CurieIMU.dataReady() : this will return true if both the accel and gyro are enabled, and both have new data ready. CurieIMU.dataReady(ACCEL | GYRO) : this will return true if both the accel and gyro are enabled, and both have new data ready. CurieIMU.dataReady(GYRO) : this will return true if the gyro is enabled and has new data ready. CurieIMU.dataReady(ACCEL) : this will return true if the accel is enabled and has new data ready. This also involved changing the 'begin' method to allow selective enabling of sensors, e.g. CurieIMU.begin() : same as it always has, initializes IMU, enabling both accel and gyro CurieIMU.begin(ACCEL | GYRO) : initializes IMU, enabling both accel and gyro CurieIMU.begin(ACCEL) : initializes IMU, enabling accel only --- libraries/CurieIMU/keywords.txt | 4 ++ libraries/CurieIMU/src/BMI160.cpp | 78 ++++++++++++++++----------- libraries/CurieIMU/src/BMI160.h | 20 +++++-- libraries/CurieIMU/src/CurieIMU.cpp | 83 +++++++++++++++++++++++------ libraries/CurieIMU/src/CurieIMU.h | 8 +-- 5 files changed, 138 insertions(+), 55 deletions(-) diff --git a/libraries/CurieIMU/keywords.txt b/libraries/CurieIMU/keywords.txt index 1c64688b..05b1cb2b 100644 --- a/libraries/CurieIMU/keywords.txt +++ b/libraries/CurieIMU/keywords.txt @@ -14,6 +14,7 @@ CurieIMUClass KEYWORD1 begin KEYWORD1 +dataReady KEYWORD1 getGyroRate KEYWORD1 setGyroRate KEYWORD1 getAccelerometerRate KEYWORD1 @@ -84,6 +85,9 @@ CurieIMU KEYWORD2 # Constants (LITERAL1) ####################################### +ACCEL LITERAL1 +GYRO LITERAL1 + X_AXIS LITERAL1 Y_AXIS LITERAL1 Z_AXIS LITERAL1 diff --git a/libraries/CurieIMU/src/BMI160.cpp b/libraries/CurieIMU/src/BMI160.cpp index d1bf2a22..c8945b38 100644 --- a/libraries/CurieIMU/src/BMI160.cpp +++ b/libraries/CurieIMU/src/BMI160.cpp @@ -78,6 +78,11 @@ uint8_t BMI160Class::reg_read_bits(uint8_t reg, unsigned pos, unsigned len) return b; } +int BMI160Class::isBitSet(uint8_t value, unsigned bit) +{ + return value & (1 << bit); +} + /******************************************************************************/ /** Power on and prepare for general usage. @@ -85,8 +90,10 @@ uint8_t BMI160Class::reg_read_bits(uint8_t reg, unsigned pos, unsigned len) * after start-up). This function also sets both the accelerometer and the gyroscope * to default range settings, namely +/- 2g and +/- 250 degrees/sec. */ -void BMI160Class::initialize() +void BMI160Class::initialize(unsigned int flags) { + sensors_enabled = 0; + /* Issue a soft-reset to bring the device into a clean state */ reg_write(BMI160_RA_CMD, BMI160_CMD_SOFT_RESET); delay(1); @@ -95,26 +102,36 @@ void BMI160Class::initialize() reg_read(0x7F); delay(1); - /* Power up the accelerometer */ - reg_write(BMI160_RA_CMD, BMI160_CMD_ACC_MODE_NORMAL); - delay(1); - /* Wait for power-up to complete */ - while (0x1 != reg_read_bits(BMI160_RA_PMU_STATUS, + if (flags & ACCEL) { + /* Power up the accelerometer */ + reg_write(BMI160_RA_CMD, BMI160_CMD_ACC_MODE_NORMAL); + delay(1); + + /* Wait for power-up to complete */ + while (0x1 != reg_read_bits(BMI160_RA_PMU_STATUS, BMI160_ACC_PMU_STATUS_BIT, BMI160_ACC_PMU_STATUS_LEN)) + delay(1); + + sensors_enabled |= ACCEL; + } + + if (flags & GYRO) { + /* Power up the gyroscope */ + reg_write(BMI160_RA_CMD, BMI160_CMD_GYR_MODE_NORMAL); delay(1); - /* Power up the gyroscope */ - reg_write(BMI160_RA_CMD, BMI160_CMD_GYR_MODE_NORMAL); - delay(1); - /* Wait for power-up to complete */ - while (0x1 != reg_read_bits(BMI160_RA_PMU_STATUS, + /* Wait for power-up to complete */ + while (0x1 != reg_read_bits(BMI160_RA_PMU_STATUS, BMI160_GYR_PMU_STATUS_BIT, BMI160_GYR_PMU_STATUS_LEN)) - delay(1); + delay(1); + + sensors_enabled |= GYRO; + } - setFullScaleGyroRange(BMI160_GYRO_RANGE_250); - setFullScaleAccelRange(BMI160_ACCEL_RANGE_2G); + setFullScaleGyroRange(BMI160_GYRO_RANGE_250, 250.0f); + setFullScaleAccelRange(BMI160_ACCEL_RANGE_2G, 2.0f); /* Only PIN1 interrupts currently supported - map all interrupts to PIN1 */ reg_write(BMI160_RA_INT_MAP_0, 0xFF); @@ -131,6 +148,17 @@ uint8_t BMI160Class::getDeviceID() { return reg_read(BMI160_RA_CHIP_ID); } +/* Checks if the specified sensors are enabled (sensors are specified using + * bit flags defined by CurieIMUSensor enum). If 0 is passed, checks if *any* + * sensors are enabled */ +bool BMI160Class::isEnabled(unsigned int sensors) +{ + if (sensors == 0) + return sensors_enabled > 0; + + return (sensors_enabled & sensors) > 0; +} + /** Verify the SPI connection. * Make sure the device is connected and responds as expected. * @return True if connection is valid, false otherwise @@ -330,10 +358,11 @@ uint8_t BMI160Class::getFullScaleGyroRange() { * @param range New full-scale gyroscope range value * @see getFullScaleGyroRange() */ -void BMI160Class::setFullScaleGyroRange(uint8_t range) { +void BMI160Class::setFullScaleGyroRange(uint8_t range, float real) { reg_write_bits(BMI160_RA_GYRO_RANGE, range, BMI160_GYRO_RANGE_SEL_BIT, BMI160_GYRO_RANGE_SEL_LEN); + gyro_range = real; } /** Get full-scale accelerometer range. @@ -362,10 +391,11 @@ uint8_t BMI160Class::getFullScaleAccelRange() { * @see getFullScaleAccelRange() * @see BMI160AccelRange */ -void BMI160Class::setFullScaleAccelRange(uint8_t range) { +void BMI160Class::setFullScaleAccelRange(uint8_t range, float real) { reg_write_bits(BMI160_RA_ACCEL_RANGE, range, BMI160_ACCEL_RANGE_SEL_BIT, BMI160_ACCEL_RANGE_SEL_LEN); + accel_range = real; } /** Get accelerometer offset compensation enabled value. @@ -2386,19 +2416,3 @@ uint8_t BMI160Class::getRegister(uint8_t reg) { void BMI160Class::setRegister(uint8_t reg, uint8_t data) { reg_write(reg, data); } - -/** Check if new gyroscope data is available - * @return True if new data is available, else false. - */ -bool BMI160Class::gyroDataReady() -{ - return reg_read_bits(BMI160_RA_STATUS, BMI160_STATUS_DRDY_GYR, 1); -} - -/** Check if new accelerometer data is available - * @return True if new data is available, else false. - */ -bool BMI160Class::accelDataReady() -{ - return reg_read_bits(BMI160_RA_STATUS, BMI160_STATUS_DRDY_ACC, 1); -} diff --git a/libraries/CurieIMU/src/BMI160.h b/libraries/CurieIMU/src/BMI160.h index 1384f1c4..dfdc7531 100644 --- a/libraries/CurieIMU/src/BMI160.h +++ b/libraries/CurieIMU/src/BMI160.h @@ -267,6 +267,12 @@ THE SOFTWARE. #define BMI160_RA_CMD 0x7E +/* Bit flags for selecting individual sensors */ +typedef enum { + GYRO = 0x1, + ACCEL = 0x2 +} CurieIMUSensor; + /** * Interrupt Latch Mode options * @see setInterruptLatch() @@ -471,9 +477,10 @@ typedef enum { class BMI160Class { public: - void initialize(); + void initialize(unsigned int flags); bool testConnection(); + bool isEnabled(unsigned int sensors); uint8_t getGyroRate(); void setGyroRate(uint8_t rate); @@ -487,9 +494,9 @@ class BMI160Class { void setAccelDLPFMode(uint8_t bandwidth); uint8_t getFullScaleGyroRange(); - void setFullScaleGyroRange(uint8_t range); + void setFullScaleGyroRange(uint8_t range, float real); uint8_t getFullScaleAccelRange(); - void setFullScaleAccelRange(uint8_t range); + void setFullScaleAccelRange(uint8_t range, float real); void autoCalibrateGyroOffset(); bool getGyroOffsetEnabled(); @@ -640,6 +647,7 @@ class BMI160Class { uint8_t getDeviceID(); + int isBitSet(uint8_t value, unsigned bit); uint8_t getRegister(uint8_t reg); void setRegister(uint8_t reg, uint8_t data); @@ -653,8 +661,10 @@ class BMI160Class { void setInterruptLatch(uint8_t latch); void resetInterrupt(); - bool gyroDataReady(); - bool accelDataReady(); + /* Use a bitmask to track which sensors are enabled */ + unsigned sensors_enabled; + float accel_range; + float gyro_range; protected: virtual int serial_buffer_transfer(uint8_t *buf, unsigned tx_cnt, unsigned rx_cnt) = 0; diff --git a/libraries/CurieIMU/src/CurieIMU.cpp b/libraries/CurieIMU/src/CurieIMU.cpp index 0def7306..e9e64760 100644 --- a/libraries/CurieIMU/src/CurieIMU.cpp +++ b/libraries/CurieIMU/src/CurieIMU.cpp @@ -32,7 +32,8 @@ * on the Curie module, before calling BMI160::initialize() to activate the * BMI160 accelerometer and gyroscpoe with default settings. */ -bool CurieIMUClass::begin() + +bool CurieIMUClass::configure_imu(unsigned int sensors) { ss_spi_init(SPI_SENSING_1, 2000, SPI_BUSMODE_0, SPI_8_BIT, SPI_SE_1); @@ -41,7 +42,7 @@ bool CurieIMUClass::begin() serial_buffer_transfer(&dummy_reg, 1, 1); /* The SPI interface is ready - now invoke the base class initialization */ - BMI160Class::initialize(); + initialize(sensors); /** Verify the SPI connection. * MakgetGyroRatee sure the device is connected and responds as expected. @@ -50,16 +51,66 @@ bool CurieIMUClass::begin() if (CURIE_IMU_CHIP_ID != getDeviceID()) return false; - accel_range = (float) getAccelerometerRange(); - gyro_range = (float) getGyroRange(); return true; } +bool CurieIMUClass::begin() +{ + return configure_imu(GYRO | ACCEL); +} + +bool CurieIMUClass::begin(unsigned int sensors) +{ + return configure_imu(sensors); +} + void CurieIMUClass::end() { ss_spi_disable(SPI_SENSING_1); } +bool CurieIMUClass::dataReady() +{ + uint8_t stat; + + /* If no sensors are enabled */ + if (!isEnabled(0)) + return false; + + /* Read status register */ + stat = getRegister(BMI160_RA_STATUS); + + if (isEnabled(GYRO) && !isBitSet(stat, BMI160_STATUS_DRDY_GYR)) + return false; + + if (isEnabled(ACCEL) && !isBitSet(stat, BMI160_STATUS_DRDY_ACC)) + return false; + + return true; +} + +bool CurieIMUClass::dataReady(unsigned int sensors) +{ + uint8_t stat; + + /* If no sensors enabled, or no data requested */ + if (sensors == 0 || !isEnabled(0)) + return false; + + /* Read status register */ + stat = getRegister(BMI160_RA_STATUS); + + if ((sensors & GYRO) && isEnabled(GYRO) && + !isBitSet(stat, BMI160_STATUS_DRDY_GYR)) + return false; + + if ((sensors & ACCEL) && isEnabled(ACCEL) && + !isBitSet(stat, BMI160_STATUS_DRDY_ACC)) + return false; + + return true; +} + int CurieIMUClass::getGyroRate() { int rate; @@ -227,25 +278,26 @@ int CurieIMUClass::getGyroRange() void CurieIMUClass::setGyroRange(int range) { BMI160GyroRange bmiRange; + float real; if (range >= 2000) { bmiRange = BMI160_GYRO_RANGE_2000; - gyro_range = 2000.0f; + real = 2000.0f; } else if (range >= 1000) { bmiRange = BMI160_GYRO_RANGE_1000; - gyro_range = 1000.0f; + real = 1000.0f; } else if (range >= 500) { bmiRange = BMI160_GYRO_RANGE_500; - gyro_range = 500.0f; + real = 500.0f; } else if (range >= 250) { bmiRange = BMI160_GYRO_RANGE_250; - gyro_range = 250.0f; + real = 250.0f; } else { bmiRange = BMI160_GYRO_RANGE_125; - gyro_range = 125.0f; + real = 125.0f; } - setFullScaleGyroRange(bmiRange); + setFullScaleGyroRange(bmiRange, real); } int CurieIMUClass::getAccelerometerRange() @@ -277,22 +329,23 @@ int CurieIMUClass::getAccelerometerRange() void CurieIMUClass::setAccelerometerRange(int range) { BMI160AccelRange bmiRange; + float real; if (range <= 2) { bmiRange = BMI160_ACCEL_RANGE_2G; - accel_range = 2.0f; + real = 2.0f; } else if (range <= 4) { bmiRange = BMI160_ACCEL_RANGE_4G; - accel_range = 4.0f; + real = 4.0f; } else if (range <= 8) { bmiRange = BMI160_ACCEL_RANGE_8G; - accel_range = 8.0f; + real = 8.0f; } else { bmiRange = BMI160_ACCEL_RANGE_16G; - accel_range = 16.0f; + real = 16.0f; } - setFullScaleAccelRange(bmiRange); + setFullScaleAccelRange(bmiRange, real); } void CurieIMUClass::autoCalibrateGyroOffset() diff --git a/libraries/CurieIMU/src/CurieIMU.h b/libraries/CurieIMU/src/CurieIMU.h index 8056b135..3a7a0dc4 100644 --- a/libraries/CurieIMU/src/CurieIMU.h +++ b/libraries/CurieIMU/src/CurieIMU.h @@ -94,9 +94,13 @@ class CurieIMUClass : public BMI160Class { friend void bmi160_pin1_isr(void); public: + bool begin(unsigned int sensors); bool begin(void); void end(void); + bool dataReady(); + bool dataReady(unsigned int sensors); + // supported values: 25, 50, 100, 200, 400, 800, 1600, 3200 (Hz) int getGyroRate(); void setGyroRate(int rate); @@ -207,11 +211,9 @@ class CurieIMUClass : public BMI160Class { void detachInterrupt(void); private: + bool configure_imu(unsigned int sensors); int serial_buffer_transfer(uint8_t *buf, unsigned tx_cnt, unsigned rx_cnt); - float accel_range; - float gyro_range; - float getFreefallDetectionThreshold(); void setFreefallDetectionThreshold(float threshold); float getShockDetectionThreshold(); From bc5650068db85e166241919d0b6724703138e4d9 Mon Sep 17 00:00:00 2001 From: lianggao Date: Wed, 18 Jan 2017 15:23:13 +0800 Subject: [PATCH 20/91] Jira 795, read() is blocking selectable, git 383 Mods: 1. Add an input parameter to BLECharacteristic::read() for blocking call selection. 2. By default, read() is a blocking call. File changes: 1. libraries/CurieBLE/src/BLECharacteristic.cpp: - Method read() added blocking selection. 2. libraries/CurieBLE/src/BLECharacteristic.h: - Prototype for read(), default is blocking. 3. libraries/CurieBLE/src/internal/BLECallbacks.cpp: - Added parameter checking in profile_read_rsp_process(). 4. libraries/CurieBLE/src/internal/BLECharacteristicImp.cpp - The implementation of read() added waiting for resp if blocking is selected. 5. libraries/CurieBLE/src/internal/BLECharacteristicImp.h: - prototyping. --- libraries/CurieBLE/src/BLECharacteristic.cpp | 4 ++-- libraries/CurieBLE/src/BLECharacteristic.h | 3 ++- .../CurieBLE/src/internal/BLECallbacks.cpp | 2 +- .../src/internal/BLECharacteristicImp.cpp | 18 +++++++++++++++--- .../src/internal/BLECharacteristicImp.h | 10 +++++----- 5 files changed, 25 insertions(+), 12 deletions(-) diff --git a/libraries/CurieBLE/src/BLECharacteristic.cpp b/libraries/CurieBLE/src/BLECharacteristic.cpp index f8432b11..62d8a777 100644 --- a/libraries/CurieBLE/src/BLECharacteristic.cpp +++ b/libraries/CurieBLE/src/BLECharacteristic.cpp @@ -367,14 +367,14 @@ bool BLECharacteristic::canUnsubscribe() return retVar; } -bool BLECharacteristic::read() +bool BLECharacteristic::read(bool blocked) { bool retVar = false; BLECharacteristicImp *characteristicImp = getImplementation(); if (NULL != characteristicImp) { - retVar = characteristicImp->read(); + retVar = characteristicImp->read(blocked); } return retVar; } diff --git a/libraries/CurieBLE/src/BLECharacteristic.h b/libraries/CurieBLE/src/BLECharacteristic.h index c1887c73..0ca0cf53 100644 --- a/libraries/CurieBLE/src/BLECharacteristic.h +++ b/libraries/CurieBLE/src/BLECharacteristic.h @@ -320,8 +320,9 @@ class BLECharacteristic: public BLEAttributeWithValue * @return bool true - Success, false - Failed * * @note Only for GATT client. Schedule read request to the GATT server + * Arduino requests to have read, by default, be blocking. */ - virtual bool read(); + virtual bool read(bool blocked = true); /** * @brief Write the charcteristic value diff --git a/libraries/CurieBLE/src/internal/BLECallbacks.cpp b/libraries/CurieBLE/src/internal/BLECallbacks.cpp index 568c54f8..be86552c 100644 --- a/libraries/CurieBLE/src/internal/BLECallbacks.cpp +++ b/libraries/CurieBLE/src/internal/BLECallbacks.cpp @@ -145,7 +145,7 @@ uint8_t profile_read_rsp_process(bt_conn_t *conn, const void *data, uint16_t length) { - if (NULL == data) + if (NULL == data && 0 != length) { return BT_GATT_ITER_STOP; } diff --git a/libraries/CurieBLE/src/internal/BLECharacteristicImp.cpp b/libraries/CurieBLE/src/internal/BLECharacteristicImp.cpp index 23e55f20..71318bc9 100644 --- a/libraries/CurieBLE/src/internal/BLECharacteristicImp.cpp +++ b/libraries/CurieBLE/src/internal/BLECharacteristicImp.cpp @@ -595,9 +595,10 @@ bt_uuid_t* BLECharacteristicImp::getClientCharacteristicConfigUuid(void) return (bt_uuid_t*) &_gatt_ccc_uuid; } -bool BLECharacteristicImp::read() +bool BLECharacteristicImp::read(bool blocked) { int retval = 0; + bool ret_bool = false; bt_conn_t* conn = NULL; if (true == BLEUtils::isLocalBLE(_ble_device)) @@ -631,12 +632,23 @@ bool BLECharacteristicImp::read() // Send read request retval = bt_gatt_read(conn, &_read_params); - bt_conn_unref(conn); if (0 == retval) { _reading = true; + ret_bool = true; + + // Block the call + if (blocked == true) + { + while (_reading == true && ret_bool) + { + delay(5); + ret_bool = _ble_device.connected(); + } + } } - return _reading; + bt_conn_unref(conn); + return ret_bool; } void BLECharacteristicImp::writeResponseReceived(struct bt_conn *conn, diff --git a/libraries/CurieBLE/src/internal/BLECharacteristicImp.h b/libraries/CurieBLE/src/internal/BLECharacteristicImp.h index 1066992c..d690d600 100644 --- a/libraries/CurieBLE/src/internal/BLECharacteristicImp.h +++ b/libraries/CurieBLE/src/internal/BLECharacteristicImp.h @@ -146,18 +146,18 @@ class BLECharacteristicImp: public BLEAttribute{ /** * @brief Schedule the read request to read the characteristic in peripheral * - * @param[in] none + * @param[in] blocked Flag the call is blocked or un-blocked * * @return bool Indicate the success or error * - * @note Only for central device + * @note Only for GATT client + * Default it is block call as per Arduino request */ - bool read(); + bool read(bool blocked = true); /** * @brief Schedule the write request to update the characteristic in peripheral * - * @param[in] peripheral The peripheral device that want to be updated * @param[in] value New value to set, as a byte array. Data is stored in internal copy. * @param[in] length Length, in bytes, of valid data in the array to write. * Must not exceed maxLength set for this characteristic. @@ -328,7 +328,7 @@ class BLECharacteristicImp: public BLEAttribute{ bt_gatt_subscribe_params_t _sub_params; bool _subscribed; - bool _reading; + volatile bool _reading; static volatile bool _gattc_writing; bt_gatt_read_params_t _read_params; // GATT read parameter From a2df1795ac275ac48485329dc0697ab2324715bf Mon Sep 17 00:00:00 2001 From: lianggao Date: Mon, 20 Feb 2017 09:39:50 +0800 Subject: [PATCH 21/91] Jira 857, BLEPeripheral::connected() always returns false, git 444 Root casue: - The stack need use connected device to get the state. - The current code used local address to get the link and get an error. Code mods: 1. BLEPeripheral.cpp: - Use central's address to get connection state. --- libraries/CurieBLE/src/BLEPeripheral.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libraries/CurieBLE/src/BLEPeripheral.cpp b/libraries/CurieBLE/src/BLEPeripheral.cpp index 760d374f..9fa572e2 100644 --- a/libraries/CurieBLE/src/BLEPeripheral.cpp +++ b/libraries/CurieBLE/src/BLEPeripheral.cpp @@ -146,7 +146,8 @@ BLECentral BLEPeripheral::central(void) bool BLEPeripheral::connected(void) { - return BLE.connected(); + BLEDevice centralBle = BLE.central(); + return centralBle.connected(); } void BLEPeripheral::init() From 6d22f3da7eace1640a8a217e200e19560fb5a780 Mon Sep 17 00:00:00 2001 From: lianggao Date: Mon, 13 Feb 2017 09:18:48 +0800 Subject: [PATCH 22/91] Jira 832 Sketch cannot exercise BLE broadcast, git 420 Root Cause: Need to restart advertising after setting the broadcast option in Characteristic. Otherwise, broadcasting would not take effect. Code mods: 1. libraries/CurieBLE/src/BLECharacteristic.cpp: - At the processing of the Boardcast option in the characteristic, stop and restart advertising if advertising has already started. --- libraries/CurieBLE/src/BLECharacteristic.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/CurieBLE/src/BLECharacteristic.cpp b/libraries/CurieBLE/src/BLECharacteristic.cpp index 62d8a777..89a8e41d 100644 --- a/libraries/CurieBLE/src/BLECharacteristic.cpp +++ b/libraries/CurieBLE/src/BLECharacteristic.cpp @@ -294,8 +294,8 @@ bool BLECharacteristic::broadcast() if (BLEDeviceManager::instance()->advertising()) { BLEDeviceManager::instance()->stopAdvertising(); - BLEDeviceManager::instance()->startAdvertising(); } + BLEDeviceManager::instance()->startAdvertising(); return _broadcast; } From 07f4de28e6aa57dab1f35ce730d12961774a7090 Mon Sep 17 00:00:00 2001 From: lianggao Date: Fri, 23 Dec 2016 10:26:18 +0800 Subject: [PATCH 23/91] Jira 842 UART improvement, PR 266, broke BLE interface. Root causes: 1. The uart_fifo_fill doesn't check the FIFO's length and failed to send out all data. 2. Check the FIFO status register before write data in FIFO. 3. Ring buffer pointer variables are not volatile and polling mechanism failed to examine the actual pointer value being update by foreground task. File changes: 1. RingBuffer.h: Make pointer as volatile. 2. UARTClass.cpp: Added checking of FIFO size for data Tx. 3. ns16550.c: Added routines to h/w status register checking. --- cores/arduino/RingBuffer.h | 6 ++-- cores/arduino/UARTClass.cpp | 35 ++++++++++++-------- system/libarc32_arduino101/drivers/ns16550.c | 23 ++++++++++--- 3 files changed, 43 insertions(+), 21 deletions(-) diff --git a/cores/arduino/RingBuffer.h b/cores/arduino/RingBuffer.h index 0e87b7ce..04d41b5a 100644 --- a/cores/arduino/RingBuffer.h +++ b/cores/arduino/RingBuffer.h @@ -30,9 +30,9 @@ class RingBuffer { public: uint8_t *_aucBuffer; - int _iHead ; - int _iTail ; - bool _buffer_overflow ; + volatile int _iHead ; + volatile int _iTail ; + volatile bool _buffer_overflow ; RingBuffer( void ) ; void store_char( uint8_t c ) ; diff --git a/cores/arduino/UARTClass.cpp b/cores/arduino/UARTClass.cpp index 000985f2..b4c31004 100644 --- a/cores/arduino/UARTClass.cpp +++ b/cores/arduino/UARTClass.cpp @@ -168,7 +168,7 @@ int UARTClass::read( void ) void UARTClass::flush( void ) { - while (_tx_buffer->_iHead != _tx_buffer->_iTail); //wait for transmit data to be sent + while (_tx_buffer->_iHead != (_tx_buffer->_iTail)); //wait for transmit data to be sent // Wait for transmission to complete while(!uart_tx_complete(CONFIG_UART_CONSOLE_INDEX)); } @@ -183,8 +183,7 @@ size_t UARTClass::write( const uint8_t uc_data ) { // If busy we buffer int l = (_tx_buffer->_iHead + 1) % UART_BUFFER_SIZE; - while (_tx_buffer->_iTail == l) - ; // Spin locks if we're about to overwrite the buffer. This continues once the data is sent + while (_tx_buffer->_iTail == l); // Spin locks if we're about to overwrite the buffer. This continues once the data is sent _tx_buffer->_aucBuffer[_tx_buffer->_iHead] = uc_data; _tx_buffer->_iHead = l; @@ -201,21 +200,29 @@ size_t UARTClass::write( const uint8_t uc_data ) void UARTClass::IrqHandler( void ) { - uint8_t uc_data; - int ret; - ret = uart_poll_in(CONFIG_UART_CONSOLE_INDEX, &uc_data); - - while ( ret != -1 ) { - _rx_buffer->store_char(uc_data); + uart_irq_update(CONFIG_UART_CONSOLE_INDEX); + // if irq is Receiver Data Available + if(uart_irq_rx_ready(CONFIG_UART_CONSOLE_INDEX)) + { + uint8_t uc_data; + int ret; ret = uart_poll_in(CONFIG_UART_CONSOLE_INDEX, &uc_data); + + while ( ret != -1 ) { + _rx_buffer->store_char(uc_data); + ret = uart_poll_in(CONFIG_UART_CONSOLE_INDEX, &uc_data); + } } - // Do we need to keep sending data? - if (!uart_irq_tx_ready(CONFIG_UART_CONSOLE_INDEX)) + // if irq is Transmitter Holding Register + if(uart_irq_tx_ready(CONFIG_UART_CONSOLE_INDEX)) { - if (_tx_buffer->_iTail != _tx_buffer->_iHead) { - uart_poll_out(CONFIG_UART_CONSOLE_INDEX, _tx_buffer->_aucBuffer[_tx_buffer->_iTail]); - _tx_buffer->_iTail = (unsigned int)(_tx_buffer->_iTail + 1) % UART_BUFFER_SIZE; + if(_tx_buffer->_iTail != _tx_buffer->_iHead) + { + int end = (_tx_buffer->_iTail < _tx_buffer->_iHead) ? _tx_buffer->_iHead : UART_BUFFER_SIZE; + int l = min(end - _tx_buffer->_iTail, UART_FIFO_SIZE); + l = uart_fifo_fill(CONFIG_UART_CONSOLE_INDEX, _tx_buffer->_aucBuffer+_tx_buffer->_iTail, l); + _tx_buffer->_iTail = (_tx_buffer->_iTail+l)%UART_BUFFER_SIZE; } else { diff --git a/system/libarc32_arduino101/drivers/ns16550.c b/system/libarc32_arduino101/drivers/ns16550.c index f4e529e5..575d43af 100644 --- a/system/libarc32_arduino101/drivers/ns16550.c +++ b/system/libarc32_arduino101/drivers/ns16550.c @@ -340,7 +340,7 @@ unsigned char uart_poll_out( ) { /* wait for transmitter to ready to accept a character */ - while ((INBYTE(LSR(which)) & LSR_TEMT) == 0) + while ((INBYTE(LSR(which)) & LSR_THRE) == 0) ; OUTBYTE(THR(which), outChar); @@ -352,6 +352,8 @@ unsigned char uart_poll_out( * * uart_fifo_fill - fill FIFO with data * +* It is up to the caller to make sure that FIFO capcity is not exceeded +* * RETURNS: number of bytes sent */ @@ -362,8 +364,9 @@ int uart_fifo_fill(int which, /* UART on which to send */ { int i; - for (i = 0; i < size && (INBYTE(LSR(which)) & - LSR_BOTH_EMPTY) != 0; i++) { + for (i = 0; i < size && (INBYTE(LSR(which)) & + LSR_BOTH_EMPTY) != 0; i++) + { OUTBYTE(THR(which), txData[i]); } return i; @@ -622,7 +625,6 @@ void uart_int_connect(int which, /* UART to which to connect */ ) { interrupt_connect((unsigned int)uart[which].irq, isr); - interrupt_priority_set ((int)uart[which].irq, uart[which].intPri); interrupt_enable((unsigned int)uart[which].irq); /* set the Host Processor Interrupt Routing Mask */ SOC_UNMASK_INTERRUPTS(INT_UART_0_MASK + (which * UART_REG_ADDR_INTERVAL)); @@ -641,6 +643,19 @@ uint8_t uart_tx_complete(int which) return INBYTE(LSR(which)) & LSR_TEMT; } +/******************************************************************************* +* +* uart_tx_complete - check if tx holding register is empty +* +* RETURNS: zero if register is non-empty, +* non-zero if register is empty (ready to receive new data) +*/ + +uint8_t uart_tx_ready(int which) +{ + return INBYTE(LSR(which)) & LSR_THRE; +} + /******************************************************************************* * * uart_loop_enable - enable loopback From f4a18802a50acaafb091691b0eff207bc74942ec Mon Sep 17 00:00:00 2001 From: lianggao Date: Thu, 23 Feb 2017 13:55:34 +0800 Subject: [PATCH 24/91] Jira 802, BLE Central scan() to filter Peripheral adv, git #369 New feature: - Request from Arduino to make our Central BLE library to scan Peripheral similar to an Apple device. - When filter is set, advertisement from a Peripheral will only show up once (until scan is stop and start again) with the available() call. Otherwise, a Peripheral will appear as often as the Central can detect its advertisement. - Unlike an Apple device, the 101 operates under memory constraints. Thus, the maximum number of filter entries is limited to 20. In other words, if ther are more than 20 Peripherals, the filter will NOT be able to filter out all the advertisement all the time. A Peripherla WILL show up multiple times when available() is called. Code mods: 1. BLECommon.h: - Definition of the filter entries size. 2. BLEDeviceManager.cpp: - Peripheral filtering initialization at startScanningWithDuplicates(). - Added deviceInDuplicateFilterBuffer() for search a newly detected Peripheral against a recorded list of devices. - Added updateDuplicateFilter() to record any newly detected Peripoheral. - At available(), check for duplicated Peripheral prior to return it to caller. Discard any reported Peripheral. Record any newly detected one prior to return it to caller. --- libraries/CurieBLE/src/BLECommon.h | 1 + .../src/internal/BLEDeviceManager.cpp | 57 ++++++++++++++++++- .../CurieBLE/src/internal/BLEDeviceManager.h | 6 ++ 3 files changed, 61 insertions(+), 3 deletions(-) diff --git a/libraries/CurieBLE/src/BLECommon.h b/libraries/CurieBLE/src/BLECommon.h index 76e6b804..37ac49df 100644 --- a/libraries/CurieBLE/src/BLECommon.h +++ b/libraries/CurieBLE/src/BLECommon.h @@ -103,6 +103,7 @@ typedef ble_status_t BleStatus; #define BLE_MAX_CONN_CFG 2 #define BLE_MAX_ADV_BUFFER_CFG 3 +#define BLE_MAX_ADV_FILTER_SIZE_CFG 20 typedef bool (*ble_advertise_handle_cb_t)(uint8_t type, const uint8_t *dataPtr, uint8_t data_len, const bt_addr_le_t *addrPtr); diff --git a/libraries/CurieBLE/src/internal/BLEDeviceManager.cpp b/libraries/CurieBLE/src/internal/BLEDeviceManager.cpp index b3e74278..643e6b97 100644 --- a/libraries/CurieBLE/src/internal/BLEDeviceManager.cpp +++ b/libraries/CurieBLE/src/internal/BLEDeviceManager.cpp @@ -47,7 +47,10 @@ BLEDeviceManager::BLEDeviceManager(): _local_name(""), _state(BLE_PERIPH_STATE_NOT_READY), _local_ble(NULL), - _peer_peripheral_index(0) + _peer_peripheral_index(0), + _duplicate_filter_header(0), + _duplicate_filter_tail(0), + _adv_duplicate_filter_enabled(false) { memset(&_local_bda, 0, sizeof(_local_bda)); memset(&_wait_for_connect_peripheral, 0, sizeof(_wait_for_connect_peripheral)); @@ -530,7 +533,8 @@ BLEDevice BLEDeviceManager::peripheral() bool BLEDeviceManager::startScanning() { - _scan_param.filter_dup = BT_HCI_LE_SCAN_FILTER_DUP_ENABLE;//BT_HCI_LE_SCAN_FILTER_DUP_DISABLE; + _adv_duplicate_filter_enabled = false; + _scan_param.filter_dup = BT_HCI_LE_SCAN_FILTER_DUP_ENABLE; int err = bt_le_scan_start(&_scan_param, ble_central_device_found); if (err) { @@ -542,6 +546,10 @@ bool BLEDeviceManager::startScanning() bool BLEDeviceManager::startScanningWithDuplicates() { + _adv_duplicate_filter_enabled = true; + memset(_peer_duplicate_address_buffer, 0, sizeof(_peer_duplicate_address_buffer)); + _duplicate_filter_header = _duplicate_filter_tail = 0; + _scan_param.filter_dup = BT_HCI_LE_SCAN_FILTER_DUP_ENABLE; int err = bt_le_scan_start(&_scan_param, ble_central_device_found); if (err) @@ -549,7 +557,7 @@ bool BLEDeviceManager::startScanningWithDuplicates() pr_info(LOG_MODULE_BLE, "Scanning failed to start (err %d)\n", err); return false; } - return false; + return true; } bool BLEDeviceManager::stopScanning() @@ -1164,6 +1172,38 @@ bool BLEDeviceManager::advertiseDataProc(uint8_t type, return false; } +bool BLEDeviceManager::deviceInDuplicateFilterBuffer(const bt_addr_le_t* addr) +{ + bool retVal = false; + for (uint8_t i = 0; + i < (sizeof(_peer_duplicate_address_buffer) / sizeof(bt_addr_le_t)); + i++) + { + if (0 == bt_addr_le_cmp(addr, &_peer_duplicate_address_buffer[i])) + { + retVal = true; + break; + } + } + return retVal; +} + +void BLEDeviceManager::updateDuplicateFilter(const bt_addr_le_t* addr) +{ + uint8_t i = (_duplicate_filter_header + 1) % (ARRAY_SIZE(_peer_duplicate_address_buffer)); + if (deviceInDuplicateFilterBuffer(addr)) + { + return; + } + bt_addr_le_copy(&_peer_duplicate_address_buffer[_duplicate_filter_header], + addr); + if (i == _duplicate_filter_tail) + { + _duplicate_filter_tail = (_duplicate_filter_tail + 1) % (ARRAY_SIZE(_peer_duplicate_address_buffer)); + } + _duplicate_filter_header = i; +} + BLEDevice BLEDeviceManager::available() { BLEDevice tempdevice; @@ -1179,6 +1219,13 @@ BLEDevice BLEDeviceManager::available() temp = &_peer_adv_buffer[i]; if ((timestamp_delta <= 2000) && (max_delta < timestamp_delta)) { + // Eable the duplicate filter + if (_adv_duplicate_filter_enabled && + true == deviceInDuplicateFilterBuffer(temp)) + { + _peer_adv_mill[i] -= 2000; // Invalid the item + continue; + } max_delta = timestamp_delta; index = i; } @@ -1198,6 +1245,10 @@ BLEDevice BLEDeviceManager::available() pr_debug(LOG_MODULE_BLE, "%s-%d:Con addr-%s", __FUNCTION__, __LINE__, BLEUtils::macAddressBT2String(*temp).c_str()); _peer_adv_mill[index] -= 2000; // Set it as expired + if (_adv_duplicate_filter_enabled) + { + updateDuplicateFilter(temp); + } } } return tempdevice; diff --git a/libraries/CurieBLE/src/internal/BLEDeviceManager.h b/libraries/CurieBLE/src/internal/BLEDeviceManager.h index 2e9d93b0..e09bfe6c 100644 --- a/libraries/CurieBLE/src/internal/BLEDeviceManager.h +++ b/libraries/CurieBLE/src/internal/BLEDeviceManager.h @@ -362,6 +362,8 @@ class BLEDeviceManager const uint8_t* &adv_data, uint8_t &adv_len) const; bool disconnectSingle(const bt_addr_le_t *peer); + void updateDuplicateFilter(const bt_addr_le_t* addr); + bool deviceInDuplicateFilterBuffer(const bt_addr_le_t* addr); private: uint16_t _min_conn_interval; @@ -432,6 +434,10 @@ class BLEDeviceManager uint8_t _peer_peripheral_adv_data[BLE_MAX_CONN_CFG][BLE_MAX_ADV_SIZE]; uint8_t _peer_peripheral_adv_data_len[BLE_MAX_CONN_CFG]; uint8_t _peer_peripheral_adv_rssi[BLE_MAX_CONN_CFG]; + bt_addr_le_t _peer_duplicate_address_buffer[BLE_MAX_ADV_FILTER_SIZE_CFG]; + uint8_t _duplicate_filter_header; + uint8_t _duplicate_filter_tail; + bool _adv_duplicate_filter_enabled; BLEDeviceEventHandler _device_events[BLEDeviceLastEvent]; }; From a03fa3c40e1c3043913eb6af25b6e34762a5064f Mon Sep 17 00:00:00 2001 From: Sandeep Mistry Date: Thu, 29 Dec 2016 15:40:59 -0500 Subject: [PATCH 25/91] Fix and simplify SensorTag button example --- .../sensortag_button/sensortag_button.ino | 59 ++++--------------- 1 file changed, 10 insertions(+), 49 deletions(-) diff --git a/libraries/CurieBLE/examples/central/sensortag_button/sensortag_button.ino b/libraries/CurieBLE/examples/central/sensortag_button/sensortag_button.ino index 786ff051..de85c6a8 100644 --- a/libraries/CurieBLE/examples/central/sensortag_button/sensortag_button.ino +++ b/libraries/CurieBLE/examples/central/sensortag_button/sensortag_button.ino @@ -15,24 +15,6 @@ #include -const int NUM_OF_SERVICE = 10; - -char *serviceUUIDArray[NUM_OF_SERVICE] = - - // These are the various services that are included in the CC2650 Sensor Tag - // If you uncomment them you can see the various services -{ //"f000aa00-0451-4000-b000-000000000000", - // "f000aa20-0451-4000-b000-000000000000", - // "f000aa40-0451-4000-b000-000000000000", - // "f000aa70-0451-4000-b000-000000000000", - // "f000aa80-0451-4000-b000-000000000000", - // "f000aa64-0451-4000-b000-000000000000", - // "f000ac00-0451-4000-b000-000000000000", - // "f000ccc0-0451-4000-b000-000000000000", - // "f000ffc0-0451-4000-b000-000000000000", - "0000ffe0-0000-1000-8000-00805f9b34fb" -}; - void setup() { Serial.begin(9600); while (!Serial); @@ -77,10 +59,7 @@ void loop() { * Use a central app that can display the BT MAC address * ****************************************************** */ - - if (peripheral.address() == "24:71:89:07:27:80") - - { + if (peripheral.address() == "68:C9:0B:06:BC:81") { // stop scanning BLE.stopScan(); @@ -94,9 +73,6 @@ void loop() { void monitorSensorTagButtons(BLEDevice peripheral) { - static bool getAllServices = true; - static int serviceIndx = 0; - // connect to the peripheral Serial.println("Connecting ..."); if (peripheral.connect()) { @@ -106,34 +82,18 @@ void monitorSensorTagButtons(BLEDevice peripheral) return; } - if (getAllServices) { - // discover peripheral attributes - Serial.println("Discovering attributes ..."); - if (peripheral.discoverAttributes()) { - Serial.println("Attributes discovered"); - } else { - getAllServices = false; - Serial.println("Attribute discovery failed."); - peripheral.disconnect(); - return; - } + // discover peripheral attributes + Serial.println("Discovering attributes of service 0xffe0 ..."); + if (peripheral.discoverAttributesByService("ffe0")) { + Serial.println("Attributes discovered"); } else { - int tmp = serviceIndx; - Serial.print("Discovering Service: "); - Serial.println(serviceUUIDArray[tmp]); - if (++serviceIndx >= NUM_OF_SERVICE) - serviceIndx = 0; - if (peripheral.discoverAttributesByService(serviceUUIDArray[tmp]) == false) { - Serial.println("Can't find the Service."); - peripheral.disconnect(); - return; - } else { - Serial.println("Service discovered."); - } + Serial.println("Attribute discovery failed."); + peripheral.disconnect(); + return; } // retrieve the simple key characteristic - BLECharacteristic simpleKeyCharacteristic = peripheral.characteristic("0000ffe1-0000-1000-8000-00805f9b34fb"); + BLECharacteristic simpleKeyCharacteristic = peripheral.characteristic("ffe1"); // subscribe to the simple key characteristic Serial.println("Subscribing to simple key characteristic ..."); @@ -174,6 +134,7 @@ void monitorSensorTagButtons(BLEDevice peripheral) } } + Serial.println("SensorTag disconnected!"); } From e9984d9e88a851edcce5e7c348d0110f8c75628c Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Mon, 26 Sep 2016 12:39:20 +0200 Subject: [PATCH 26/91] [TEMP] remove PaulStoffregen's SerialFlash fork --- libraries/SerialFlash/SerialFlash.h | 132 ----- libraries/SerialFlash/SerialFlashChip.cpp | 523 ------------------ .../SerialFlash/SerialFlashDirectory.cpp | 395 ------------- .../EraseEverything/EraseEverything.ino | 80 --- .../examples/FileWrite/FileWrite.ino | 50 -- .../examples/ListFiles/ListFiles.ino | 63 --- .../RawHardwareTest/RawHardwareTest.ino | 502 ----------------- libraries/SerialFlash/keywords.txt | 9 - .../util/SerialFlash_directwrite.h | 204 ------- 9 files changed, 1958 deletions(-) delete mode 100644 libraries/SerialFlash/SerialFlash.h delete mode 100644 libraries/SerialFlash/SerialFlashChip.cpp delete mode 100644 libraries/SerialFlash/SerialFlashDirectory.cpp delete mode 100644 libraries/SerialFlash/examples/EraseEverything/EraseEverything.ino delete mode 100755 libraries/SerialFlash/examples/FileWrite/FileWrite.ino delete mode 100644 libraries/SerialFlash/examples/ListFiles/ListFiles.ino delete mode 100644 libraries/SerialFlash/examples/RawHardwareTest/RawHardwareTest.ino delete mode 100644 libraries/SerialFlash/keywords.txt delete mode 100644 libraries/SerialFlash/util/SerialFlash_directwrite.h diff --git a/libraries/SerialFlash/SerialFlash.h b/libraries/SerialFlash/SerialFlash.h deleted file mode 100644 index e56df624..00000000 --- a/libraries/SerialFlash/SerialFlash.h +++ /dev/null @@ -1,132 +0,0 @@ -/* SerialFlash Library - for filesystem-like access to SPI Serial Flash memory - * https://github.com/PaulStoffregen/SerialFlash - * Copyright (C) 2015, Paul Stoffregen, paul@pjrc.com - * - * Development of this library was funded by PJRC.COM, LLC by sales of Teensy. - * Please support PJRC's efforts to develop open source software by purchasing - * Teensy or other genuine PJRC products. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice, development funding notice, and this permission - * notice shall be included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#ifndef SerialFlash_h_ -#define SerialFlash_h_ - -#include -#include - -class SerialFlashFile; - -class SerialFlashChip -{ -public: - static bool begin(uint8_t pin = 6); - static uint32_t capacity(const uint8_t *id); - static uint32_t blockSize(); - static void sleep(); - static void wakeup(); - static void readID(uint8_t *buf); - static void readSerialNumber(uint8_t *buf); - static void read(uint32_t addr, void *buf, uint32_t len); - static bool ready(); - static void wait(); - static void write(uint32_t addr, const void *buf, uint32_t len); - static void eraseAll(); - static void eraseBlock(uint32_t addr); - - static SerialFlashFile open(const char *filename); - static bool create(const char *filename, uint32_t length, uint32_t align = 0); - static bool createErasable(const char *filename, uint32_t length) { - return create(filename, length, blockSize()); - } - static bool exists(const char *filename); - static bool remove(const char *filename); - static bool remove(SerialFlashFile &file); - static void opendir() { dirindex = 0; } - static bool readdir(char *filename, uint32_t strsize, uint32_t &filesize); -private: - static uint16_t dirindex; // current position for readdir() - static uint8_t flags; // chip features - static uint8_t busy; // 0 = ready - // 1 = suspendable program operation - // 2 = suspendable erase operation - // 3 = busy for realz!! -}; - -extern SerialFlashChip SerialFlash; - - -class SerialFlashFile -{ -public: - SerialFlashFile() : address(0) { - } - operator bool() { - if (address > 0) return true; - return false; - } - uint32_t read(void *buf, uint32_t rdlen) { - if (offset + rdlen > length) { - if (offset >= length) return 0; - rdlen = length - offset; - } - SerialFlash.read(address + offset, buf, rdlen); - offset += rdlen; - return rdlen; - } - uint32_t write(const void *buf, uint32_t wrlen) { - if (offset + wrlen > length) { - if (offset >= length) return 0; - wrlen = length - offset; - } - SerialFlash.write(address + offset, buf, wrlen); - offset += wrlen; - return wrlen; - } - void seek(uint32_t n) { - offset = n; - } - uint32_t position() { - return offset; - } - uint32_t size() { - return length; - } - uint32_t available() { - if (offset >= length) return 0; - return length - offset; - } - void erase(); - void flush() { - } - void close() { - } - uint32_t getFlashAddress() { - return address; - } -protected: - friend class SerialFlashChip; - uint32_t address; // where this file's data begins in the Flash, or zero - uint32_t length; // total length of the data in the Flash chip - uint32_t offset; // current read/write offset in the file - uint16_t dirindex; -}; - - -#endif diff --git a/libraries/SerialFlash/SerialFlashChip.cpp b/libraries/SerialFlash/SerialFlashChip.cpp deleted file mode 100644 index 4e467f57..00000000 --- a/libraries/SerialFlash/SerialFlashChip.cpp +++ /dev/null @@ -1,523 +0,0 @@ -/* SerialFlash Library - for filesystem-like access to SPI Serial Flash memory - * https://github.com/PaulStoffregen/SerialFlash - * Copyright (C) 2015, Paul Stoffregen, paul@pjrc.com - * - * Development of this library was funded by PJRC.COM, LLC by sales of Teensy. - * Please support PJRC's efforts to develop open source software by purchasing - * Teensy or other genuine PJRC products. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice, development funding notice, and this permission - * notice shall be included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#include "SerialFlash.h" -#include "util/SerialFlash_directwrite.h" - -#define CSASSERT() DIRECT_WRITE_LOW(cspin_basereg, cspin_bitmask) -#define CSRELEASE() DIRECT_WRITE_HIGH(cspin_basereg, cspin_bitmask) -#define SPICONFIG SPISettings(50000000, MSBFIRST, SPI_MODE0) - -#if defined(__arc__) -// Use SPI1 on Arduino 101 (accesses chip already on the board) -#define SPIPORT SPI1 -#elif 0 -// Add cases here, if you wish to use other SPI ports... -#else -// Otherwise, use the normal SPI port. -#define SPIPORT SPI -#endif - -uint16_t SerialFlashChip::dirindex = 0; -uint8_t SerialFlashChip::flags = 0; -uint8_t SerialFlashChip::busy = 0; - -static volatile IO_REG_TYPE *cspin_basereg; -static IO_REG_TYPE cspin_bitmask; - -#define FLAG_32BIT_ADDR 0x01 // larger than 16 MByte address -#define FLAG_STATUS_CMD70 0x02 // requires special busy flag check -#define FLAG_DIFF_SUSPEND 0x04 // uses 2 different suspend commands -#define FLAG_MULTI_DIE 0x08 // multiple die, don't read cross 32M barrier -#define FLAG_256K_BLOCKS 0x10 // has 256K erase blocks -#define FLAG_DIE_MASK 0xC0 // top 2 bits count during multi-die erase - -void SerialFlashChip::wait(void) -{ - uint32_t status; - //Serial.print("wait-"); - while (1) { - SPIPORT.beginTransaction(SPICONFIG); - CSASSERT(); - if (flags & FLAG_STATUS_CMD70) { - // some Micron chips require this different - // command to detect program and erase completion - SPIPORT.transfer(0x70); - status = SPIPORT.transfer(0); - CSRELEASE(); - SPIPORT.endTransaction(); - //Serial.printf("b=%02x.", status & 0xFF); - if ((status & 0x80)) break; - } else { - // all others work by simply reading the status reg - SPIPORT.transfer(0x05); - status = SPIPORT.transfer(0); - CSRELEASE(); - SPIPORT.endTransaction(); - //Serial.printf("b=%02x.", status & 0xFF); - if (!(status & 1)) break; - } - } - busy = 0; - //Serial.println(); -} - -void SerialFlashChip::read(uint32_t addr, void *buf, uint32_t len) -{ - uint8_t *p = (uint8_t *)buf; - uint8_t b, f, status, cmd; - - memset(p, 0, len); - f = flags; - SPIPORT.beginTransaction(SPICONFIG); - b = busy; - if (b) { - // read status register ... chip may no longer be busy - CSASSERT(); - if (flags & FLAG_STATUS_CMD70) { - SPIPORT.transfer(0x70); - status = SPIPORT.transfer(0); - if ((status & 0x80)) b = 0; - } else { - SPIPORT.transfer(0x05); - status = SPIPORT.transfer(0); - if (!(status & 1)) b = 0; - } - CSRELEASE(); - if (b == 0) { - // chip is no longer busy :-) - busy = 0; - } else if (b < 3) { - // TODO: this may not work on Spansion chips - // which apparently have 2 different suspend - // commands, for program vs erase - CSASSERT(); - SPIPORT.transfer(0x06); // write enable (Micron req'd) - CSRELEASE(); - delayMicroseconds(1); - cmd = 0x75; //Suspend program/erase for almost all chips - // but Spansion just has to be different for program suspend! - if ((f & FLAG_DIFF_SUSPEND) && (b == 1)) cmd = 0x85; - CSASSERT(); - SPIPORT.transfer(cmd); // Suspend command - CSRELEASE(); - if (f & FLAG_STATUS_CMD70) { - // Micron chips don't actually suspend until flags read - CSASSERT(); - SPIPORT.transfer(0x70); - do { - status = SPIPORT.transfer(0); - } while (!(status & 0x80)); - CSRELEASE(); - } else { - CSASSERT(); - SPIPORT.transfer(0x05); - do { - status = SPIPORT.transfer(0); - } while ((status & 0x01)); - CSRELEASE(); - } - } else { - // chip is busy with an operation that can not suspend - SPIPORT.endTransaction(); // is this a good idea? - wait(); // should we wait without ending - b = 0; // the transaction?? - SPIPORT.beginTransaction(SPICONFIG); - } - } - do { - uint32_t rdlen = len; - if (f & FLAG_MULTI_DIE) { - if ((addr & 0xFE000000) != ((addr + len - 1) & 0xFE000000)) { - rdlen = 0x2000000 - (addr & 0x1FFFFFF); - } - } - CSASSERT(); - // TODO: FIFO optimize.... - if (f & FLAG_32BIT_ADDR) { - SPIPORT.transfer(0x03); - SPIPORT.transfer16(addr >> 16); - SPIPORT.transfer16(addr); - } else { - SPIPORT.transfer16(0x0300 | ((addr >> 16) & 255)); - SPIPORT.transfer16(addr); - } - SPIPORT.transfer(p, rdlen); - CSRELEASE(); - p += rdlen; - addr += rdlen; - len -= rdlen; - } while (len > 0); - if (b) { - CSASSERT(); - SPIPORT.transfer(0x06); // write enable (Micron req'd) - CSRELEASE(); - delayMicroseconds(1); - cmd = 0x7A; - if ((f & FLAG_DIFF_SUSPEND) && (b == 1)) cmd = 0x8A; - CSASSERT(); - SPIPORT.transfer(cmd); // Resume program/erase - CSRELEASE(); - } - SPIPORT.endTransaction(); -} - -void SerialFlashChip::write(uint32_t addr, const void *buf, uint32_t len) -{ - const uint8_t *p = (const uint8_t *)buf; - uint32_t max, pagelen; - - //Serial.printf("WR: addr %08X, len %d\n", addr, len); - do { - if (busy) wait(); - SPIPORT.beginTransaction(SPICONFIG); - CSASSERT(); - // write enable command - SPIPORT.transfer(0x06); - CSRELEASE(); - max = 256 - (addr & 0xFF); - pagelen = (len <= max) ? len : max; - //Serial.printf("WR: addr %08X, pagelen %d\n", addr, pagelen); - delayMicroseconds(1); // TODO: reduce this, but prefer safety first - CSASSERT(); - if (flags & FLAG_32BIT_ADDR) { - SPIPORT.transfer(0x02); // program page command - SPIPORT.transfer16(addr >> 16); - SPIPORT.transfer16(addr); - } else { - SPIPORT.transfer16(0x0200 | ((addr >> 16) & 255)); - SPIPORT.transfer16(addr); - } - addr += pagelen; - len -= pagelen; - do { - SPIPORT.transfer(*p++); - } while (--pagelen > 0); - CSRELEASE(); - busy = 4; - SPIPORT.endTransaction(); - } while (len > 0); -} - -void SerialFlashChip::eraseAll() -{ - if (busy) wait(); - uint8_t id[5]; - readID(id); - //Serial.printf("ID: %02X %02X %02X\n", id[0], id[1], id[2]); - if (id[0] == 0x20 && id[2] >= 0x20 && id[2] <= 0x22) { - // Micron's multi-die chips require special die erase commands - // N25Q512A 20 BA 20 2 dies 32 Mbyte/die 65 nm transitors - // N25Q00AA 20 BA 21 4 dies 32 Mbyte/die 65 nm transitors - // MT25QL02GC 20 BA 22 2 dies 128 Mbyte/die 45 nm transitors - uint8_t die_count = 2; - if (id[2] == 0x21) die_count = 4; - uint8_t die_index = flags >> 6; - //Serial.printf("Micron die erase %d\n", die_index); - flags &= 0x3F; - if (die_index >= die_count) return; // all dies erased :-) - uint8_t die_size = 2; // in 16 Mbyte units - if (id[2] == 0x22) die_size = 8; - SPIPORT.beginTransaction(SPICONFIG); - CSASSERT(); - SPIPORT.transfer(0x06); // write enable command - CSRELEASE(); - delayMicroseconds(1); - CSASSERT(); - // die erase command - SPIPORT.transfer(0xC4); - SPIPORT.transfer16((die_index * die_size) << 8); - SPIPORT.transfer16(0x0000); - CSRELEASE(); - //Serial.printf("Micron erase begin\n"); - flags |= (die_index + 1) << 6; - } else { - // All other chips support the bulk erase command - SPIPORT.beginTransaction(SPICONFIG); - CSASSERT(); - // write enable command - SPIPORT.transfer(0x06); - CSRELEASE(); - delayMicroseconds(1); - CSASSERT(); - // bulk erase command - SPIPORT.transfer(0xC7); - CSRELEASE(); - SPIPORT.endTransaction(); - } - busy = 3; -} - -void SerialFlashChip::eraseBlock(uint32_t addr) -{ - uint8_t f = flags; - if (busy) wait(); - SPIPORT.beginTransaction(SPICONFIG); - CSASSERT(); - SPIPORT.transfer(0x06); // write enable command - CSRELEASE(); - delayMicroseconds(1); - CSASSERT(); - if (f & FLAG_32BIT_ADDR) { - SPIPORT.transfer(0xD8); - SPIPORT.transfer16(addr >> 16); - SPIPORT.transfer16(addr); - } else { - SPIPORT.transfer16(0xD800 | ((addr >> 16) & 255)); - SPIPORT.transfer16(addr); - } - CSRELEASE(); - SPIPORT.endTransaction(); - busy = 2; -} - - -bool SerialFlashChip::ready() -{ - uint32_t status; - if (!busy) return true; - SPIPORT.beginTransaction(SPICONFIG); - CSASSERT(); - if (flags & FLAG_STATUS_CMD70) { - // some Micron chips require this different - // command to detect program and erase completion - SPIPORT.transfer(0x70); - status = SPIPORT.transfer(0); - CSRELEASE(); - SPIPORT.endTransaction(); - //Serial.printf("ready=%02x\n", status & 0xFF); - if ((status & 0x80) == 0) return false; - } else { - // all others work by simply reading the status reg - SPIPORT.transfer(0x05); - status = SPIPORT.transfer(0); - CSRELEASE(); - SPIPORT.endTransaction(); - //Serial.printf("ready=%02x\n", status & 0xFF); - if ((status & 1)) return false; - } - busy = 0; - if (flags & 0xC0) { - // continue a multi-die erase - eraseAll(); - return false; - } - return true; -} - - -#define ID0_WINBOND 0xEF -#define ID0_SPANSION 0x01 -#define ID0_MICRON 0x20 -#define ID0_MACRONIX 0xC2 -#define ID0_SST 0xBF - -//#define FLAG_32BIT_ADDR 0x01 // larger than 16 MByte address -//#define FLAG_STATUS_CMD70 0x02 // requires special busy flag check -//#define FLAG_DIFF_SUSPEND 0x04 // uses 2 different suspend commands -//#define FLAG_256K_BLOCKS 0x10 // has 256K erase blocks - -bool SerialFlashChip::begin(uint8_t pin) -{ - uint8_t id[5]; - uint8_t f; - uint32_t size; - - cspin_basereg = PIN_TO_BASEREG(pin); - cspin_bitmask = PIN_TO_BITMASK(pin); - SPIPORT.begin(); - pinMode(pin, OUTPUT); - CSRELEASE(); - readID(id); - f = 0; - size = capacity(id); - if (size > 16777216) { - // more than 16 Mbyte requires 32 bit addresses - f |= FLAG_32BIT_ADDR; - SPIPORT.beginTransaction(SPICONFIG); - if (id[0] == ID0_SPANSION) { - // spansion uses MSB of bank register - CSASSERT(); - SPIPORT.transfer16(0x1780); // bank register write - CSRELEASE(); - } else { - // micron & winbond & macronix use command - CSASSERT(); - SPIPORT.transfer(0x06); // write enable - CSRELEASE(); - delayMicroseconds(1); - CSASSERT(); - SPIPORT.transfer(0xB7); // enter 4 byte addr mode - CSRELEASE(); - } - SPIPORT.endTransaction(); - if (id[0] == ID0_MICRON) f |= FLAG_MULTI_DIE; - } - if (id[0] == ID0_SPANSION) { - // Spansion has separate suspend commands - f |= FLAG_DIFF_SUSPEND; - if (!id[4]) { - // Spansion chips with id[4] == 0 use 256K sectors - f |= FLAG_256K_BLOCKS; - } - } - if (id[0] == ID0_MICRON) { - // Micron requires busy checks with a different command - f |= FLAG_STATUS_CMD70; // TODO: all or just multi-die chips? - } - flags = f; - readID(id); - return true; -} - -// chips tested: https://github.com/PaulStoffregen/SerialFlash/pull/12#issuecomment-169596992 -// -void SerialFlashChip::sleep() -{ - if (busy) wait(); - SPIPORT.beginTransaction(SPICONFIG); - CSASSERT(); - SPIPORT.transfer(0xB9); // Deep power down command - CSRELEASE(); -} - -void SerialFlashChip::wakeup() -{ - SPIPORT.beginTransaction(SPICONFIG); - CSASSERT(); - SPIPORT.transfer(0xAB); // Wake up from deep power down command - CSRELEASE(); -} - -void SerialFlashChip::readID(uint8_t *buf) -{ - if (busy) wait(); - SPIPORT.beginTransaction(SPICONFIG); - CSASSERT(); - SPIPORT.transfer(0x9F); - buf[0] = SPIPORT.transfer(0); // manufacturer ID - buf[1] = SPIPORT.transfer(0); // memory type - buf[2] = SPIPORT.transfer(0); // capacity - if (buf[0] == ID0_SPANSION) { - buf[3] = SPIPORT.transfer(0); // ID-CFI - buf[4] = SPIPORT.transfer(0); // sector size - } - CSRELEASE(); - SPIPORT.endTransaction(); - //Serial.printf("ID: %02X %02X %02X\n", buf[0], buf[1], buf[2]); -} - -void SerialFlashChip::readSerialNumber(uint8_t *buf) //needs room for 8 bytes -{ - if (busy) wait(); - SPIPORT.beginTransaction(SPICONFIG); - CSASSERT(); - SPIPORT.transfer(0x4B); - SPIPORT.transfer16(0); - SPIPORT.transfer16(0); - for (int i=0; i<8; i++) { - buf[i] = SPIPORT.transfer(0); - } - CSRELEASE(); - SPIPORT.endTransaction(); -// Serial.printf("Serial Number: %02X %02X %02X %02X %02X %02X %02X %02X\n", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7]); -} - -uint32_t SerialFlashChip::capacity(const uint8_t *id) -{ - uint32_t n = 1048576; // unknown chips, default to 1 MByte - - if (id[2] >= 16 && id[2] <= 31) { - n = 1ul << id[2]; - } else - if (id[2] >= 32 && id[2] <= 37) { - n = 1ul << (id[2] - 6); - } else - if ((id[0]==0 && id[1]==0 && id[2]==0) || - (id[0]==255 && id[1]==255 && id[2]==255)) { - n = 0; - } - //Serial.printf("capacity %lu\n", n); - return n; -} - -uint32_t SerialFlashChip::blockSize() -{ - // Spansion chips >= 512 mbit use 256K sectors - if (flags & FLAG_256K_BLOCKS) return 262144; - // everything else seems to have 64K sectors - return 65536; -} - - - - -/* -Chip Uniform Sector Erase - 20/21 52 D8/DC - ----- -- ----- -W25Q64CV 4 32 64 -W25Q128FV 4 32 64 -S25FL127S 64 -N25Q512A 4 64 -N25Q00AA 4 64 -S25FL512S 256 -SST26VF032 4 -*/ - - - -// size sector busy pgm/erase chip -// Part Mbyte kbyte ID bytes cmd suspend erase -// ---- ---- ----- -------- --- ------- ----- -// Winbond W25Q64CV 8 64 EF 40 17 -// Winbond W25Q128FV 16 64 EF 40 18 05 single 60 & C7 -// Winbond W25Q256FV 32 64 EF 40 19 -// Spansion S25FL064A 8 ? 01 02 16 -// Spansion S25FL127S 16 64 01 20 18 05 -// Spansion S25FL128P 16 64 01 20 18 -// Spansion S25FL256S 32 64 01 02 19 05 60 & C7 -// Spansion S25FL512S 64 256 01 02 20 -// Macronix MX25L12805D 16 ? C2 20 18 -// Macronix MX66L51235F 64 C2 20 1A -// Numonyx M25P128 16 ? 20 20 18 -// Micron M25P80 1 ? 20 20 14 -// Micron N25Q128A 16 64 20 BA 18 -// Micron N25Q512A 64 ? 20 BA 20 70 single C4 x2 -// Micron N25Q00AA 128 64 20 BA 21 single C4 x4 -// Micron MT25QL02GC 256 64 20 BA 22 70 C4 x2 -// SST SST25WF010 1/8 ? BF 25 02 -// SST SST25WF020 1/4 ? BF 25 03 -// SST SST25WF040 1/2 ? BF 25 04 -// SST SST25VF016B 1 ? BF 25 41 -// SST26VF016 ? BF 26 01 -// SST26VF032 ? BF 26 02 -// SST25VF032 4 64 BF 25 4A -// SST26VF064 8 ? BF 26 43 -// LE25U40CMC 1/2 64 62 06 13 - -SerialFlashChip SerialFlash; diff --git a/libraries/SerialFlash/SerialFlashDirectory.cpp b/libraries/SerialFlash/SerialFlashDirectory.cpp deleted file mode 100644 index 116c14ec..00000000 --- a/libraries/SerialFlash/SerialFlashDirectory.cpp +++ /dev/null @@ -1,395 +0,0 @@ -/* SerialFlash Library - for filesystem-like access to SPI Serial Flash memory - * https://github.com/PaulStoffregen/SerialFlash - * Copyright (C) 2015, Paul Stoffregen, paul@pjrc.com - * - * Development of this library was funded by PJRC.COM, LLC by sales of Teensy. - * Please support PJRC's efforts to develop open source software by purchasing - * Teensy or other genuine PJRC products. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice, development funding notice, and this permission - * notice shall be included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#include "SerialFlash.h" - -/* On-chip SerialFlash file allocation data structures: - - uint32_t signature = 0xFA96554C; - uint16_t maxfiles - uint16_t stringssize // div by 4 - uint16_t hashes[maxfiles] - struct { - uint32_t file_begin - uint32_t file_length - uint16_t string_index // div4 - } fileinfo[maxfiles] - char strings[stringssize] - -A 32 bit signature is stored at the beginning of the flash memory. -If 0xFFFFFFFF is seen, the entire chip should be assumed blank. -If any value other than 0xFA96554C is found, a different data format -is stored. This could should refuse to access the flash. - -The next 4 bytes store number of files and size of the strings -section, which allow the position of every other item to be found. -The string section size is the 16 bit integer times 4, which allows -up to 262140 bytes for string data. - -An array of 16 bit filename hashes allows for quick linear search -for potentially matching filenames. A hash value of 0xFFFF indicates -no file is allocated for the remainder of the array. - -Following the hashes, and array of 10 byte structs give the location -and length of the file's actual data, and the offset of its filename -in the strings section. - -Strings are null terminated. The remainder of the chip is file data. -*/ - -#define DEFAULT_MAXFILES 600 -#define DEFAULT_STRINGS_SIZE 25560 - - -static uint32_t check_signature(void) -{ - uint32_t sig[2]; - - SerialFlash.read(0, sig, 8); - //Serial.printf("sig: %08X %08X\n", sig[0], sig[1]); - if (sig[0] == 0xFA96554C) return sig[1]; - if (sig[0] == 0xFFFFFFFF) { - sig[0] = 0xFA96554C; - sig[1] = ((uint32_t)(DEFAULT_STRINGS_SIZE/4) << 16) | DEFAULT_MAXFILES; - SerialFlash.write(0, sig, 8); - while (!SerialFlash.ready()) ; // TODO: timeout - SerialFlash.read(0, sig, 8); - if (sig[0] == 0xFA96554C) return sig[1]; - } - return 0; -} - -static uint16_t filename_hash(const char *filename) -{ - // http://isthe.com/chongo/tech/comp/fnv/ - uint32_t hash = 2166136261; - const char *p; - - for (p=filename; *p; p++) { - hash ^= *p; - hash *= 16777619; - } - hash = (hash % (uint32_t)0xFFFE) + 1; // all values except 0000 & FFFF - return hash; -} - -static bool filename_compare(const char *filename, uint32_t straddr) -{ - unsigned int i; - const char *p; - char buf[16]; - - p = filename; - while (1) { - SerialFlash.read(straddr, buf, sizeof(buf)); - straddr += sizeof(buf); - for (i=0; i < sizeof(buf); i++) { - if (*p++ != buf[i]) return false; - if (buf[i] == 0) return true; - } - } -} - -#if 0 -void pbuf(const void *buf, uint32_t len) -{ - const uint8_t *p = (const uint8_t *)buf; - do { - Serial.printf("%02X ", *p++); - } while (--len > 0); - Serial.println(); -} -#endif - -SerialFlashFile SerialFlashChip::open(const char *filename) -{ - uint32_t maxfiles, straddr; - uint16_t hash, hashtable[8]; - uint32_t i, n, index=0; - uint32_t buf[3]; - SerialFlashFile file; - - maxfiles = check_signature(); - //Serial.printf("sig: %08X\n", maxfiles); - if (!maxfiles) return file; - maxfiles &= 0xFFFF; - hash = filename_hash(filename); - //Serial.printf("hash %04X for \"%s\"\n", hash, filename); - while (index < maxfiles) { - n = 8; - if (n > maxfiles - index) n = maxfiles - index; - SerialFlash.read(8 + index * 2, hashtable, n * 2); - //Serial.printf(" read %u: ", 8 + index * 2); - //pbuf(hashtable, n * 2); - for (i=0; i < n; i++) { - if (hashtable[i] == hash) { - //Serial.printf(" hash match at index %u\n", index+i); - buf[2] = 0; - SerialFlash.read(8 + maxfiles * 2 + (index+i) * 10, buf, 10); - - //Serial.printf(" maxf=%d, index=%d, i=%d\n", maxfiles, index, i); - //Serial.printf(" read %u: ", 8 + maxfiles * 2 + (index+i) * 10); - //pbuf(buf, 10); - straddr = 8 + maxfiles * 12 + buf[2] * 4; - //Serial.printf(" straddr = %u\n", straddr); - if (filename_compare(filename, straddr)) { - //Serial.printf(" match!\n"); - //Serial.printf(" addr = %u\n", buf[0]); - //Serial.printf(" len = %u\n", buf[1]); - file.address = buf[0]; - file.length = buf[1]; - file.offset = 0; - file.dirindex = index + i; - return file; - } - } else if (hashtable[i] == 0xFFFF) { - return file; - } - } - index += n; - } - return file; -} - -bool SerialFlashChip::exists(const char *filename) -{ - SerialFlashFile file = open(filename); - return (bool)file; -} - -bool SerialFlashChip::remove(const char *filename) -{ - SerialFlashFile file = open(filename); - return remove(file); -} - -bool SerialFlashChip::remove(SerialFlashFile &file) -{ - // To "remove" a file, we simply zero its hash in the lookup - // table, so it can't be found by open(). The space on the - // flash memory is not freed. - if (!file) return false; - uint16_t hash; - SerialFlash.read(8 + file.dirindex * 2, &hash, 2); - //Serial.printf("remove hash %04X at %d index\n", hash, file.dirindex); - hash ^= 0xFFFF; // write zeros to all ones - SerialFlash.write(8 + file.dirindex * 2, &hash, 2); - while (!SerialFlash.ready()) ; // wait... TODO: timeout - SerialFlash.read(8 + file.dirindex * 2, &hash, 2); - if (hash != 0) { - //Serial.printf("remove failed, hash %04X\n", hash); - return false; - } - file.address = 0; - file.length = 0; - return true; -} - -static uint32_t find_first_unallocated_file_index(uint32_t maxfiles) -{ - uint16_t hashtable[8]; - uint32_t i, n, index=0; - - do { - n = 8; - if (index + n > maxfiles) n = maxfiles - index; - SerialFlash.read(8 + index * 2, hashtable, n * 2); - for (i=0; i < n; i++) { - if (hashtable[i] == 0xFFFF) return index + i; - } - index += n; - } while (index < maxfiles); - return 0xFFFFFFFF; -} - -static uint32_t string_length(uint32_t addr) -{ - char buf[16]; - const char *p; - uint32_t len=0; - - while (1) { - SerialFlash.read(addr, buf, sizeof(buf)); - for (p=buf; p < buf + sizeof(buf); p++) { - len++; - if (*p == 0) return len; - } - addr += sizeof(buf); - } -} - -// uint32_t signature = 0xFA96554C; -// uint16_t maxfiles -// uint16_t stringssize // div by 4 -// uint16_t hashes[maxfiles] -// struct { -// uint32_t file_begin -// uint32_t file_length -// uint16_t string_index // div 4 -// } fileinfo[maxfiles] -// char strings[stringssize] - -bool SerialFlashChip::create(const char *filename, uint32_t length, uint32_t align) -{ - uint32_t maxfiles, stringsize; - uint32_t index, buf[3]; - uint32_t address, straddr, len; - SerialFlashFile file; - - // check if the file already exists - if (exists(filename)) return false; - - // first, get the filesystem parameters - maxfiles = check_signature(); - if (!maxfiles) return false; - stringsize = (maxfiles & 0xFFFF0000) >> 14; - maxfiles &= 0xFFFF; - - // find the first unused slot for this file - index = find_first_unallocated_file_index(maxfiles); - if (index >= maxfiles) return false; - //Serial.printf("index = %u\n", index); - // compute where to store the filename and actual data - straddr = 8 + maxfiles * 12; - if (index == 0) { - address = straddr + stringsize; - } else { - buf[2] = 0; - SerialFlash.read(8 + maxfiles * 2 + (index-1) * 10, buf, 10); - address = buf[0] + buf[1]; - straddr += buf[2] * 4; - straddr += string_length(straddr); - straddr = (straddr + 3) & 0x0003FFFC; - } - //Serial.printf("straddr = %u\n", straddr); - //Serial.printf("address = %u\n", address); - //Serial.printf("length = %u\n", length); - if (align > 0) { - // for files aligned to sectors, adjust addr & len - address += align - 1; - address /= align; - address *= align; - //Serial.printf("align address = %u\n", address); - length += align - 1; - length /= align; - length *= align; - //Serial.printf("align length = %u\n", length); - } else { - // always align every file to a page boundary - // for predictable write latency and to guarantee - // write suspend for reading another file can't - // conflict on the same page (2 files never share - // a write page). - address = (address + 255) & 0xFFFFFF00; - } - //Serial.printf("address = %u\n", address); - // last check, if enough space exists... - len = strlen(filename); - // TODO: check for enough string space for filename - - // 5 bytes, to allow for extra 2 bytes in Spansion device IDs - uint8_t id[5]; - SerialFlash.readID(id); - if (address + length > SerialFlash.capacity(id)) return false; - - SerialFlash.write(straddr, filename, len+1); - buf[0] = address; - buf[1] = length; - buf[2] = (straddr - (8 + maxfiles * 12)) / 4; - SerialFlash.write(8 + maxfiles * 2 + index * 10, buf, 10); - //Serial.printf(" write %u: ", 8 + maxfiles * 2 + index * 10); - //pbuf(buf, 10); - while (!SerialFlash.ready()) ; // TODO: timeout - - buf[0] = filename_hash(filename); - //Serial.printf("hash = %04X\n", buf[0]); - SerialFlash.write(8 + index * 2, buf, 2); - while (!SerialFlash.ready()) ; // TODO: timeout - return true; -} - -bool SerialFlashChip::readdir(char *filename, uint32_t strsize, uint32_t &filesize) -{ - uint32_t maxfiles, index, straddr; - uint32_t i, n; - uint32_t buf[2]; - uint16_t hash; - char str[16], *p=filename; - - filename[0] = 0; - maxfiles = check_signature(); - if (!maxfiles) return false; - maxfiles &= 0xFFFF; - index = dirindex; - while (1) { - if (index >= maxfiles) return false; - //Serial.printf("readdir, index = %u\n", index); - SerialFlash.read(8 + index * 2, &hash, 2); - if (hash != 0) break; - index++; // skip deleted entries - } - dirindex = index + 1; - buf[1] = 0; - SerialFlash.read(8 + 4 + maxfiles * 2 + index * 10, buf, 6); - if (buf[0] == 0xFFFFFFFF) return false; - filesize = buf[0]; - straddr = 8 + maxfiles * 12 + buf[1] * 4; - //Serial.printf(" length = %u\n", buf[0]); - //Serial.printf(" straddr = %u\n", straddr); - - while (strsize) { - n = strsize; - if (n > sizeof(str)) n = sizeof(str); - SerialFlash.read(straddr, str, n); - for (i=0; i < n; i++) { - *p++ = str[i]; - if (str[i] == 0) { - //Serial.printf(" name = %s\n", filename); - return true; - } - } - strsize -= n; - straddr += n; - } - *(p - 1) = 0; - //Serial.printf(" name(overflow) = %s\n", filename); - return true; -} - - -void SerialFlashFile::erase() -{ - uint32_t i, blocksize; - - blocksize = SerialFlash.blockSize(); - if (address & (blocksize - 1)) return; // must begin on a block boundary - if (length & (blocksize - 1)) return; // must be exact number of blocks - for (i=0; i < length; i += blocksize) { - SerialFlash.eraseBlock(address + i); - } -} - diff --git a/libraries/SerialFlash/examples/EraseEverything/EraseEverything.ino b/libraries/SerialFlash/examples/EraseEverything/EraseEverything.ino deleted file mode 100644 index d3b3f4d7..00000000 --- a/libraries/SerialFlash/examples/EraseEverything/EraseEverything.ino +++ /dev/null @@ -1,80 +0,0 @@ -//SerialFlash library API: https://github.com/PaulStoffregen/SerialFlash - -#include -#include - -const int FlashChipSelect = 21; // digital pin for flash chip CS pin - -SerialFlashFile file; - -const unsigned long testIncrement = 4096; - -void setup() { - //uncomment these if using Teensy audio shield - //SPI.setSCK(14); // Audio shield has SCK on pin 14 - //SPI.setMOSI(7); // Audio shield has MOSI on pin 7 - - //uncomment these if you have other SPI chips connected - //to keep them disabled while using only SerialFlash - //pinMode(4, INPUT_PULLUP); - //pinMode(10, INPUT_PULLUP); - - Serial.begin(9600); - - // wait up to 10 seconds for Arduino Serial Monitor - unsigned long startMillis = millis(); - while (!Serial && (millis() - startMillis < 10000)) ; - delay(100); - - SerialFlash.begin(FlashChipSelect); - unsigned char id[5]; - SerialFlash.readID(id); - unsigned long size = SerialFlash.capacity(id); - - if (size > 0) { - Serial.print("Flash Memory has "); - Serial.print(size); - Serial.println(" bytes."); - Serial.println("Erasing ALL Flash Memory:"); - // Estimate the (lengthy) wait time. - Serial.print(" estimated wait: "); - int seconds = (float)size / eraseBytesPerSecond(id) + 0.5; - Serial.print(seconds); - Serial.println(" seconds."); - Serial.println(" Yes, full chip erase is SLOW!"); - SerialFlash.eraseAll(); - unsigned long dotMillis = millis(); - unsigned char dotcount = 0; - while (SerialFlash.ready() == false) { - if (millis() - dotMillis > 1000) { - dotMillis = dotMillis + 1000; - Serial.print("."); - dotcount = dotcount + 1; - if (dotcount >= 60) { - Serial.println(); - dotcount = 0; - } - } - } - if (dotcount > 0) Serial.println(); - Serial.println("Erase completed"); - unsigned long elapsed = millis() - startMillis; - Serial.print(" actual wait: "); - Serial.print(elapsed / 1000ul); - Serial.println(" seconds."); - } -} - -float eraseBytesPerSecond(const unsigned char *id) { - if (id[0] == 0x20) return 152000.0; // Micron - if (id[0] == 0x01) return 500000.0; // Spansion - if (id[0] == 0xEF) return 419430.0; // Winbond - if (id[0] == 0xC2) return 279620.0; // Macronix - return 320000.0; // guess? -} - - -void loop() { - -} - diff --git a/libraries/SerialFlash/examples/FileWrite/FileWrite.ino b/libraries/SerialFlash/examples/FileWrite/FileWrite.ino deleted file mode 100755 index dbeb438a..00000000 --- a/libraries/SerialFlash/examples/FileWrite/FileWrite.ino +++ /dev/null @@ -1,50 +0,0 @@ -//SerialFlash library API: https://github.com/PaulStoffregen/SerialFlash - -#include -#include - -#define FSIZE 256 - -const char *filename = "myfile.txt"; -const char *contents = "0123456789ABCDEF"; - -const int FlashChipSelect = 21; // digital pin for flash chip CS pin - -void setup() { - Serial.begin(9600); - - // wait for Arduino Serial Monitor - while (!Serial) ; - delay(100); - - // Init. SPI Flash chip - if (!SerialFlash.begin(FlashChipSelect)) { - Serial.println("Unable to access SPI Flash chip"); - } - - SerialFlashFile file; - - // Create the file if it doesn't exist - if (!create_if_not_exists(filename)) { - Serial.println("Not enough space to create file " + String(filename)); - return; - } - - // Open the file and write test data - file = SerialFlash.open(filename); - file.write(contents, strlen(contents) + 1); - Serial.println("String \"" + String(contents) + "\" written to file " + String(filename)); -} - -bool create_if_not_exists (const char *filename) { - if (!SerialFlash.exists(filename)) { - Serial.println("Creating file " + String(filename)); - return SerialFlash.create(filename, FSIZE); - } - - Serial.println("File " + String(filename) + " already exists"); - return true; -} - -void loop() { -} diff --git a/libraries/SerialFlash/examples/ListFiles/ListFiles.ino b/libraries/SerialFlash/examples/ListFiles/ListFiles.ino deleted file mode 100644 index bc15b89b..00000000 --- a/libraries/SerialFlash/examples/ListFiles/ListFiles.ino +++ /dev/null @@ -1,63 +0,0 @@ -// SerialFlash library API: https://github.com/PaulStoffregen/SerialFlash - -#include -#include - -const int FlashChipSelect = 21; // digital pin for flash chip CS pin - -void setup() { - //uncomment these if using Teensy audio shield - //SPI.setSCK(14); // Audio shield has SCK on pin 14 - //SPI.setMOSI(7); // Audio shield has MOSI on pin 7 - - //uncomment these if you have other SPI chips connected - //to keep them disabled while using only SerialFlash - //pinMode(4, INPUT_PULLUP); - //pinMode(10, INPUT_PULLUP); - - Serial.begin(9600); - - // wait for Arduino Serial Monitor - while (!Serial) ; - delay(100); - Serial.println("All Files on SPI Flash chip:"); - - if (!SerialFlash.begin(FlashChipSelect)) { - error("Unable to access SPI Flash chip"); - } - - SerialFlash.opendir(); - unsigned int count = 0; - while (1) { - char filename[64]; - unsigned long filesize; - - if (SerialFlash.readdir(filename, sizeof(filename), filesize)) { - Serial.print(" "); - Serial.print(filename); - spaces(20 - strlen(filename)); - Serial.print(" "); - Serial.print(filesize); - Serial.print(" bytes"); - Serial.println(); - } else { - break; // no more files - } - } -} - -void spaces(int num) { - for (int i=0; i < num; i++) { - Serial.print(" "); - } -} - -void loop() { -} - -void error(const char *message) { - while (1) { - Serial.println(message); - delay(2500); - } -} diff --git a/libraries/SerialFlash/examples/RawHardwareTest/RawHardwareTest.ino b/libraries/SerialFlash/examples/RawHardwareTest/RawHardwareTest.ino deleted file mode 100644 index 74afa10a..00000000 --- a/libraries/SerialFlash/examples/RawHardwareTest/RawHardwareTest.ino +++ /dev/null @@ -1,502 +0,0 @@ -// SerialFlash library API: https://github.com/PaulStoffregen/SerialFlash -// -// RawHardwareTest - Check if a SPI Flash chip is compatible -// with SerialFlash by performing many read and write tests -// to its memory. -// -// The chip should be fully erased before running this test. -// Use the EraseEverything to do a (slow) full chip erase. -// -// Normally you should NOT access the flash memory directly, -// as this test program does. You should create files and -// read and write the files. File creation allocates space -// with program & erase boundaries within the chip, to allow -// reading from any other files while a file is busy writing -// or erasing (if created as erasable). -// -// If you discover an incompatible chip, please report it here: -// https://github.com/PaulStoffregen/SerialFlash/issues -// You MUST post the complete output of this program, and -// the exact part number and manufacturer of the chip. - - -#include -#include - -const int FlashChipSelect = 21; // digital pin for flash chip CS pin - -SerialFlashFile file; - -const unsigned long testIncrement = 4096; - -void setup() { - - //uncomment these if using Teensy audio shield - //SPI.setSCK(14); // Audio shield has SCK on pin 14 - //SPI.setMOSI(7); // Audio shield has MOSI on pin 7 - - //uncomment these if you have other SPI chips connected - //to keep them disabled while using only SerialFlash - //pinMode(4, INPUT_PULLUP); - //pinMode(10, INPUT_PULLUP); - - Serial.begin(9600); - - while (!Serial) ; - delay(100); - - Serial.println("Raw SerialFlash Hardware Test"); - SerialFlash.begin(FlashChipSelect); - - if (test()) { - Serial.println(); - Serial.println("All Tests Passed :-)"); - Serial.println(); - Serial.println("Test data was written to your chip. You must run"); - Serial.println("EraseEverything before using this chip for files."); - } else { - Serial.println(); - Serial.println("Tests Failed :{"); - Serial.println(); - Serial.println("The flash chip may be left in an improper state."); - Serial.println("You might need to power cycle to return to normal."); - } -} - - -bool test() { - unsigned char buf[256], sig[256], buf2[8]; - unsigned long address, count, chipsize, blocksize; - unsigned long usec; - bool first; - - // Read the chip identification - Serial.println(); - Serial.println("Read Chip Identification:"); - SerialFlash.readID(buf); - Serial.print(" JEDEC ID: "); - Serial.print(buf[0], HEX); - Serial.print(" "); - Serial.print(buf[1], HEX); - Serial.print(" "); - Serial.println(buf[2], HEX); - Serial.print(" Part Nummber: "); - Serial.println(id2chip(buf)); - Serial.print(" Memory Size: "); - chipsize = SerialFlash.capacity(buf); - Serial.print(chipsize); - Serial.println(" bytes"); - if (chipsize == 0) return false; - Serial.print(" Block Size: "); - blocksize = SerialFlash.blockSize(); - Serial.print(blocksize); - Serial.println(" bytes"); - - - // Read the entire chip. Every test location must be - // erased, or have a previously tested signature - Serial.println(); - Serial.println("Reading Chip..."); - memset(buf, 0, sizeof(buf)); - memset(sig, 0, sizeof(sig)); - memset(buf2, 0, sizeof(buf2)); - address = 0; - count = 0; - first = true; - while (address < chipsize) { - SerialFlash.read(address, buf, 8); - //Serial.print(" addr = "); - //Serial.print(address, HEX); - //Serial.print(", data = "); - //printbuf(buf, 8); - create_signature(address, sig); - if (is_erased(buf, 8) == false) { - if (equal_signatures(buf, sig) == false) { - Serial.print(" Previous data found at address "); - Serial.println(address); - Serial.println(" You must fully erase the chip before this test"); - Serial.print(" found this: "); - printbuf(buf, 8); - Serial.print(" correct: "); - printbuf(sig, 8); - return false; - } - } else { - count = count + 1; // number of blank signatures - } - if (first) { - address = address + (testIncrement - 8); - first = false; - } else { - address = address + 8; - first = true; - } - } - - - // Write any signatures that were blank on the original check - if (count > 0) { - Serial.println(); - Serial.print("Writing "); - Serial.print(count); - Serial.println(" signatures"); - memset(buf, 0, sizeof(buf)); - memset(sig, 0, sizeof(sig)); - memset(buf2, 0, sizeof(buf2)); - address = 0; - first = true; - while (address < chipsize) { - SerialFlash.read(address, buf, 8); - if (is_erased(buf, 8)) { - create_signature(address, sig); - //Serial.printf("write %08X: data: ", address); - //printbuf(sig, 8); - SerialFlash.write(address, sig, 8); - while (!SerialFlash.ready()) ; // wait - SerialFlash.read(address, buf, 8); - if (equal_signatures(buf, sig) == false) { - Serial.print(" error writing signature at "); - Serial.println(address); - Serial.print(" Read this: "); - printbuf(buf, 8); - Serial.print(" Expected: "); - printbuf(sig, 8); - return false; - } - } - if (first) { - address = address + (testIncrement - 8); - first = false; - } else { - address = address + 8; - first = true; - } - } - } else { - Serial.println(" all signatures present from prior tests"); - } - - - // Read all the signatures again, just to be sure - // checks prior writing didn't corrupt any other data - Serial.println(); - Serial.println("Double Checking All Signatures:"); - memset(buf, 0, sizeof(buf)); - memset(sig, 0, sizeof(sig)); - memset(buf2, 0, sizeof(buf2)); - count = 0; - address = 0; - first = true; - while (address < chipsize) { - SerialFlash.read(address, buf, 8); - create_signature(address, sig); - if (equal_signatures(buf, sig) == false) { - Serial.print(" error in signature at "); - Serial.println(address); - Serial.print(" Read this: "); - printbuf(buf, 8); - Serial.print(" Expected: "); - printbuf(sig, 8); - return false; - } - count = count + 1; - if (first) { - address = address + (testIncrement - 8); - first = false; - } else { - address = address + 8; - first = true; - } - } - Serial.print(" all "); - Serial.print(count); - Serial.println(" signatures read ok"); - - - // Read pairs of adjacent signatures - // check read works across boundaries - Serial.println(); - Serial.println("Checking Signature Pairs"); - memset(buf, 0, sizeof(buf)); - memset(sig, 0, sizeof(sig)); - memset(buf2, 0, sizeof(buf2)); - count = 0; - address = testIncrement - 8; - first = true; - while (address < chipsize - 8) { - SerialFlash.read(address, buf, 16); - create_signature(address, sig); - create_signature(address + 8, sig + 8); - if (memcmp(buf, sig, 16) != 0) { - Serial.print(" error in signature pair at "); - Serial.println(address); - Serial.print(" Read this: "); - printbuf(buf, 16); - Serial.print(" Expected: "); - printbuf(sig, 16); - return false; - } - count = count + 1; - address = address + testIncrement; - } - Serial.print(" all "); - Serial.print(count); - Serial.println(" signature pairs read ok"); - - - // Write data and read while write in progress - Serial.println(); - Serial.println("Checking Read-While-Write (Program Suspend)"); - address = 256; - while (address < chipsize) { // find a blank space - SerialFlash.read(address, buf, 256); - if (is_erased(buf, 256)) break; - address = address + 256; - } - if (address >= chipsize) { - Serial.println(" error, unable to find any blank space!"); - return false; - } - for (int i=0; i < 256; i += 8) { - create_signature(address + i, sig + i); - } - Serial.print(" write 256 bytes at "); - Serial.println(address); - Serial.flush(); - SerialFlash.write(address, sig, 256); - usec = micros(); - if (SerialFlash.ready()) { - Serial.println(" error, chip did not become busy after write"); - return false; - } - SerialFlash.read(0, buf2, 8); // read while busy writing - while (!SerialFlash.ready()) ; // wait - usec = micros() - usec; - Serial.print(" write time was "); - Serial.print(usec); - Serial.println(" microseconds."); - SerialFlash.read(address, buf, 256); - if (memcmp(buf, sig, 256) != 0) { - Serial.println(" error writing to flash"); - Serial.print(" Read this: "); - printbuf(buf, 256); - Serial.print(" Expected: "); - printbuf(sig, 256); - return false; - } - create_signature(0, sig); - if (memcmp(buf2, sig, 8) != 0) { - Serial.println(" error, incorrect read while writing"); - Serial.print(" Read this: "); - printbuf(buf2, 256); - Serial.print(" Expected: "); - printbuf(sig, 256); - return false; - } - Serial.print(" read-while-writing: "); - printbuf(buf2, 8); - Serial.println(" test passed, good read while writing"); - - - - // Erase a block and read while erase in progress - if (chipsize >= 262144 + blocksize + testIncrement) { - Serial.println(); - Serial.println("Checking Read-While-Erase (Erase Suspend)"); - memset(buf, 0, sizeof(buf)); - memset(sig, 0, sizeof(sig)); - memset(buf2, 0, sizeof(buf2)); - SerialFlash.eraseBlock(262144); - usec = micros(); - delayMicroseconds(50); - if (SerialFlash.ready()) { - Serial.println(" error, chip did not become busy after erase"); - return false; - } - SerialFlash.read(0, buf2, 8); // read while busy writing - while (!SerialFlash.ready()) ; // wait - usec = micros() - usec; - Serial.print(" erase time was "); - Serial.print(usec); - Serial.println(" microseconds."); - // read all signatures, check ones in this block got - // erased, and all the others are still intact - address = 0; - first = true; - while (address < chipsize) { - SerialFlash.read(address, buf, 8); - if (address >= 262144 && address < 262144 + blocksize) { - if (is_erased(buf, 8) == false) { - Serial.print(" error in erasing at "); - Serial.println(address); - Serial.print(" Read this: "); - printbuf(buf, 8); - return false; - } - } else { - create_signature(address, sig); - if (equal_signatures(buf, sig) == false) { - Serial.print(" error in signature at "); - Serial.println(address); - Serial.print(" Read this: "); - printbuf(buf, 8); - Serial.print(" Expected: "); - printbuf(sig, 8); - return false; - } - } - if (first) { - address = address + (testIncrement - 8); - first = false; - } else { - address = address + 8; - first = true; - } - } - Serial.print(" erase correctly erased "); - Serial.print(blocksize); - Serial.println(" bytes"); - // now check if the data we read during erase is good - create_signature(0, sig); - if (memcmp(buf2, sig, 8) != 0) { - Serial.println(" error, incorrect read while erasing"); - Serial.print(" Read this: "); - printbuf(buf2, 256); - Serial.print(" Expected: "); - printbuf(sig, 256); - return false; - } - Serial.print(" read-while-erasing: "); - printbuf(buf2, 8); - Serial.println(" test passed, good read while erasing"); - - } else { - Serial.println("Skip Read-While-Erase, this chip is too small"); - } - - - - - return true; -} - - -void loop() { - // do nothing after the test -} - -const char * id2chip(const unsigned char *id) -{ - if (id[0] == 0xEF) { - // Winbond - if (id[1] == 0x40) { - if (id[2] == 0x14) return "W25Q80BV"; - if (id[2] == 0x15) return "W25Q16DV"; - if (id[2] == 0x17) return "W25Q64FV"; - if (id[2] == 0x18) return "W25Q128FV"; - if (id[2] == 0x19) return "W25Q256FV"; - } - } - if (id[0] == 0x01) { - // Spansion - if (id[1] == 0x02) { - if (id[2] == 0x16) return "S25FL064A"; - if (id[2] == 0x19) return "S25FL256S"; - if (id[2] == 0x20) return "S25FL512S"; - } - if (id[1] == 0x20) { - if (id[2] == 0x18) return "S25FL127S"; - } - } - if (id[0] == 0xC2) { - // Macronix - if (id[1] == 0x20) { - if (id[2] == 0x18) return "MX25L12805D"; - } - } - if (id[0] == 0x20) { - // Micron - if (id[1] == 0xBA) { - if (id[2] == 0x20) return "N25Q512A"; - if (id[2] == 0x21) return "N25Q00AA"; - } - if (id[1] == 0xBB) { - if (id[2] == 0x22) return "MT25QL02GC"; - } - } - if (id[0] == 0xBF) { - // SST - if (id[1] == 0x25) { - if (id[2] == 0x02) return "SST25WF010"; - if (id[2] == 0x03) return "SST25WF020"; - if (id[2] == 0x04) return "SST25WF040"; - if (id[2] == 0x41) return "SST25VF016B"; - if (id[2] == 0x4A) return "SST25VF032"; - } - if (id[1] == 0x25) { - if (id[2] == 0x01) return "SST26VF016"; - if (id[2] == 0x02) return "SST26VF032"; - if (id[2] == 0x43) return "SST26VF064"; - } - } - return "(unknown chip)"; -} - -void print_signature(const unsigned char *data) -{ - Serial.print("data="); - for (unsigned char i=0; i < 8; i++) { - Serial.print(data[i]); - Serial.print(" "); - } - Serial.println(); -} - -void create_signature(unsigned long address, unsigned char *data) -{ - data[0] = address >> 24; - data[1] = address >> 16; - data[2] = address >> 8; - data[3] = address; - unsigned long hash = 2166136261ul; - for (unsigned char i=0; i < 4; i++) { - hash ^= data[i]; - hash *= 16777619ul; - } - data[4] = hash; - data[5] = hash >> 8; - data[6] = hash >> 16; - data[7] = hash >> 24; -} - -bool equal_signatures(const unsigned char *data1, const unsigned char *data2) -{ - for (unsigned char i=0; i < 8; i++) { - if (data1[i] != data2[i]) return false; - } - return true; -} - -bool is_erased(const unsigned char *data, unsigned int len) -{ - while (len > 0) { - if (*data++ != 255) return false; - len = len - 1; - } - return true; -} - - -void printbuf(const void *buf, uint32_t len) -{ - const uint8_t *p = (const uint8_t *)buf; - do { - unsigned char b = *p++; - Serial.print(b >> 4, HEX); - Serial.print(b & 15, HEX); - //Serial.printf("%02X", *p++); - Serial.print(" "); - } while (--len > 0); - Serial.println(); -} - diff --git a/libraries/SerialFlash/keywords.txt b/libraries/SerialFlash/keywords.txt deleted file mode 100644 index 1e473961..00000000 --- a/libraries/SerialFlash/keywords.txt +++ /dev/null @@ -1,9 +0,0 @@ -SerialFlash KEYWORD1 -SerialFlashFile KEYWORD1 -createWritable KEYWORD2 -erase KEYWORD2 -eraseAll KEYWORD2 -ready KEYWORD2 -create KEYWORD2 -createWritable KEYWORD2 -getAddress KEYWORD2 diff --git a/libraries/SerialFlash/util/SerialFlash_directwrite.h b/libraries/SerialFlash/util/SerialFlash_directwrite.h deleted file mode 100644 index d323a055..00000000 --- a/libraries/SerialFlash/util/SerialFlash_directwrite.h +++ /dev/null @@ -1,204 +0,0 @@ -#ifndef SerialFlash_directwrite_h -#define SerialFlash_directwrite_h - -#include - -// Adapted from OneWire.h - -#if ARDUINO >= 100 -#include "Arduino.h" // for delayMicroseconds, digitalPinToBitMask, etc -#else -#include "WProgram.h" // for delayMicroseconds -#include "pins_arduino.h" // for digitalPinToBitMask, etc -#endif - -// Platform specific I/O definitions - -#if defined(__AVR__) -#define PIN_TO_BASEREG(pin) (portInputRegister(digitalPinToPort(pin))) -#define PIN_TO_BITMASK(pin) (digitalPinToBitMask(pin)) -#define IO_REG_TYPE uint8_t -#define IO_REG_ASM asm("r30") -#define DIRECT_READ(base, mask) (((*(base)) & (mask)) ? 1 : 0) -#define DIRECT_MODE_INPUT(base, mask) ((*((base)+1)) &= ~(mask)) -#define DIRECT_MODE_OUTPUT(base, mask) ((*((base)+1)) |= (mask)) -#define DIRECT_WRITE_LOW(base, mask) ((*((base)+2)) &= ~(mask)) -#define DIRECT_WRITE_HIGH(base, mask) ((*((base)+2)) |= (mask)) - -#elif defined(__MK20DX128__) || defined(__MK20DX256__) || defined(__MK66FX1M0__) || defined(__MK64FX512__) -#define PIN_TO_BASEREG(pin) (portOutputRegister(pin)) -#define PIN_TO_BITMASK(pin) (1) -#define IO_REG_TYPE uint8_t -#define IO_REG_ASM -#define DIRECT_READ(base, mask) (*((base)+512)) -#define DIRECT_MODE_INPUT(base, mask) (*((base)+640) = 0) -#define DIRECT_MODE_OUTPUT(base, mask) (*((base)+640) = 1) -#define DIRECT_WRITE_LOW(base, mask) (*((base)+256) = 1) -#define DIRECT_WRITE_HIGH(base, mask) (*((base)+128) = 1) - -#elif defined(__MKL26Z64__) -#define PIN_TO_BASEREG(pin) (portOutputRegister(pin)) -#define PIN_TO_BITMASK(pin) (digitalPinToBitMask(pin)) -#define IO_REG_TYPE uint8_t -#define IO_REG_ASM -#define DIRECT_READ(base, mask) ((*((base)+16) & (mask)) ? 1 : 0) -#define DIRECT_MODE_INPUT(base, mask) (*((base)+20) &= ~(mask)) -#define DIRECT_MODE_OUTPUT(base, mask) (*((base)+20) |= (mask)) -#define DIRECT_WRITE_LOW(base, mask) (*((base)+8) = (mask)) -#define DIRECT_WRITE_HIGH(base, mask) (*((base)+4) = (mask)) - -#elif defined(__SAM3X8E__) -#define PIN_TO_BASEREG(pin) (&(digitalPinToPort(pin)->PIO_PER)) -#define PIN_TO_BITMASK(pin) (digitalPinToBitMask(pin)) -#define IO_REG_TYPE uint32_t -#define IO_REG_ASM -#define DIRECT_READ(base, mask) (((*((base)+15)) & (mask)) ? 1 : 0) -#define DIRECT_MODE_INPUT(base, mask) ((*((base)+5)) = (mask)) -#define DIRECT_MODE_OUTPUT(base, mask) ((*((base)+4)) = (mask)) -#define DIRECT_WRITE_LOW(base, mask) ((*((base)+13)) = (mask)) -#define DIRECT_WRITE_HIGH(base, mask) ((*((base)+12)) = (mask)) -#ifndef PROGMEM -#define PROGMEM -#endif -#ifndef pgm_read_byte -#define pgm_read_byte(addr) (*(const uint8_t *)(addr)) -#endif - -#elif defined(__PIC32MX__) -#define PIN_TO_BASEREG(pin) (portModeRegister(digitalPinToPort(pin))) -#define PIN_TO_BITMASK(pin) (digitalPinToBitMask(pin)) -#define IO_REG_TYPE uint32_t -#define IO_REG_ASM -#define DIRECT_READ(base, mask) (((*(base+4)) & (mask)) ? 1 : 0) //PORTX + 0x10 -#define DIRECT_MODE_INPUT(base, mask) ((*(base+2)) = (mask)) //TRISXSET + 0x08 -#define DIRECT_MODE_OUTPUT(base, mask) ((*(base+1)) = (mask)) //TRISXCLR + 0x04 -#define DIRECT_WRITE_LOW(base, mask) ((*(base+8+1)) = (mask)) //LATXCLR + 0x24 -#define DIRECT_WRITE_HIGH(base, mask) ((*(base+8+2)) = (mask)) //LATXSET + 0x28 - -#elif defined(ARDUINO_ARCH_ESP8266) -#define PIN_TO_BASEREG(pin) ((volatile uint32_t*) GPO) -#define PIN_TO_BITMASK(pin) (1 << pin) -#define IO_REG_TYPE uint32_t -#define IO_REG_ASM -#define DIRECT_READ(base, mask) ((GPI & (mask)) ? 1 : 0) //GPIO_IN_ADDRESS -#define DIRECT_MODE_INPUT(base, mask) (GPE &= ~(mask)) //GPIO_ENABLE_W1TC_ADDRESS -#define DIRECT_MODE_OUTPUT(base, mask) (GPE |= (mask)) //GPIO_ENABLE_W1TS_ADDRESS -#define DIRECT_WRITE_LOW(base, mask) (GPOC = (mask)) //GPIO_OUT_W1TC_ADDRESS -#define DIRECT_WRITE_HIGH(base, mask) (GPOS = (mask)) //GPIO_OUT_W1TS_ADDRESS - -#elif defined(__SAMD21G18A__) -#define PIN_TO_BASEREG(pin) portModeRegister(digitalPinToPort(pin)) -#define PIN_TO_BITMASK(pin) (digitalPinToBitMask(pin)) -#define IO_REG_TYPE uint32_t -#define IO_REG_ASM -#define DIRECT_READ(base, mask) (((*((base)+8)) & (mask)) ? 1 : 0) -#define DIRECT_MODE_INPUT(base, mask) ((*((base)+1)) = (mask)) -#define DIRECT_MODE_OUTPUT(base, mask) ((*((base)+2)) = (mask)) -#define DIRECT_WRITE_LOW(base, mask) ((*((base)+5)) = (mask)) -#define DIRECT_WRITE_HIGH(base, mask) ((*((base)+6)) = (mask)) - -#elif defined(RBL_NRF51822) -#define PIN_TO_BASEREG(pin) (0) -#define PIN_TO_BITMASK(pin) (pin) -#define IO_REG_TYPE uint32_t -#define IO_REG_ASM -#define DIRECT_READ(base, pin) nrf_gpio_pin_read(pin) -#define DIRECT_WRITE_LOW(base, pin) nrf_gpio_pin_clear(pin) -#define DIRECT_WRITE_HIGH(base, pin) nrf_gpio_pin_set(pin) -#define DIRECT_MODE_INPUT(base, pin) nrf_gpio_cfg_input(pin, NRF_GPIO_PIN_NOPULL) -#define DIRECT_MODE_OUTPUT(base, pin) nrf_gpio_cfg_output(pin) - -#elif defined(__arc__) /* Arduino101/Genuino101 specifics */ - -#include "scss_registers.h" -#include "portable.h" -#include "avr/pgmspace.h" - -#define GPIO_ID(pin) (g_APinDescription[pin].ulGPIOId) -#define GPIO_TYPE(pin) (g_APinDescription[pin].ulGPIOType) -#define GPIO_BASE(pin) (g_APinDescription[pin].ulGPIOBase) -#define DIR_OFFSET_SS 0x01 -#define DIR_OFFSET_SOC 0x04 -#define EXT_PORT_OFFSET_SS 0x0A -#define EXT_PORT_OFFSET_SOC 0x50 - -/* GPIO registers base address */ -#define PIN_TO_BASEREG(pin) ((volatile uint32_t *)g_APinDescription[pin].ulGPIOBase) -#define PIN_TO_BITMASK(pin) pin -#define IO_REG_TYPE uint32_t -#define IO_REG_ASM - -static inline __attribute__((always_inline)) -IO_REG_TYPE directRead(volatile IO_REG_TYPE *base, IO_REG_TYPE pin) -{ - IO_REG_TYPE ret; - if (SS_GPIO == GPIO_TYPE(pin)) { - ret = READ_ARC_REG(((IO_REG_TYPE)base + EXT_PORT_OFFSET_SS)); - } else { - ret = MMIO_REG_VAL_FROM_BASE((IO_REG_TYPE)base, EXT_PORT_OFFSET_SOC); - } - return ((ret >> GPIO_ID(pin)) & 0x01); -} - -static inline __attribute__((always_inline)) -void directModeInput(volatile IO_REG_TYPE *base, IO_REG_TYPE pin) -{ - if (SS_GPIO == GPIO_TYPE(pin)) { - WRITE_ARC_REG(READ_ARC_REG((((IO_REG_TYPE)base) + DIR_OFFSET_SS)) & ~(0x01 << GPIO_ID(pin)), - ((IO_REG_TYPE)(base) + DIR_OFFSET_SS)); - } else { - MMIO_REG_VAL_FROM_BASE((IO_REG_TYPE)base, DIR_OFFSET_SOC) &= ~(0x01 << GPIO_ID(pin)); - } -} - -static inline __attribute__((always_inline)) -void directModeOutput(volatile IO_REG_TYPE *base, IO_REG_TYPE pin) -{ - if (SS_GPIO == GPIO_TYPE(pin)) { - WRITE_ARC_REG(READ_ARC_REG(((IO_REG_TYPE)(base) + DIR_OFFSET_SS)) | (0x01 << GPIO_ID(pin)), - ((IO_REG_TYPE)(base) + DIR_OFFSET_SS)); - } else { - MMIO_REG_VAL_FROM_BASE((IO_REG_TYPE)base, DIR_OFFSET_SOC) |= (0x01 << GPIO_ID(pin)); - } -} - -static inline __attribute__((always_inline)) -void directWriteLow(volatile IO_REG_TYPE *base, IO_REG_TYPE pin) -{ - if (SS_GPIO == GPIO_TYPE(pin)) { - WRITE_ARC_REG(READ_ARC_REG(base) & ~(0x01 << GPIO_ID(pin)), base); - } else { - MMIO_REG_VAL(base) &= ~(0x01 << GPIO_ID(pin)); - } -} - -static inline __attribute__((always_inline)) -void directWriteHigh(volatile IO_REG_TYPE *base, IO_REG_TYPE pin) -{ - if (SS_GPIO == GPIO_TYPE(pin)) { - WRITE_ARC_REG(READ_ARC_REG(base) | (0x01 << GPIO_ID(pin)), base); - } else { - MMIO_REG_VAL(base) |= (0x01 << GPIO_ID(pin)); - } -} - -#define DIRECT_READ(base, pin) directRead(base, pin) -#define DIRECT_MODE_INPUT(base, pin) directModeInput(base, pin) -#define DIRECT_MODE_OUTPUT(base, pin) directModeOutput(base, pin) -#define DIRECT_WRITE_LOW(base, pin) directWriteLow(base, pin) -#define DIRECT_WRITE_HIGH(base, pin) directWriteHigh(base, pin) - -#else -#define PIN_TO_BASEREG(pin) (0) -#define PIN_TO_BITMASK(pin) (pin) -#define IO_REG_TYPE unsigned int -#define IO_REG_ASM -#define DIRECT_READ(base, pin) digitalRead(pin) -#define DIRECT_WRITE_LOW(base, pin) digitalWrite(pin, LOW) -#define DIRECT_WRITE_HIGH(base, pin) digitalWrite(pin, HIGH) -#define DIRECT_MODE_INPUT(base, pin) pinMode(pin,INPUT) -#define DIRECT_MODE_OUTPUT(base, pin) pinMode(pin,OUTPUT) - -#endif - -#endif From 1c643fb0f00ab5b42de55cdf9a8f835f53da930c Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Mon, 26 Sep 2016 12:39:31 +0200 Subject: [PATCH 27/91] Add CurieSerialFlash wrapper over SerialFlash library The examples declare the correct CS pin and use the overloaded begin() method, passing SPI1 as port The link in the last line of the header opens the library manager to allow easy import of the father library --- libraries/CurieSerialFlash/CurieSerialFlash.h | 4 + .../CopyFromSerial/CopyFromSerial.ino | 268 ++++++++++ .../EraseEverything/EraseEverything.ino | 80 +++ .../examples/FileWrite/FileWrite.ino | 50 ++ .../examples/ListFiles/ListFiles.ino | 63 +++ .../RawHardwareTest/RawHardwareTest.ino | 504 ++++++++++++++++++ 6 files changed, 969 insertions(+) create mode 100644 libraries/CurieSerialFlash/CurieSerialFlash.h create mode 100644 libraries/CurieSerialFlash/examples/CopyFromSerial/CopyFromSerial.ino create mode 100644 libraries/CurieSerialFlash/examples/EraseEverything/EraseEverything.ino create mode 100755 libraries/CurieSerialFlash/examples/FileWrite/FileWrite.ino create mode 100644 libraries/CurieSerialFlash/examples/ListFiles/ListFiles.ino create mode 100644 libraries/CurieSerialFlash/examples/RawHardwareTest/RawHardwareTest.ino diff --git a/libraries/CurieSerialFlash/CurieSerialFlash.h b/libraries/CurieSerialFlash/CurieSerialFlash.h new file mode 100644 index 00000000..47ce73d9 --- /dev/null +++ b/libraries/CurieSerialFlash/CurieSerialFlash.h @@ -0,0 +1,4 @@ +#if !defined (__arc__) +#error These examples only work with onboard SPI flash on Arduino/Genuino 101 board +#endif +#include "SerialFlash.h" diff --git a/libraries/CurieSerialFlash/examples/CopyFromSerial/CopyFromSerial.ino b/libraries/CurieSerialFlash/examples/CopyFromSerial/CopyFromSerial.ino new file mode 100644 index 00000000..3f3a9e4d --- /dev/null +++ b/libraries/CurieSerialFlash/examples/CopyFromSerial/CopyFromSerial.ino @@ -0,0 +1,268 @@ +/* + * This is free and unencumbered software released into the public domain. + * + * Anyone is free to copy, modify, publish, use, compile, sell, or + * distribute this software, either in source code form or as a compiled + * binary, for any purpose, commercial or non-commercial, and by any + * means. + * + * In jurisdictions that recognize copyright laws, the author or authors + * of this software dedicate any and all copyright interest in the + * software to the public domain. We make this dedication for the benefit + * of the public at large and to the detriment of our heirs and + * successors. We intend this dedication to be an overt act of + * relinquishment in perpetuity of all present and future rights to this + * software under copyright law. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * For more information, please refer to + * ------------------------------------------------------------------------- + * + * This is example code to 1) format an SPI Flash chip, and 2) copy raw + * audio files (mono channel, 16 bit signed, 44100Hz) to it using the + * SerialFlash library. The audio can then be played back using the + * AudioPlaySerialflashRaw object in the Teensy Audio library. + * + * To convert a .wav file to the proper .RAW format, use sox: + * sox input.wav -r 44100 -b 16 --norm -e signed-integer -t raw OUTPUT.RAW remix 1,2 + * + * Note that the OUTPUT.RAW filename must be all caps and contain only the following + * characters: A-Z, 0-9, comma, period, colon, dash, underscore. (The SerialFlash + * library converts filenames to caps, so to avoid confusion we just enforce it here). + * + * It is a little difficult to see what is happening; aswe are using the Serial port + * to upload files, we can't just throw out debug information. Instead, we use the LED + * (pin 13) to convey state. + * + * While the chip is being formatted, the LED (pin 13) will toggle at 1Hz rate. When + * the formatting is done, it flashes quickly (10Hz) for one second, then stays on + * solid. When nothing has been received for 3 seconds, the upload is assumed to be + * completed, and the light goes off. + * + * Use the 'rawfile-uploader.py' python script (included in the extras folder) to upload + * the files. You can start the script as soon as the Teensy is turned on, and the + * USB serial upload will just buffer and wait until the flash is formatted. + * + * This code was written by Wyatt Olson (originally as part + * of Drum Master http://drummaster.digitalcave.ca and later modified into a + * standalone sample). + * + * Enjoy! + * + * SerialFlash library API: https://github.com/PaulStoffregen/SerialFlash + * + * This example depens on http://librarymanager/all#SerialFlash&SPI (clickme!) + */ + +#include +#include + +//Buffer sizes +#define USB_BUFFER_SIZE 128 +#define FLASH_BUFFER_SIZE 4096 + +//Max filename length (8.3 plus a null char terminator) +#define FILENAME_STRING_SIZE 13 + +//State machine +#define STATE_START 0 +#define STATE_SIZE 1 +#define STATE_CONTENT 2 + +//Special bytes in the communication protocol +#define BYTE_START 0x7e +#define BYTE_ESCAPE 0x7d +#define BYTE_SEPARATOR 0x7c + +#define CSPIN 21 + +void setup(){ + Serial.begin(9600); //Teensy serial is always at full USB speed and buffered... the baud rate here is required but ignored + + pinMode(13, OUTPUT); + + SerialFlash.begin(SPI1, CSPIN); + + //We start by formatting the flash... + uint8_t id[5]; + SerialFlash.readID(id); + SerialFlash.eraseAll(); + + //Flash LED at 1Hz while formatting + while (!SerialFlash.ready()) { + delay(500); + digitalWrite(13, HIGH); + delay(500); + digitalWrite(13, LOW); + } + + //Quickly flash LED a few times when completed, then leave the light on solid + for(uint8_t i = 0; i < 10; i++){ + delay(100); + digitalWrite(13, HIGH); + delay(100); + digitalWrite(13, LOW); + } + digitalWrite(13, HIGH); + + //We are now going to wait for the upload program + while(!Serial.available()); + + SerialFlashFile flashFile; + + uint8_t state = STATE_START; + uint8_t escape = 0; + uint8_t fileSizeIndex = 0; + uint32_t fileSize = 0; + char filename[FILENAME_STRING_SIZE]; + + char usbBuffer[USB_BUFFER_SIZE]; + uint8_t flashBuffer[FLASH_BUFFER_SIZE]; + + uint16_t flashBufferIndex = 0; + uint8_t filenameIndex = 0; + + uint32_t lastReceiveTime = millis(); + + //We assume the serial receive part is finished when we have not received something for 3 seconds + while(Serial.available() || lastReceiveTime + 3000 > millis()){ + uint16_t available = Serial.readBytes(usbBuffer, USB_BUFFER_SIZE); + if (available){ + lastReceiveTime = millis(); + } + + for (uint16_t usbBufferIndex = 0; usbBufferIndex < available; usbBufferIndex++){ + uint8_t b = usbBuffer[usbBufferIndex]; + + if (state == STATE_START){ + //Start byte. Repeat start is fine. + if (b == BYTE_START){ + for (uint8_t i = 0; i < FILENAME_STRING_SIZE; i++){ + filename[i] = 0x00; + } + filenameIndex = 0; + } + //Valid characters are A-Z, 0-9, comma, period, colon, dash, underscore + else if ((b >= 'A' && b <= 'Z') || (b >= '0' && b <= '9') || b == '.' || b == ',' || b == ':' || b == '-' || b == '_'){ + filename[filenameIndex++] = b; + if (filenameIndex >= FILENAME_STRING_SIZE){ + //Error name too long + flushError(); + return; + } + } + //Filename end character + else if (b == BYTE_SEPARATOR){ + if (filenameIndex == 0){ + //Error empty filename + flushError(); + return; + } + + //Change state + state = STATE_SIZE; + fileSizeIndex = 0; + fileSize = 0; + + } + //Invalid character + else { + //Error bad filename + flushError(); + return; + } + } + //We read 4 bytes as a uint32_t for file size + else if (state == STATE_SIZE){ + if (fileSizeIndex < 4){ + fileSize = (fileSize << 8) + b; + fileSizeIndex++; + } + else if (b == BYTE_SEPARATOR){ + state = STATE_CONTENT; + flashBufferIndex = 0; + escape = 0; + + if (SerialFlash.exists(filename)){ + SerialFlash.remove(filename); //It doesn't reclaim the space, but it does let you create a new file with the same name. + } + + //Create a new file and open it for writing + if (SerialFlash.create(filename, fileSize)) { + flashFile = SerialFlash.open(filename); + if (!flashFile) { + //Error flash file open + flushError(); + return; + } + } + else { + //Error flash create (no room left?) + flushError(); + return; + } + } + else { + //Error invalid length requested + flushError(); + return; + } + } + else if (state == STATE_CONTENT){ + //Previous byte was escaped; unescape and add to buffer + if (escape){ + escape = 0; + flashBuffer[flashBufferIndex++] = b ^ 0x20; + } + //Escape the next byte + else if (b == BYTE_ESCAPE){ + //Serial.println("esc"); + escape = 1; + } + //End of file + else if (b == BYTE_START){ + //Serial.println("End of file"); + state = STATE_START; + flashFile.write(flashBuffer, flashBufferIndex); + flashFile.close(); + flashBufferIndex = 0; + } + //Normal byte; add to buffer + else { + flashBuffer[flashBufferIndex++] = b; + } + + //The buffer is filled; write to SD card + if (flashBufferIndex >= FLASH_BUFFER_SIZE){ + flashFile.write(flashBuffer, FLASH_BUFFER_SIZE); + flashBufferIndex = 0; + } + } + } + } + + //Success! Turn the light off. + digitalWrite(13, LOW); +} + +void loop(){ + //Do nothing. +} + +void flushError(){ + uint32_t lastReceiveTime = millis(); + char usbBuffer[USB_BUFFER_SIZE]; + //We assume the serial receive part is finished when we have not received something for 3 seconds + while(Serial.available() || lastReceiveTime + 3000 > millis()){ + if (Serial.readBytes(usbBuffer, USB_BUFFER_SIZE)){ + lastReceiveTime = millis(); + } + } +} diff --git a/libraries/CurieSerialFlash/examples/EraseEverything/EraseEverything.ino b/libraries/CurieSerialFlash/examples/EraseEverything/EraseEverything.ino new file mode 100644 index 00000000..b6d1ebc7 --- /dev/null +++ b/libraries/CurieSerialFlash/examples/EraseEverything/EraseEverything.ino @@ -0,0 +1,80 @@ +// This example depens on http://librarymanager/all#SerialFlash&SPI (clickme!) + +#include +#include + +const int FlashChipSelect = 21; // digital pin for flash chip CS pin + +SerialFlashFile file; + +const unsigned long testIncrement = 4096; + +void setup() { + //uncomment these if using Teensy audio shield + //SPI.setSCK(14); // Audio shield has SCK on pin 14 + //SPI.setMOSI(7); // Audio shield has MOSI on pin 7 + + //uncomment these if you have other SPI chips connected + //to keep them disabled while using only SerialFlash + //pinMode(4, INPUT_PULLUP); + //pinMode(10, INPUT_PULLUP); + + Serial.begin(9600); + + // wait up to 10 seconds for Arduino Serial Monitor + unsigned long startMillis = millis(); + while (!Serial && (millis() - startMillis < 10000)) ; + delay(100); + + SerialFlash.begin(SPI1, FlashChipSelect); + unsigned char id[5]; + SerialFlash.readID(id); + unsigned long size = SerialFlash.capacity(id); + + if (size > 0) { + Serial.print("Flash Memory has "); + Serial.print(size); + Serial.println(" bytes."); + Serial.println("Erasing ALL Flash Memory:"); + // Estimate the (lengthy) wait time. + Serial.print(" estimated wait: "); + int seconds = (float)size / eraseBytesPerSecond(id) + 0.5; + Serial.print(seconds); + Serial.println(" seconds."); + Serial.println(" Yes, full chip erase is SLOW!"); + SerialFlash.eraseAll(); + unsigned long dotMillis = millis(); + unsigned char dotcount = 0; + while (SerialFlash.ready() == false) { + if (millis() - dotMillis > 1000) { + dotMillis = dotMillis + 1000; + Serial.print("."); + dotcount = dotcount + 1; + if (dotcount >= 60) { + Serial.println(); + dotcount = 0; + } + } + } + if (dotcount > 0) Serial.println(); + Serial.println("Erase completed"); + unsigned long elapsed = millis() - startMillis; + Serial.print(" actual wait: "); + Serial.print(elapsed / 1000ul); + Serial.println(" seconds."); + } +} + +float eraseBytesPerSecond(const unsigned char *id) { + if (id[0] == 0x20) return 152000.0; // Micron + if (id[0] == 0x01) return 500000.0; // Spansion + if (id[0] == 0xEF) return 419430.0; // Winbond + if (id[0] == 0xC2) return 279620.0; // Macronix + return 320000.0; // guess? +} + + +void loop() { + +} + diff --git a/libraries/CurieSerialFlash/examples/FileWrite/FileWrite.ino b/libraries/CurieSerialFlash/examples/FileWrite/FileWrite.ino new file mode 100755 index 00000000..d87438b2 --- /dev/null +++ b/libraries/CurieSerialFlash/examples/FileWrite/FileWrite.ino @@ -0,0 +1,50 @@ +// This example depens on http://librarymanager/all#SerialFlash&SPI (clickme!) + +#include +#include + +#define FSIZE 256 + +const char *filename = "myfile.txt"; +const char *contents = "0123456789ABCDEF"; + +const int FlashChipSelect = 21; // digital pin for flash chip CS pin + +void setup() { + Serial.begin(9600); + + // wait for Arduino Serial Monitor + while (!Serial) ; + delay(100); + + // Init. SPI Flash chip + if (!SerialFlash.begin(SPI1, FlashChipSelect)) { + Serial.println("Unable to access SPI Flash chip"); + } + + SerialFlashFile file; + + // Create the file if it doesn't exist + if (!create_if_not_exists(filename)) { + Serial.println("Not enough space to create file " + String(filename)); + return; + } + + // Open the file and write test data + file = SerialFlash.open(filename); + file.write(contents, strlen(contents) + 1); + Serial.println("String \"" + String(contents) + "\" written to file " + String(filename)); +} + +bool create_if_not_exists (const char *filename) { + if (!SerialFlash.exists(filename)) { + Serial.println("Creating file " + String(filename)); + return SerialFlash.create(filename, FSIZE); + } + + Serial.println("File " + String(filename) + " already exists"); + return true; +} + +void loop() { +} diff --git a/libraries/CurieSerialFlash/examples/ListFiles/ListFiles.ino b/libraries/CurieSerialFlash/examples/ListFiles/ListFiles.ino new file mode 100644 index 00000000..9822aafe --- /dev/null +++ b/libraries/CurieSerialFlash/examples/ListFiles/ListFiles.ino @@ -0,0 +1,63 @@ +// This example depens on http://librarymanager/all#SerialFlash&SPI (clickme!) + +#include +#include + +const int FlashChipSelect = 21; // digital pin for flash chip CS pin + +void setup() { + //uncomment these if using Teensy audio shield + //SPI.setSCK(14); // Audio shield has SCK on pin 14 + //SPI.setMOSI(7); // Audio shield has MOSI on pin 7 + + //uncomment these if you have other SPI chips connected + //to keep them disabled while using only SerialFlash + //pinMode(4, INPUT_PULLUP); + //pinMode(10, INPUT_PULLUP); + + Serial.begin(9600); + + // wait for Arduino Serial Monitor + while (!Serial) ; + delay(100); + Serial.println("All Files on SPI Flash chip:"); + + if (!SerialFlash.begin(SPI1, FlashChipSelect)) { + error("Unable to access SPI Flash chip"); + } + + SerialFlash.opendir(); + unsigned int count = 0; + while (1) { + char filename[64]; + unsigned long filesize; + + if (SerialFlash.readdir(filename, sizeof(filename), filesize)) { + Serial.print(" "); + Serial.print(filename); + spaces(20 - strlen(filename)); + Serial.print(" "); + Serial.print(filesize); + Serial.print(" bytes"); + Serial.println(); + } else { + break; // no more files + } + } +} + +void spaces(int num) { + for (int i=0; i < num; i++) { + Serial.print(" "); + } +} + +void loop() { +} + +void error(const char *message) { + while (1) { + Serial.println(message); + delay(2500); + } +} diff --git a/libraries/CurieSerialFlash/examples/RawHardwareTest/RawHardwareTest.ino b/libraries/CurieSerialFlash/examples/RawHardwareTest/RawHardwareTest.ino new file mode 100644 index 00000000..f912c0a3 --- /dev/null +++ b/libraries/CurieSerialFlash/examples/RawHardwareTest/RawHardwareTest.ino @@ -0,0 +1,504 @@ +// SerialFlash library API: https://github.com/PaulStoffregen/SerialFlash +// +// RawHardwareTest - Check if a SPI Flash chip is compatible +// with SerialFlash by performing many read and write tests +// to its memory. +// +// The chip should be fully erased before running this test. +// Use the EraseEverything to do a (slow) full chip erase. +// +// Normally you should NOT access the flash memory directly, +// as this test program does. You should create files and +// read and write the files. File creation allocates space +// with program & erase boundaries within the chip, to allow +// reading from any other files while a file is busy writing +// or erasing (if created as erasable). +// +// If you discover an incompatible chip, please report it here: +// https://github.com/PaulStoffregen/SerialFlash/issues +// You MUST post the complete output of this program, and +// the exact part number and manufacturer of the chip. +// +// This example depens on http://librarymanager/all#SerialFlash&SPI (clickme!) + + +#include +#include + +const int FlashChipSelect = 21; // digital pin for flash chip CS pin + +SerialFlashFile file; + +const unsigned long testIncrement = 4096; + +void setup() { + + //uncomment these if using Teensy audio shield + //SPI.setSCK(14); // Audio shield has SCK on pin 14 + //SPI.setMOSI(7); // Audio shield has MOSI on pin 7 + + //uncomment these if you have other SPI chips connected + //to keep them disabled while using only SerialFlash + //pinMode(4, INPUT_PULLUP); + //pinMode(10, INPUT_PULLUP); + + Serial.begin(9600); + + while (!Serial) ; + delay(100); + + Serial.println("Raw SerialFlash Hardware Test"); + SerialFlash.begin(SPI1, FlashChipSelect); + + if (test()) { + Serial.println(); + Serial.println("All Tests Passed :-)"); + Serial.println(); + Serial.println("Test data was written to your chip. You must run"); + Serial.println("EraseEverything before using this chip for files."); + } else { + Serial.println(); + Serial.println("Tests Failed :{"); + Serial.println(); + Serial.println("The flash chip may be left in an improper state."); + Serial.println("You might need to power cycle to return to normal."); + } +} + + +bool test() { + unsigned char buf[256], sig[256], buf2[8]; + unsigned long address, count, chipsize, blocksize; + unsigned long usec; + bool first; + + // Read the chip identification + Serial.println(); + Serial.println("Read Chip Identification:"); + SerialFlash.readID(buf); + Serial.print(" JEDEC ID: "); + Serial.print(buf[0], HEX); + Serial.print(" "); + Serial.print(buf[1], HEX); + Serial.print(" "); + Serial.println(buf[2], HEX); + Serial.print(" Part Nummber: "); + Serial.println(id2chip(buf)); + Serial.print(" Memory Size: "); + chipsize = SerialFlash.capacity(buf); + Serial.print(chipsize); + Serial.println(" bytes"); + if (chipsize == 0) return false; + Serial.print(" Block Size: "); + blocksize = SerialFlash.blockSize(); + Serial.print(blocksize); + Serial.println(" bytes"); + + + // Read the entire chip. Every test location must be + // erased, or have a previously tested signature + Serial.println(); + Serial.println("Reading Chip..."); + memset(buf, 0, sizeof(buf)); + memset(sig, 0, sizeof(sig)); + memset(buf2, 0, sizeof(buf2)); + address = 0; + count = 0; + first = true; + while (address < chipsize) { + SerialFlash.read(address, buf, 8); + //Serial.print(" addr = "); + //Serial.print(address, HEX); + //Serial.print(", data = "); + //printbuf(buf, 8); + create_signature(address, sig); + if (is_erased(buf, 8) == false) { + if (equal_signatures(buf, sig) == false) { + Serial.print(" Previous data found at address "); + Serial.println(address); + Serial.println(" You must fully erase the chip before this test"); + Serial.print(" found this: "); + printbuf(buf, 8); + Serial.print(" correct: "); + printbuf(sig, 8); + return false; + } + } else { + count = count + 1; // number of blank signatures + } + if (first) { + address = address + (testIncrement - 8); + first = false; + } else { + address = address + 8; + first = true; + } + } + + + // Write any signatures that were blank on the original check + if (count > 0) { + Serial.println(); + Serial.print("Writing "); + Serial.print(count); + Serial.println(" signatures"); + memset(buf, 0, sizeof(buf)); + memset(sig, 0, sizeof(sig)); + memset(buf2, 0, sizeof(buf2)); + address = 0; + first = true; + while (address < chipsize) { + SerialFlash.read(address, buf, 8); + if (is_erased(buf, 8)) { + create_signature(address, sig); + //Serial.printf("write %08X: data: ", address); + //printbuf(sig, 8); + SerialFlash.write(address, sig, 8); + while (!SerialFlash.ready()) ; // wait + SerialFlash.read(address, buf, 8); + if (equal_signatures(buf, sig) == false) { + Serial.print(" error writing signature at "); + Serial.println(address); + Serial.print(" Read this: "); + printbuf(buf, 8); + Serial.print(" Expected: "); + printbuf(sig, 8); + return false; + } + } + if (first) { + address = address + (testIncrement - 8); + first = false; + } else { + address = address + 8; + first = true; + } + } + } else { + Serial.println(" all signatures present from prior tests"); + } + + + // Read all the signatures again, just to be sure + // checks prior writing didn't corrupt any other data + Serial.println(); + Serial.println("Double Checking All Signatures:"); + memset(buf, 0, sizeof(buf)); + memset(sig, 0, sizeof(sig)); + memset(buf2, 0, sizeof(buf2)); + count = 0; + address = 0; + first = true; + while (address < chipsize) { + SerialFlash.read(address, buf, 8); + create_signature(address, sig); + if (equal_signatures(buf, sig) == false) { + Serial.print(" error in signature at "); + Serial.println(address); + Serial.print(" Read this: "); + printbuf(buf, 8); + Serial.print(" Expected: "); + printbuf(sig, 8); + return false; + } + count = count + 1; + if (first) { + address = address + (testIncrement - 8); + first = false; + } else { + address = address + 8; + first = true; + } + } + Serial.print(" all "); + Serial.print(count); + Serial.println(" signatures read ok"); + + + // Read pairs of adjacent signatures + // check read works across boundaries + Serial.println(); + Serial.println("Checking Signature Pairs"); + memset(buf, 0, sizeof(buf)); + memset(sig, 0, sizeof(sig)); + memset(buf2, 0, sizeof(buf2)); + count = 0; + address = testIncrement - 8; + first = true; + while (address < chipsize - 8) { + SerialFlash.read(address, buf, 16); + create_signature(address, sig); + create_signature(address + 8, sig + 8); + if (memcmp(buf, sig, 16) != 0) { + Serial.print(" error in signature pair at "); + Serial.println(address); + Serial.print(" Read this: "); + printbuf(buf, 16); + Serial.print(" Expected: "); + printbuf(sig, 16); + return false; + } + count = count + 1; + address = address + testIncrement; + } + Serial.print(" all "); + Serial.print(count); + Serial.println(" signature pairs read ok"); + + + // Write data and read while write in progress + Serial.println(); + Serial.println("Checking Read-While-Write (Program Suspend)"); + address = 256; + while (address < chipsize) { // find a blank space + SerialFlash.read(address, buf, 256); + if (is_erased(buf, 256)) break; + address = address + 256; + } + if (address >= chipsize) { + Serial.println(" error, unable to find any blank space!"); + return false; + } + for (int i=0; i < 256; i += 8) { + create_signature(address + i, sig + i); + } + Serial.print(" write 256 bytes at "); + Serial.println(address); + Serial.flush(); + SerialFlash.write(address, sig, 256); + usec = micros(); + if (SerialFlash.ready()) { + Serial.println(" error, chip did not become busy after write"); + return false; + } + SerialFlash.read(0, buf2, 8); // read while busy writing + while (!SerialFlash.ready()) ; // wait + usec = micros() - usec; + Serial.print(" write time was "); + Serial.print(usec); + Serial.println(" microseconds."); + SerialFlash.read(address, buf, 256); + if (memcmp(buf, sig, 256) != 0) { + Serial.println(" error writing to flash"); + Serial.print(" Read this: "); + printbuf(buf, 256); + Serial.print(" Expected: "); + printbuf(sig, 256); + return false; + } + create_signature(0, sig); + if (memcmp(buf2, sig, 8) != 0) { + Serial.println(" error, incorrect read while writing"); + Serial.print(" Read this: "); + printbuf(buf2, 256); + Serial.print(" Expected: "); + printbuf(sig, 256); + return false; + } + Serial.print(" read-while-writing: "); + printbuf(buf2, 8); + Serial.println(" test passed, good read while writing"); + + + + // Erase a block and read while erase in progress + if (chipsize >= 262144 + blocksize + testIncrement) { + Serial.println(); + Serial.println("Checking Read-While-Erase (Erase Suspend)"); + memset(buf, 0, sizeof(buf)); + memset(sig, 0, sizeof(sig)); + memset(buf2, 0, sizeof(buf2)); + SerialFlash.eraseBlock(262144); + usec = micros(); + delayMicroseconds(50); + if (SerialFlash.ready()) { + Serial.println(" error, chip did not become busy after erase"); + return false; + } + SerialFlash.read(0, buf2, 8); // read while busy writing + while (!SerialFlash.ready()) ; // wait + usec = micros() - usec; + Serial.print(" erase time was "); + Serial.print(usec); + Serial.println(" microseconds."); + // read all signatures, check ones in this block got + // erased, and all the others are still intact + address = 0; + first = true; + while (address < chipsize) { + SerialFlash.read(address, buf, 8); + if (address >= 262144 && address < 262144 + blocksize) { + if (is_erased(buf, 8) == false) { + Serial.print(" error in erasing at "); + Serial.println(address); + Serial.print(" Read this: "); + printbuf(buf, 8); + return false; + } + } else { + create_signature(address, sig); + if (equal_signatures(buf, sig) == false) { + Serial.print(" error in signature at "); + Serial.println(address); + Serial.print(" Read this: "); + printbuf(buf, 8); + Serial.print(" Expected: "); + printbuf(sig, 8); + return false; + } + } + if (first) { + address = address + (testIncrement - 8); + first = false; + } else { + address = address + 8; + first = true; + } + } + Serial.print(" erase correctly erased "); + Serial.print(blocksize); + Serial.println(" bytes"); + // now check if the data we read during erase is good + create_signature(0, sig); + if (memcmp(buf2, sig, 8) != 0) { + Serial.println(" error, incorrect read while erasing"); + Serial.print(" Read this: "); + printbuf(buf2, 256); + Serial.print(" Expected: "); + printbuf(sig, 256); + return false; + } + Serial.print(" read-while-erasing: "); + printbuf(buf2, 8); + Serial.println(" test passed, good read while erasing"); + + } else { + Serial.println("Skip Read-While-Erase, this chip is too small"); + } + + + + + return true; +} + + +void loop() { + // do nothing after the test +} + +const char * id2chip(const unsigned char *id) +{ + if (id[0] == 0xEF) { + // Winbond + if (id[1] == 0x40) { + if (id[2] == 0x14) return "W25Q80BV"; + if (id[2] == 0x15) return "W25Q16DV"; + if (id[2] == 0x17) return "W25Q64FV"; + if (id[2] == 0x18) return "W25Q128FV"; + if (id[2] == 0x19) return "W25Q256FV"; + } + } + if (id[0] == 0x01) { + // Spansion + if (id[1] == 0x02) { + if (id[2] == 0x16) return "S25FL064A"; + if (id[2] == 0x19) return "S25FL256S"; + if (id[2] == 0x20) return "S25FL512S"; + } + if (id[1] == 0x20) { + if (id[2] == 0x18) return "S25FL127S"; + } + } + if (id[0] == 0xC2) { + // Macronix + if (id[1] == 0x20) { + if (id[2] == 0x18) return "MX25L12805D"; + } + } + if (id[0] == 0x20) { + // Micron + if (id[1] == 0xBA) { + if (id[2] == 0x20) return "N25Q512A"; + if (id[2] == 0x21) return "N25Q00AA"; + } + if (id[1] == 0xBB) { + if (id[2] == 0x22) return "MT25QL02GC"; + } + } + if (id[0] == 0xBF) { + // SST + if (id[1] == 0x25) { + if (id[2] == 0x02) return "SST25WF010"; + if (id[2] == 0x03) return "SST25WF020"; + if (id[2] == 0x04) return "SST25WF040"; + if (id[2] == 0x41) return "SST25VF016B"; + if (id[2] == 0x4A) return "SST25VF032"; + } + if (id[1] == 0x25) { + if (id[2] == 0x01) return "SST26VF016"; + if (id[2] == 0x02) return "SST26VF032"; + if (id[2] == 0x43) return "SST26VF064"; + } + } + return "(unknown chip)"; +} + +void print_signature(const unsigned char *data) +{ + Serial.print("data="); + for (unsigned char i=0; i < 8; i++) { + Serial.print(data[i]); + Serial.print(" "); + } + Serial.println(); +} + +void create_signature(unsigned long address, unsigned char *data) +{ + data[0] = address >> 24; + data[1] = address >> 16; + data[2] = address >> 8; + data[3] = address; + unsigned long hash = 2166136261ul; + for (unsigned char i=0; i < 4; i++) { + hash ^= data[i]; + hash *= 16777619ul; + } + data[4] = hash; + data[5] = hash >> 8; + data[6] = hash >> 16; + data[7] = hash >> 24; +} + +bool equal_signatures(const unsigned char *data1, const unsigned char *data2) +{ + for (unsigned char i=0; i < 8; i++) { + if (data1[i] != data2[i]) return false; + } + return true; +} + +bool is_erased(const unsigned char *data, unsigned int len) +{ + while (len > 0) { + if (*data++ != 255) return false; + len = len - 1; + } + return true; +} + + +void printbuf(const void *buf, uint32_t len) +{ + const uint8_t *p = (const uint8_t *)buf; + do { + unsigned char b = *p++; + Serial.print(b >> 4, HEX); + Serial.print(b & 15, HEX); + //Serial.printf("%02X", *p++); + Serial.print(" "); + } while (--len > 0); + Serial.println(); +} + From 057b9a1271f3ccdfc5b8ef5144f754e75a30650e Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Tue, 4 Oct 2016 15:05:39 +0200 Subject: [PATCH 28/91] Make onboard flash port and cs pin explicit --- .../examples/CopyFromSerial/CopyFromSerial.ino | 4 +--- .../examples/EraseEverything/EraseEverything.ino | 4 +--- libraries/CurieSerialFlash/examples/FileWrite/FileWrite.ino | 4 +--- libraries/CurieSerialFlash/examples/ListFiles/ListFiles.ino | 4 +--- .../examples/RawHardwareTest/RawHardwareTest.ino | 4 +--- variants/arduino_101/variant.h | 6 ++++++ 6 files changed, 11 insertions(+), 15 deletions(-) diff --git a/libraries/CurieSerialFlash/examples/CopyFromSerial/CopyFromSerial.ino b/libraries/CurieSerialFlash/examples/CopyFromSerial/CopyFromSerial.ino index 3f3a9e4d..85723894 100644 --- a/libraries/CurieSerialFlash/examples/CopyFromSerial/CopyFromSerial.ino +++ b/libraries/CurieSerialFlash/examples/CopyFromSerial/CopyFromSerial.ino @@ -81,14 +81,12 @@ #define BYTE_ESCAPE 0x7d #define BYTE_SEPARATOR 0x7c -#define CSPIN 21 - void setup(){ Serial.begin(9600); //Teensy serial is always at full USB speed and buffered... the baud rate here is required but ignored pinMode(13, OUTPUT); - SerialFlash.begin(SPI1, CSPIN); + SerialFlash.begin(ONBOARD_FLASH_SPI_PORT, ONBOARD_FLASH_CS_PIN); //We start by formatting the flash... uint8_t id[5]; diff --git a/libraries/CurieSerialFlash/examples/EraseEverything/EraseEverything.ino b/libraries/CurieSerialFlash/examples/EraseEverything/EraseEverything.ino index b6d1ebc7..c79bf5fa 100644 --- a/libraries/CurieSerialFlash/examples/EraseEverything/EraseEverything.ino +++ b/libraries/CurieSerialFlash/examples/EraseEverything/EraseEverything.ino @@ -3,8 +3,6 @@ #include #include -const int FlashChipSelect = 21; // digital pin for flash chip CS pin - SerialFlashFile file; const unsigned long testIncrement = 4096; @@ -26,7 +24,7 @@ void setup() { while (!Serial && (millis() - startMillis < 10000)) ; delay(100); - SerialFlash.begin(SPI1, FlashChipSelect); + SerialFlash.begin(ONBOARD_FLASH_SPI_PORT, ONBOARD_FLASH_CS_PIN); unsigned char id[5]; SerialFlash.readID(id); unsigned long size = SerialFlash.capacity(id); diff --git a/libraries/CurieSerialFlash/examples/FileWrite/FileWrite.ino b/libraries/CurieSerialFlash/examples/FileWrite/FileWrite.ino index d87438b2..3e10bc84 100755 --- a/libraries/CurieSerialFlash/examples/FileWrite/FileWrite.ino +++ b/libraries/CurieSerialFlash/examples/FileWrite/FileWrite.ino @@ -8,8 +8,6 @@ const char *filename = "myfile.txt"; const char *contents = "0123456789ABCDEF"; -const int FlashChipSelect = 21; // digital pin for flash chip CS pin - void setup() { Serial.begin(9600); @@ -18,7 +16,7 @@ void setup() { delay(100); // Init. SPI Flash chip - if (!SerialFlash.begin(SPI1, FlashChipSelect)) { + if (!SerialFlash.begin(ONBOARD_FLASH_SPI_PORT, ONBOARD_FLASH_CS_PIN)) { Serial.println("Unable to access SPI Flash chip"); } diff --git a/libraries/CurieSerialFlash/examples/ListFiles/ListFiles.ino b/libraries/CurieSerialFlash/examples/ListFiles/ListFiles.ino index 9822aafe..21888537 100644 --- a/libraries/CurieSerialFlash/examples/ListFiles/ListFiles.ino +++ b/libraries/CurieSerialFlash/examples/ListFiles/ListFiles.ino @@ -3,8 +3,6 @@ #include #include -const int FlashChipSelect = 21; // digital pin for flash chip CS pin - void setup() { //uncomment these if using Teensy audio shield //SPI.setSCK(14); // Audio shield has SCK on pin 14 @@ -22,7 +20,7 @@ void setup() { delay(100); Serial.println("All Files on SPI Flash chip:"); - if (!SerialFlash.begin(SPI1, FlashChipSelect)) { + if (!SerialFlash.begin(ONBOARD_FLASH_SPI_PORT, ONBOARD_FLASH_CS_PIN)) { error("Unable to access SPI Flash chip"); } diff --git a/libraries/CurieSerialFlash/examples/RawHardwareTest/RawHardwareTest.ino b/libraries/CurieSerialFlash/examples/RawHardwareTest/RawHardwareTest.ino index f912c0a3..453bb123 100644 --- a/libraries/CurieSerialFlash/examples/RawHardwareTest/RawHardwareTest.ino +++ b/libraries/CurieSerialFlash/examples/RawHardwareTest/RawHardwareTest.ino @@ -25,8 +25,6 @@ #include #include -const int FlashChipSelect = 21; // digital pin for flash chip CS pin - SerialFlashFile file; const unsigned long testIncrement = 4096; @@ -48,7 +46,7 @@ void setup() { delay(100); Serial.println("Raw SerialFlash Hardware Test"); - SerialFlash.begin(SPI1, FlashChipSelect); + SerialFlash.begin(ONBOARD_FLASH_SPI_PORT, ONBOARD_FLASH_CS_PIN); if (test()) { Serial.println(); diff --git a/variants/arduino_101/variant.h b/variants/arduino_101/variant.h index 4ee93f05..2736252f 100644 --- a/variants/arduino_101/variant.h +++ b/variants/arduino_101/variant.h @@ -113,6 +113,12 @@ extern "C"{ * ADC */ +/* + * ONBOARD SPI FLASH + */ +#define ONBOARD_FLASH_SPI_PORT SPI1 +#define ONBOARD_FLASH_CS_PIN 21 + /* EAI ADC device registers */ #define ADC_SET (0x80015000) #define ADC_DIVSEQSTAT (0x80015001) From d5bce042321f2fe10ddf87044d7016aad87a9558 Mon Sep 17 00:00:00 2001 From: lianggao Date: Mon, 20 Feb 2017 09:37:36 +0800 Subject: [PATCH 29/91] Jira 858, Can't trigger BLEConnected, BLEDisconnected events, git 445 Root casue: - The callback regiter before the begin and the begin reset the callback. Code mods: 1. BLEPeripheral.cpp: - Remove clearing of callback register array at begin(). The array is cleared upon system initialization. --- libraries/CurieBLE/src/BLEPeripheral.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/CurieBLE/src/BLEPeripheral.cpp b/libraries/CurieBLE/src/BLEPeripheral.cpp index 9fa572e2..2bcee466 100644 --- a/libraries/CurieBLE/src/BLEPeripheral.cpp +++ b/libraries/CurieBLE/src/BLEPeripheral.cpp @@ -155,7 +155,6 @@ void BLEPeripheral::init() if (!_initCalled) { BLE.begin(); - memset(m_eventHandlers, 0, sizeof(m_eventHandlers)); _initCalled = true; } } From d818a3a5fa1ede20004487ffc5c95e6008b59a8d Mon Sep 17 00:00:00 2001 From: lianggao Date: Wed, 15 Feb 2017 15:26:45 +0800 Subject: [PATCH 30/91] Jira 793 Support Characteristic UUID that is not subset of Service, git 384 Root cause: - Nordic stack does not return long UUID for Characteristic discovery. It is expecting Characteristic UUID is a subset of the Service UUID (eg. a sequential increament of the Service UUID). - In order for the Central mode (to behave like Apple) to discover long Characteristic UUID, the process is now done in two steps (similar to the Service discovery). First, initiate a read of the Characteristic and then discover the long UUID upon successful read. Code Mods: 1. BLECallbacks.cpp: - Added a call back to handle the read Characteristic completion event. 2. BLECallbacks.h: - Prototyping. 3. BLEProfileManager.cpp: - Added getServiceBySubHandle() to enable the call back to locate the Service of a discovered Characteristic. 4. BLEProfileManager.h: - Prototyping. 5. BLEServiceImp.cpp: - This is where the two steps Characteristic discovery is implemented. At discoverAttributes(), reading of Characteristic is first initiated. When the stack completes the operation, extract the UUID thereafter. - To support this two steps process, additional functions, discoverNextCharacteristic and readCharacteristic, are added. 6. BLEServiceImp.h: - Prototyping. - Change the discover process. - Add read operation after discover returned invalid UUID. --- .../CurieBLE/src/internal/BLECallbacks.cpp | 17 ++ .../CurieBLE/src/internal/BLECallbacks.h | 5 + .../src/internal/BLEProfileManager.cpp | 34 +++ .../CurieBLE/src/internal/BLEProfileManager.h | 1 + .../CurieBLE/src/internal/BLEServiceImp.cpp | 200 ++++++++++++++---- .../CurieBLE/src/internal/BLEServiceImp.h | 16 ++ 6 files changed, 234 insertions(+), 39 deletions(-) diff --git a/libraries/CurieBLE/src/internal/BLECallbacks.cpp b/libraries/CurieBLE/src/internal/BLECallbacks.cpp index be86552c..ee89e916 100644 --- a/libraries/CurieBLE/src/internal/BLECallbacks.cpp +++ b/libraries/CurieBLE/src/internal/BLECallbacks.cpp @@ -172,6 +172,23 @@ uint8_t profile_service_read_rsp_process(bt_conn_t *conn, return ret; } +uint8_t profile_characteristic_read_rsp_process(bt_conn_t *conn, + int err, + bt_gatt_read_params_t *params, + const void *data, + uint16_t length) +{ + BLEDevice bleDevice(bt_conn_get_dst(conn)); + BLEServiceImp* service_imp = BLEProfileManager::instance()->getServiceBySubHandle(bleDevice, params->single.handle); + + uint8_t ret = service_imp->characteristicReadRspProc(conn, + err, + params, + data, + length); + pr_debug(LOG_MODULE_BLE, "%s-%d:ret-%d", __FUNCTION__, __LINE__, ret); + return ret; +} void bleConnectEventHandler(bt_conn_t *conn, diff --git a/libraries/CurieBLE/src/internal/BLECallbacks.h b/libraries/CurieBLE/src/internal/BLECallbacks.h index 213bd794..7eefaaa6 100644 --- a/libraries/CurieBLE/src/internal/BLECallbacks.h +++ b/libraries/CurieBLE/src/internal/BLECallbacks.h @@ -76,6 +76,11 @@ uint8_t profile_service_read_rsp_process(bt_conn_t *conn, void ble_on_write_no_rsp_complete(struct bt_conn *conn, uint8_t err, const void *data); +uint8_t profile_characteristic_read_rsp_process(bt_conn_t *conn, + int err, + bt_gatt_read_params_t *params, + const void *data, + uint16_t length); #endif diff --git a/libraries/CurieBLE/src/internal/BLEProfileManager.cpp b/libraries/CurieBLE/src/internal/BLEProfileManager.cpp index df34c996..8dd33244 100644 --- a/libraries/CurieBLE/src/internal/BLEProfileManager.cpp +++ b/libraries/CurieBLE/src/internal/BLEProfileManager.cpp @@ -507,6 +507,40 @@ BLEServiceImp* BLEProfileManager::service(const BLEDevice &bledevice, int index) return serviceImp; } +BLEServiceImp* BLEProfileManager::getServiceBySubHandle(const BLEDevice &bledevice, uint16_t handle) const +{ + BLEServiceImp* serviceImp = NULL; + uint16_t start_handle; + uint16_t end_handle; + + const BLEServiceLinkNodeHeader* serviceHeader = getServiceHeader(bledevice); + if (NULL == serviceHeader) + { + // Doesn't find the service + return NULL; + } + BLEServiceNodePtr node = serviceHeader->next; + + while (node != NULL) + { + serviceImp = node->value; + start_handle = serviceImp->startHandle(); + end_handle = serviceImp->endHandle(); + if (handle >= start_handle && handle <= end_handle) + { + break; + } + node = node->next; + } + + if (NULL == node) + { + serviceImp = NULL; + } + + return serviceImp; +} + void BLEProfileManager::handleConnectedEvent(const bt_addr_le_t* deviceAddr) { int index = getUnusedIndex(); diff --git a/libraries/CurieBLE/src/internal/BLEProfileManager.h b/libraries/CurieBLE/src/internal/BLEProfileManager.h index 02c42c9c..a83ba431 100644 --- a/libraries/CurieBLE/src/internal/BLEProfileManager.h +++ b/libraries/CurieBLE/src/internal/BLEProfileManager.h @@ -98,6 +98,7 @@ class BLEProfileManager{ BLEServiceImp* service(const BLEDevice &bledevice, const char * uuid) const; BLEServiceImp* service(const BLEDevice &bledevice, int index) const; BLEServiceImp* service(const BLEDevice &bledevice, const bt_uuid_t* uuid) const; + BLEServiceImp* getServiceBySubHandle(const BLEDevice &bledevice, uint16_t handle) const; int serviceCount(const BLEDevice &bledevice) const; int characteristicCount(const BLEDevice &bledevice) const; diff --git a/libraries/CurieBLE/src/internal/BLEServiceImp.cpp b/libraries/CurieBLE/src/internal/BLEServiceImp.cpp index 4f4d3dc1..ba479b90 100644 --- a/libraries/CurieBLE/src/internal/BLEServiceImp.cpp +++ b/libraries/CurieBLE/src/internal/BLEServiceImp.cpp @@ -26,6 +26,7 @@ #include "BLECharacteristicImp.h" bt_uuid_16_t BLEServiceImp::_gatt_primary_uuid = {BT_UUID_TYPE_16, BT_UUID_GATT_PRIMARY_VAL}; +bt_gatt_read_params_t BLEServiceImp::_read_params; bt_uuid_t *BLEServiceImp::getPrimayUuid(void) { @@ -36,6 +37,7 @@ BLEServiceImp::BLEServiceImp(BLEService& service): BLEAttribute(service.uuid(), BLETypeService), _start_handle(0), _end_handle(0xFFFF), + _reading(false), _cur_discover_chrc(NULL) { memset(&_characteristics_header, 0, sizeof(_characteristics_header)); @@ -46,6 +48,7 @@ BLEServiceImp::BLEServiceImp(const bt_uuid_t* uuid): BLEAttribute(uuid, BLETypeService), _start_handle(0), _end_handle(0xFFFF), + _reading(false), _cur_discover_chrc(NULL) { memset(&_characteristics_header, 0, sizeof(_characteristics_header)); @@ -242,10 +245,17 @@ BLECharacteristicImp* BLEServiceImp::characteristic(const char* uuid) bool BLEServiceImp::discovering() { - return (_cur_discover_chrc != NULL); + return (_cur_discover_chrc != NULL || _reading); } bool BLEServiceImp::discoverAttributes(BLEDevice* device) +{ + return discoverAttributes(device, _start_handle, _end_handle); +} + +bool BLEServiceImp::discoverAttributes(BLEDevice* device, + uint16_t start_handle, + uint16_t end_handle) { pr_debug(LOG_MODULE_BLE, "%s-%d", __FUNCTION__, __LINE__); int err; @@ -273,8 +283,8 @@ bool BLEServiceImp::discoverAttributes(BLEDevice* device) return false; } temp = &_discover_params; - temp->start_handle = _start_handle; - temp->end_handle = _end_handle; + temp->start_handle = start_handle; + temp->end_handle = end_handle; temp->uuid = NULL; temp->type = BT_GATT_DISCOVER_CHARACTERISTIC; temp->func = profile_discover_process; @@ -309,21 +319,34 @@ uint8_t BLEServiceImp::discoverResponseProc(bt_conn_t *conn, //const bt_uuid_t* chrc_uuid = attr->uuid; uint16_t chrc_handle = attr->handle + 1; struct bt_gatt_chrc* psttemp = (struct bt_gatt_chrc*)attr->user_data; - int retval = (int)addCharacteristic(device, - psttemp->uuid, - chrc_handle, - psttemp->properties); + const bt_uuid_t* chrc_uuid = psttemp->uuid; - //pr_debug(LOG_MODULE_BLE, "%s-%d:handle-%d:%d", __FUNCTION__, __LINE__,attr->handle, chrc_handle); - if (BLE_STATUS_SUCCESS != retval) + uint16_t le16; + memcpy(&le16, &BT_UUID_16(chrc_uuid)->val, sizeof(le16)); + if (chrc_uuid->type == BT_UUID_TYPE_16 && + le16 == 0) { - pr_error(LOG_MODULE_BLE, "%s-%d: Error-%d", - __FUNCTION__, __LINE__, retval); - errno = ENOMEM; + // Read the UUID + readCharacteristic(device, chrc_handle); + retVal = BT_GATT_ITER_CONTINUE; } else { - retVal = BT_GATT_ITER_CONTINUE; + int retval = (int)addCharacteristic(device, + psttemp->uuid, + chrc_handle, + psttemp->properties); + + if (BLE_STATUS_SUCCESS != retval) + { + pr_error(LOG_MODULE_BLE, "%s-%d: Error-%d", + __FUNCTION__, __LINE__, retval); + errno = ENOMEM; + } + else + { + retVal = BT_GATT_ITER_CONTINUE; + } } } break; @@ -335,8 +358,8 @@ uint8_t BLEServiceImp::discoverResponseProc(bt_conn_t *conn, if (NULL != _cur_discover_chrc) { retVal = _cur_discover_chrc->discoverResponseProc(conn, - attr, - params); + attr, + params); } break; } @@ -347,7 +370,7 @@ uint8_t BLEServiceImp::discoverResponseProc(bt_conn_t *conn, } } - pr_debug(LOG_MODULE_BLE, "%s-%d:ret-%d",__FUNCTION__, __LINE__, retVal); + //pr_debug(LOG_MODULE_BLE, "%s-%d:ret-%d",__FUNCTION__, __LINE__, retVal); if (retVal == BT_GATT_ITER_STOP) { if (errno == ENOMEM) @@ -355,36 +378,135 @@ uint8_t BLEServiceImp::discoverResponseProc(bt_conn_t *conn, _cur_discover_chrc = NULL; return retVal; } - const BLECharacteristicLinkNodeHeader* chrcHeader = &_characteristics_header; - BLECharacteristicImp* chrcCurImp = NULL; - BLECharacteristicNodePtr node = chrcHeader->next; - pr_debug(LOG_MODULE_BLE, "%s-%d: node-%p",__FUNCTION__, __LINE__, node); - // Discover next service - while (node != NULL) + if (false == _reading) { - chrcCurImp = node->value; - - if (NULL == _cur_discover_chrc) + discoverNextCharacteristic(device); + } + } + return retVal; +} + +void BLEServiceImp::discoverNextCharacteristic(BLEDevice &bledevice) +{ + const BLECharacteristicLinkNodeHeader* chrcHeader = &_characteristics_header; + BLECharacteristicImp* chrcCurImp = NULL; + BLECharacteristicNodePtr node = chrcHeader->next; + + //pr_debug(LOG_MODULE_BLE, "%s-%d: node-%p",__FUNCTION__, __LINE__, node); + // Discover next service + while (node != NULL) + { + chrcCurImp = node->value; + + if (NULL == _cur_discover_chrc) + { + bool result = chrcCurImp->discoverAttributes(&bledevice); + pr_debug(LOG_MODULE_BLE, "%s-%d",__FUNCTION__, __LINE__); + if (result == true) { - bool result = chrcCurImp->discoverAttributes(&device); - pr_debug(LOG_MODULE_BLE, "%s-%d",__FUNCTION__, __LINE__); - if (result == true) - { - // Record the current discovering service - _cur_discover_chrc = chrcCurImp; - break; - } + // Record the current discovering service + _cur_discover_chrc = chrcCurImp; + break; } - else if (_cur_discover_chrc == chrcCurImp) + } + else if (_cur_discover_chrc == chrcCurImp) + { + // Find next discoverable service + _cur_discover_chrc = NULL; + } + node = node->next; + } +} + +bool BLEServiceImp::readCharacteristic(const BLEDevice &bledevice, uint16_t handle) +{ + int retval = 0; + bt_conn_t* conn = NULL; + + if (true == BLEUtils::isLocalBLE(bledevice)) + { + // GATT server can't write + return false; + } + + if (_reading) + { + return false; + } + + _read_params.func = profile_characteristic_read_rsp_process; + _read_params.handle_count = 1; + _read_params.single.handle = handle - 1; + _read_params.single.offset = 0; + + if (0 == _read_params.single.handle) + { + // Discover not complete + return false; + } + + conn = bt_conn_lookup_addr_le(bledevice.bt_le_address()); + if (NULL == conn) + { + return false; + } + // Send read request + retval = bt_gatt_read(conn, &_read_params); + bt_conn_unref(conn); + if (0 == retval) + { + _reading = true; + } + pr_debug(LOG_MODULE_BLE, "%s-%d", __FUNCTION__, __LINE__); + return _reading; +} + +uint8_t BLEServiceImp::characteristicReadRspProc(bt_conn_t *conn, + int err, + bt_gatt_read_params_t *params, + const void *data, + uint16_t length) +{ + _reading = false; + if (NULL == data) + { + return BT_GATT_ITER_STOP; + } + BLEDevice bleDevice(bt_conn_get_dst(conn)); + + pr_debug(LOG_MODULE_BLE, "%s-%d:length-%d", __FUNCTION__, __LINE__, length); + if (length == UUID_SIZE_128 + 3) + { + const uint8_t* rspdata = (const uint8_t*) data; + bt_uuid_128_t uuid_tmp; + uint16_t chrc_handle = rspdata[1] | (rspdata[2] << 8); + uuid_tmp.uuid.type = BT_UUID_TYPE_128; + memcpy(uuid_tmp.val, &rspdata[3], UUID_SIZE_128); + int retval = (int)addCharacteristic(bleDevice, + (const bt_uuid_t*)&uuid_tmp, + chrc_handle, + rspdata[0]); + + if (BLE_STATUS_SUCCESS != retval) + { + pr_error(LOG_MODULE_BLE, "%s-%d: Error-%d", + __FUNCTION__, __LINE__, retval); + errno = ENOMEM; + } + else + { + if (false == discovering()) { - // Find next discoverable service - _cur_discover_chrc = NULL; + if (false == discoverAttributes(&bleDevice, chrc_handle + 1, _end_handle)) + { + discoverNextCharacteristic(bleDevice); + } } - node = node->next; } } - return retVal; + pr_debug(LOG_MODULE_BLE, "%s-%d", __FUNCTION__, __LINE__); + + return BT_GATT_ITER_STOP; } - diff --git a/libraries/CurieBLE/src/internal/BLEServiceImp.h b/libraries/CurieBLE/src/internal/BLEServiceImp.h index d6c63389..a2ef1571 100644 --- a/libraries/CurieBLE/src/internal/BLEServiceImp.h +++ b/libraries/CurieBLE/src/internal/BLEServiceImp.h @@ -71,6 +71,12 @@ class BLEServiceImp: public BLEAttribute{ uint8_t discoverResponseProc(bt_conn_t *conn, const bt_gatt_attr_t *attr, bt_gatt_discover_params_t *params); + + uint8_t characteristicReadRspProc(bt_conn_t *conn, + int err, + bt_gatt_read_params_t *params, + const void *data, + uint16_t length); bool discovering(); static bt_uuid_t *getPrimayUuid(void); @@ -81,6 +87,13 @@ class BLEServiceImp: public BLEAttribute{ int updateProfile(bt_gatt_attr_t *attr_start, int& index); + +private: + void discoverNextCharacteristic(BLEDevice &bledevice); + bool readCharacteristic(const BLEDevice &bledevice, uint16_t handle); + bool discoverAttributes(BLEDevice* device, + uint16_t start_handle, + uint16_t end_handle); private: typedef LinkNode BLECharacteristicLinkNodeHeader; typedef LinkNode* BLECharacteristicNodePtr; @@ -89,6 +102,9 @@ class BLEServiceImp: public BLEAttribute{ uint16_t _start_handle; uint16_t _end_handle; + static bt_gatt_read_params_t _read_params; + bool _reading; + void releaseCharacteristic(); BLECharacteristicImp *_cur_discover_chrc; From 3ec83508e9c63b44068db86b72ecdbe3690bef36 Mon Sep 17 00:00:00 2001 From: Sidney Leung Date: Wed, 1 Mar 2017 22:57:07 -0800 Subject: [PATCH 31/91] Jira 867, BLE setValue(), add support for strings, git #210 Feature added: - This is directly pulled from Arduino community PR #210. Overloading the setValue() method to take in a string as the only input parameter, instead of a pointer and its size. --- libraries/CurieBLE/src/BLECharacteristic.cpp | 5 +++++ libraries/CurieBLE/src/BLECharacteristic.h | 9 +++++++++ 2 files changed, 14 insertions(+) diff --git a/libraries/CurieBLE/src/BLECharacteristic.cpp b/libraries/CurieBLE/src/BLECharacteristic.cpp index 89a8e41d..96866c00 100644 --- a/libraries/CurieBLE/src/BLECharacteristic.cpp +++ b/libraries/CurieBLE/src/BLECharacteristic.cpp @@ -248,6 +248,11 @@ bool BLECharacteristic::setValue(const unsigned char value[], unsigned short len return writeValue(value, (int)length); } +bool BLECharacteristic::setValue(const char* value) +{ + return this->setValue((const unsigned char *)value, strlen(value)); +} + bool BLECharacteristic::writeValue(const byte value[], int length) { return writeValue(value, length, 0); diff --git a/libraries/CurieBLE/src/BLECharacteristic.h b/libraries/CurieBLE/src/BLECharacteristic.h index 0ca0cf53..79fbfed3 100644 --- a/libraries/CurieBLE/src/BLECharacteristic.h +++ b/libraries/CurieBLE/src/BLECharacteristic.h @@ -180,6 +180,15 @@ class BLECharacteristic: public BLEAttributeWithValue */ bool setValue(const unsigned char value[], unsigned short length); + /** + * Set the current value of the Characteristic with a String + * + * @param value New string value to set, strings exceeding maxLength will be truncated + * + * @return bool true set value success, false on error + */ + bool setValue(const char* value); + /** * @brief Write the value of the characteristic * From 59d03ae9ccfb8fd0ab84e3245a11647d9cdd353e Mon Sep 17 00:00:00 2001 From: lianggao Date: Wed, 8 Feb 2017 10:25:34 +0800 Subject: [PATCH 32/91] Jira 859. Support BLE descriptor processing. Feature added: For Central mode, added the support for processing BLE descriptor from a connected Peripheral. Enable the user sketch to access to descriptor value, length info. Code modifications: 1. peripheral_explorer.ino: - Example sketch with added descriptor processing. 2. BLECharacteristic.cpp: - Bug fixed in handling multi-descriptors. 3. BLEDescriptor.cpp: - For constructors, added initialization of descriptor storage and info. - For copy constructor and assignment, take into the account of descripter value and info. - Added API's for readning and returning descriptor info, eg. value, size. 4. BLEDescriptor.h: - Prototyping. 5. BLEDevice.h: - Added descriptor storage declaration. 6. BLECallbacks.cpp: - Added call back event for decriptor arrival. 7. BLECallbacks.h: - Prototyping. 8. BLECharacteristicImp.cpp: - The processing of the descriptor. 9. BLECharacteristicImp.h: - Prototyping. 10. BLEServiceImp.cpp: - Added descriptor info to constructor. - Made copy constructor to be aware of descriptor info. 11. BLEServiceImp.h: - Prototyping. --- .../peripheral_explorer.ino | 23 ++- libraries/CurieBLE/src/BLECharacteristic.cpp | 11 +- libraries/CurieBLE/src/BLEDescriptor.cpp | 117 ++++++++----- libraries/CurieBLE/src/BLEDescriptor.h | 99 ++++++----- libraries/CurieBLE/src/BLEDevice.h | 6 + .../CurieBLE/src/internal/BLECallbacks.cpp | 25 +++ .../CurieBLE/src/internal/BLECallbacks.h | 7 + .../src/internal/BLECharacteristicImp.cpp | 20 +++ .../src/internal/BLECharacteristicImp.h | 2 + .../src/internal/BLEDescriptorImp.cpp | 164 ++++++++++++++---- .../CurieBLE/src/internal/BLEDescriptorImp.h | 77 +++++++- .../src/internal/BLEProfileManager.cpp | 24 +++ .../CurieBLE/src/internal/BLEProfileManager.h | 1 + .../CurieBLE/src/internal/BLEServiceImp.cpp | 23 +++ .../CurieBLE/src/internal/BLEServiceImp.h | 2 + 15 files changed, 480 insertions(+), 121 deletions(-) diff --git a/libraries/CurieBLE/examples/central/peripheral_explorer/peripheral_explorer.ino b/libraries/CurieBLE/examples/central/peripheral_explorer/peripheral_explorer.ino index 45429655..4c558922 100644 --- a/libraries/CurieBLE/examples/central/peripheral_explorer/peripheral_explorer.ino +++ b/libraries/CurieBLE/examples/central/peripheral_explorer/peripheral_explorer.ino @@ -133,9 +133,30 @@ void exploreCharacteristic(BLECharacteristic characteristic) { printData(characteristic.value(), characteristic.valueLength()); } } - Serial.println(); + // loop the descriptors of the characteristic and explore each + for (int i = 0; i < characteristic.descriptorCount(); i++) { + BLEDescriptor descriptor = characteristic.descriptor(i); + + exploreDescriptor(descriptor); + } +} + +void exploreDescriptor(BLEDescriptor descriptor) { + // print the UUID of the descriptor + Serial.print("\t\tDescriptor "); + Serial.print(descriptor.uuid()); + + // read the descriptor value + descriptor.read(); + delay(1000); + + // print out the value of the descriptor + Serial.print(", value 0x"); + printData(descriptor.value(), descriptor.valueLength()); + + Serial.println(); } void printData(const unsigned char data[], int length) { diff --git a/libraries/CurieBLE/src/BLECharacteristic.cpp b/libraries/CurieBLE/src/BLECharacteristic.cpp index 96866c00..278eb1d4 100644 --- a/libraries/CurieBLE/src/BLECharacteristic.cpp +++ b/libraries/CurieBLE/src/BLECharacteristic.cpp @@ -444,15 +444,20 @@ int BLECharacteristic::addDescriptor(BLEDescriptor& descriptor) else if (BLEUtils::isLocalBLE(_bledev) == true) { // Only support the GATT server that create the service in local device. - _chrc_local_imp = new BLECharacteristicImp(*this, _bledev); + // Consider to add multi-descriptor if (NULL == _chrc_local_imp) { - retVar = BLE_STATUS_NO_MEMORY; + _chrc_local_imp = new BLECharacteristicImp(*this, _bledev); } - else + + if (NULL != _chrc_local_imp) { retVar = _chrc_local_imp->addDescriptor(descriptor); } + else + { + retVar = BLE_STATUS_NO_MEMORY; + } } return retVar; } diff --git a/libraries/CurieBLE/src/BLEDescriptor.cpp b/libraries/CurieBLE/src/BLEDescriptor.cpp index 31c4ba7e..eb624532 100644 --- a/libraries/CurieBLE/src/BLEDescriptor.cpp +++ b/libraries/CurieBLE/src/BLEDescriptor.cpp @@ -35,28 +35,19 @@ BLEDescriptor::BLEDescriptor(BLEDescriptorImp* descriptorImp, const BLEDevice *bleDev): _bledev(bleDev), _value_size(0), - _value(NULL) + _value(NULL), + _internal(descriptorImp) { _properties = descriptorImp->properties(); memset(_uuid_cstr, 0, sizeof (_uuid_cstr)); BLEUtils::uuidBT2String(descriptorImp->bt_uuid(), _uuid_cstr); - - _value_size = descriptorImp->valueSize(); - _value = (unsigned char*)malloc(_value_size); - if (NULL == _value) - { - memcpy(_value, descriptorImp->value(), _value_size); - } - else - { - errno = ENOMEM; - } } BLEDescriptor::BLEDescriptor(const char* uuid, const unsigned char value[], unsigned short valueLength): - _bledev() + _bledev(), + _internal(NULL) { bt_uuid_128_t uuid_tmp; memset(_uuid_cstr, 0, sizeof (_uuid_cstr)); @@ -65,15 +56,16 @@ BLEDescriptor::BLEDescriptor(const char* uuid, _bledev.setAddress(*BLEUtils::bleGetLoalAddress()); - _value_size = valueLength > BLE_MAX_ATTR_LONGDATA_LEN ? BLE_MAX_ATTR_LONGDATA_LEN : valueLength; + _value_size = (valueLength > BLE_MAX_ATTR_LONGDATA_LEN) ? BLE_MAX_ATTR_LONGDATA_LEN : valueLength; _value = (unsigned char*)malloc(_value_size); - if (NULL == _value) + if (NULL != _value) { memcpy(_value, value, _value_size); } else { errno = ENOMEM; + _value_size = 0; } } @@ -82,22 +74,27 @@ BLEDescriptor::BLEDescriptor(const char* uuid, BLEDescriptor(uuid, (const unsigned char*)value, strlen(value)) {} -BLEDescriptor::BLEDescriptor(const BLEDescriptor& rhs) +BLEDescriptor::BLEDescriptor(const BLEDescriptor& rhs): + _bledev(&rhs._bledev), + _properties(rhs._properties), + _value_size(0), + _value(NULL), + _internal(rhs._internal) { - _value = (unsigned char*)malloc(rhs._value_size); // Sid. KW: allocate memory for _value, not local - if (_value) - { - memcpy(_value, rhs._value, rhs._value_size); - _value_size = rhs._value_size; - } - else + memcpy(_uuid_cstr, rhs._uuid_cstr, sizeof(_uuid_cstr)); + if (NULL == _internal && rhs._value_size > 0) { - _value_size = 0; - errno = ENOMEM; + _value = (unsigned char*)malloc(rhs._value_size); // Sid. KW: allocate memory for _value, not local + if (_value) + { + memcpy(_value, rhs._value, rhs._value_size); + _value_size = rhs._value_size; + } + else + { + errno = ENOMEM; + } } - memcpy(_uuid_cstr, rhs._uuid_cstr, sizeof(_uuid_cstr)); - _properties = rhs._properties; - _bledev = BLEDevice(&rhs._bledev); } BLEDescriptor& BLEDescriptor::operator= (const BLEDescriptor& rhs) @@ -107,23 +104,27 @@ BLEDescriptor& BLEDescriptor::operator= (const BLEDescriptor& rhs) memcpy(_uuid_cstr, rhs._uuid_cstr, sizeof(_uuid_cstr)); _properties = rhs._properties; _bledev = BLEDevice(&rhs._bledev); - if (_value_size < rhs._value_size) + _internal = rhs._internal; + if (NULL == _internal && rhs._value_size > 0) { - _value_size = rhs._value_size; + if (_value_size < rhs._value_size) + { + _value_size = rhs._value_size; + + if (NULL != _value) + free(_value); + _value = (unsigned char*)malloc(_value_size); + } if (NULL != _value) - free(_value); - _value = (unsigned char*)malloc(_value_size); - } - - if (NULL != _value) - { - memcpy(_value, rhs._value, rhs._value_size); - } - else - { - _value_size = 0; - errno = ENOMEM; + { + memcpy(_value, rhs._value, rhs._value_size); + } + else + { + _value_size = 0; + errno = ENOMEM; + } } } return *this; @@ -145,12 +146,22 @@ const char* BLEDescriptor::uuid() const const byte* BLEDescriptor::value() const { - return _value; + const byte* ret = _value; + if (NULL != _internal) + { + ret = _internal->value(); + } + return ret; } int BLEDescriptor::valueLength() const { - return _value_size; + int ret = _value_size; + if (NULL != _internal) + { + ret = _internal->valueLength(); + } + return ret; } BLEDescriptor::operator bool() const @@ -166,6 +177,22 @@ unsigned char BLEDescriptor::properties() const int BLEDescriptor::valueSize() const { - return _value_size; + int ret = _value_size; + if (NULL != _internal) + { + ret = _internal->valueSize(); + } + return ret; +} + +bool BLEDescriptor::read() +{ + bool retVar = false; + + if (NULL != _internal) + { + retVar = _internal->read(); + } + return retVar; } diff --git a/libraries/CurieBLE/src/BLEDescriptor.h b/libraries/CurieBLE/src/BLEDescriptor.h index e1a79f2a..9e95de7d 100644 --- a/libraries/CurieBLE/src/BLEDescriptor.h +++ b/libraries/CurieBLE/src/BLEDescriptor.h @@ -37,73 +37,92 @@ class BLEDescriptor virtual ~BLEDescriptor(); + /** + * @brief Get the descriptor's UUID string + * + * @param none + * + * @return const char* The UUID string + * + * @note none + */ const char* uuid() const; - virtual const byte* value() const; // returns the value buffer - virtual int valueLength() const; // returns the current length of the value - - virtual operator bool() const; // is the descriptor valid (discovered from peripheral) - - unsigned char properties() const; - int valueSize() const; -private: - char _uuid_cstr[37]; // The characteristic UUID - BLEDevice _bledev; - - unsigned char _properties; // The characteristic property - - unsigned short _value_size; // The value size - unsigned char* _value; // The value. Will delete after create the _internal - - - // The API reserved for feature release - // move here for temp /** - * @brief Write the value of the descriptor + * @brief Get the value of descriptor * - * @param value The value buffer that want to write to descriptor + * @param none * - * @param length The value buffer's length + * @return const byte* The value buffer * - * @return bool true - Success, false - Failed + * @note none + */ + virtual const byte* value() const; + + /** + * @brief Get the current length of the value + * + * @param none + * + * @return int The current length of the value string * * @note none */ - //virtual bool writeValue(const byte value[], int length); + virtual int valueLength() const; /** - * @brief Write the value of the descriptor + * @brief Is the descriptor valid + * + * @param none * - * @param value The value buffer that want to write to descriptor + * @return bool true/false * - * @param length The value buffer's length + * @note none + */ + virtual operator bool() const; + + /** + * @brief Read the descriptor value * - * @param offset The offset in the descriptor's data + * @param none * * @return bool true - Success, false - Failed * + * @note Only for GATT client. Schedule read request to the GATT server + */ + bool read(); + + /** + * @brief Get the property mask of the descriptor + * + * @param none + * + * @return unsigned char The property mask of the descriptor + * * @note none */ - //bool writeValue(const byte value[], int length, int offset); + unsigned char properties() const; /** - * @brief Write the value of the descriptor + * @brief Get the maximum size of the value * - * @param value The value string that want to write to descriptor + * @param none * - * @return bool true - Success, false - Failed + * @return int The maximum size of the value * * @note none */ - //bool writeValue(const char* value); - //virtual byte operator[] (int offset) const; // returns a byte of the value at the specified offset - - // GATT client Write the value of the descriptor - //virtual bool write(const byte value[], int length); - //bool write(const byte value[], int length, int offset); - //bool write(const char* value); - //bool read(); + int valueSize() const; +private: + char _uuid_cstr[37]; // The characteristic UUID + BLEDevice _bledev; + + unsigned char _properties; // The characteristic property + + unsigned short _value_size; // The value size + unsigned char* _value; // The value. Will delete after create the _internal + BLEDescriptorImp *_internal; // The real implementation of Descriptor }; #endif diff --git a/libraries/CurieBLE/src/BLEDevice.h b/libraries/CurieBLE/src/BLEDevice.h index 56742f1b..6c1090d6 100644 --- a/libraries/CurieBLE/src/BLEDevice.h +++ b/libraries/CurieBLE/src/BLEDevice.h @@ -644,6 +644,7 @@ class BLEDevice void setEventHandler(BLEDeviceEvent event, BLEDeviceEventHandler eventHandler); // set an event handler (callback) protected: + friend class BLEDescriptorImp; friend class BLECharacteristicImp; friend class BLEServiceImp; friend class BLEDeviceManager; @@ -659,6 +660,11 @@ class BLEDevice bt_gatt_read_params_t *params, const void *data, uint16_t length); + friend uint8_t profile_descriptor_read_rsp_process(bt_conn_t *conn, + int err, + bt_gatt_read_params_t *params, + const void *data, + uint16_t length); const bt_addr_le_t* bt_le_address() const; const bt_le_conn_param* bt_conn_param() const; void setAddress(const bt_addr_le_t& addr); diff --git a/libraries/CurieBLE/src/internal/BLECallbacks.cpp b/libraries/CurieBLE/src/internal/BLECallbacks.cpp index ee89e916..edfcaeec 100644 --- a/libraries/CurieBLE/src/internal/BLECallbacks.cpp +++ b/libraries/CurieBLE/src/internal/BLECallbacks.cpp @@ -161,6 +161,31 @@ uint8_t profile_read_rsp_process(bt_conn_t *conn, return BT_GATT_ITER_STOP; } +uint8_t profile_descriptor_read_rsp_process(bt_conn_t *conn, + int err, + bt_gatt_read_params_t *params, + const void *data, + uint16_t length) +{ + if (NULL == data) + { + return BT_GATT_ITER_STOP; + } + BLEDescriptorImp *descriptor = NULL; + BLEDevice bleDevice(bt_conn_get_dst(conn)); + + // Get characteristic by handle params->single.handle + descriptor = BLEProfileManager::instance()->descriptor(bleDevice, params->single.handle); + + //pr_debug(LOG_MODULE_BLE, "%s-%d", __FUNCTION__, __LINE__); + if (descriptor) + { + descriptor->writeValue((const unsigned char *)data, length, params->single.offset); + } + //pr_debug(LOG_MODULE_BLE, "%s-%d: desc len-%d", __FUNCTION__, __LINE__, descriptor->valueLength()); + return BT_GATT_ITER_STOP; +} + uint8_t profile_service_read_rsp_process(bt_conn_t *conn, int err, bt_gatt_read_params_t *params, diff --git a/libraries/CurieBLE/src/internal/BLECallbacks.h b/libraries/CurieBLE/src/internal/BLECallbacks.h index 7eefaaa6..deffe92a 100644 --- a/libraries/CurieBLE/src/internal/BLECallbacks.h +++ b/libraries/CurieBLE/src/internal/BLECallbacks.h @@ -28,6 +28,13 @@ uint8_t profile_read_rsp_process(bt_conn_t *conn, int err, bt_gatt_read_params_t *params, const void *data, uint16_t length); + +uint8_t profile_descriptor_read_rsp_process(bt_conn_t *conn, + int err, + bt_gatt_read_params_t *params, + const void *data, + uint16_t length); + int profile_longflush_process(struct bt_conn *conn, const struct bt_gatt_attr *attr, uint8_t flags); diff --git a/libraries/CurieBLE/src/internal/BLECharacteristicImp.cpp b/libraries/CurieBLE/src/internal/BLECharacteristicImp.cpp index 71318bc9..35567130 100644 --- a/libraries/CurieBLE/src/internal/BLECharacteristicImp.cpp +++ b/libraries/CurieBLE/src/internal/BLECharacteristicImp.cpp @@ -538,6 +538,26 @@ BLECharacteristicImp::valueHandle() return handle; } +BLEDescriptorImp* BLECharacteristicImp::descriptor(uint16_t handle) +{ + BLEDescriptorImp* descriptorImp = NULL; + BLEDescriptorNodePtr node = link_node_get_first(&_descriptors_header); + while (NULL != node) + { + descriptorImp = node->value; + if (handle == descriptorImp->valueHandle()) + { + break; + } + node = node->next; + } + if (NULL == node) + { + descriptorImp = NULL; + } + return descriptorImp; +} + void BLECharacteristicImp::_setValue(const uint8_t value[], uint16_t length, uint16_t offset) { diff --git a/libraries/CurieBLE/src/internal/BLECharacteristicImp.h b/libraries/CurieBLE/src/internal/BLECharacteristicImp.h index d690d600..af5e9839 100644 --- a/libraries/CurieBLE/src/internal/BLECharacteristicImp.h +++ b/libraries/CurieBLE/src/internal/BLECharacteristicImp.h @@ -188,6 +188,8 @@ class BLECharacteristicImp: public BLEAttribute{ friend class BLEProfileManager; friend class BLEServiceImp; friend class BLECharacteristic; + + BLEDescriptorImp* descriptor(uint16_t handle); /** * Constructor for BLE Characteristic * diff --git a/libraries/CurieBLE/src/internal/BLEDescriptorImp.cpp b/libraries/CurieBLE/src/internal/BLEDescriptorImp.cpp index 0586bc09..42ca6a24 100644 --- a/libraries/CurieBLE/src/internal/BLEDescriptorImp.cpp +++ b/libraries/CurieBLE/src/internal/BLEDescriptorImp.cpp @@ -23,11 +23,15 @@ #include "internal/ble_client.h" #include "BLECallbacks.h" +#include "BLEUtils.h" BLEDescriptorImp::BLEDescriptorImp(BLEDevice& bledevice, BLEDescriptor &descriptor): - BLEAttribute(descriptor.uuid(), BLETypeDescriptor), - _value_handle(0) + BLEAttribute(descriptor.uuid(), BLETypeDescriptor), + _value_handle(0), + _bledev(bledevice), + _reading(false), + _attr_desc_value(NULL) { _properties = descriptor.properties(); @@ -45,21 +49,22 @@ BLEDescriptorImp::BLEDescriptorImp(const bt_uuid_t* uuid, uint16_t handle, BLEDevice& bledevice): BLEAttribute(uuid, BLETypeDescriptor), + _value_length(0), _value_handle(handle), - _properties(properties) + _value(NULL), + _properties(properties), + _bledev(bledevice), + _reading(false), + _attr_desc_value(NULL) { - _value_length = BLE_MAX_ATTR_DATA_LEN; - _value = (unsigned char*)malloc(_value_length); - - if (_value) - memset(_value, 0, _value_length); - else - _value_length = 0; + memset(&_read_params, 0, sizeof(_read_params)); } BLEDescriptorImp::BLEDescriptorImp(const BLEDescriptorImp& rhs) : - BLEAttribute(rhs) + BLEAttribute(rhs), + _reading(false), + _attr_desc_value(rhs._attr_desc_value) { _value_length = rhs._value_length; _value = (unsigned char *)malloc(_value_length); @@ -70,30 +75,29 @@ BLEDescriptorImp::BLEDescriptorImp(const BLEDescriptorImp& rhs) : _value_handle = rhs._value_handle; _properties = rhs._properties; - _descriptor_uuid = rhs._descriptor_uuid; _bledev = BLEDevice(&rhs._bledev); } BLEDescriptorImp& BLEDescriptorImp::operator=(const BLEDescriptorImp& that) { - if (this != &that) { - - BLEAttribute::operator=(that); - if (_value) - free(_value); - - _value_length = that._value_length; - _value = (unsigned char *)malloc(_value_length); - if (_value) - memcpy(_value, that._value, sizeof(_value_length)); - else - _value_length = 0; - - _value_handle = that._value_handle; - _properties = that._properties; - _descriptor_uuid = that._descriptor_uuid; - _bledev = BLEDevice(&that._bledev); + if (this != &that) + { + BLEAttribute::operator=(that); + if (_value) + free(_value); + + _value_length = that._value_length; + _value = (unsigned char *)malloc(_value_length); + if (_value) + memcpy(_value, that._value, sizeof(_value_length)); + else + _value_length = 0; + + _value_handle = that._value_handle; + _properties = that._properties; + _bledev = BLEDevice(&that._bledev); + _attr_desc_value = that._attr_desc_value; } return *this; } @@ -136,6 +140,24 @@ int BLEDescriptorImp::updateProfile(bt_gatt_attr_t *attr_start, int& index) return 1; } +uint16_t +BLEDescriptorImp::valueHandle() const +{ + uint16_t handle = 0; + if (NULL != _attr_desc_value) + { + //GATT server + handle = _attr_desc_value->handle; + } + else + { + // GATT client + handle = _value_handle; + } + + return handle; +} + unsigned char BLEDescriptorImp::properties() const { return _properties; @@ -146,4 +168,88 @@ int BLEDescriptorImp::valueSize() const return _value_length; } +bool BLEDescriptorImp::read() +{ + int retval = 0; + bt_conn_t* conn = NULL; + + if (true == BLEUtils::isLocalBLE(_bledev)) + { + // GATT server can't read + return false; + } + + if (_reading) + { + // Already in reading state + return false; + } + + _read_params.func = profile_descriptor_read_rsp_process; + _read_params.handle_count = 1; + _read_params.single.handle = _value_handle; + _read_params.single.offset = 0; + + if (0 == _read_params.single.handle) + { + // Discover not complete + return false; + } + + conn = bt_conn_lookup_addr_le(_bledev.bt_le_address()); + if (NULL == conn) + { + return false; + } + + // Send read request + retval = bt_gatt_read(conn, &_read_params); + bt_conn_unref(conn); + if (0 == retval) + { + _reading = true; + } + return _reading; +} + +bool BLEDescriptorImp::writeValue(const byte value[], + int length, + int offset) +{ + bool ret = true; + int total_length = length + offset; + int write_len = length; + if (total_length > BLE_MAX_ATTR_DATA_LEN) + { + return false; + } + + if (NULL == _value) + { + _value_length = length + offset; + _value = (unsigned char*)malloc(_value_length); + + if (NULL != _value) + { + memset(_value, 0, _value_length); + } + else + { + _value_length = 0; + ret = false; + } + } + + if (_value_length < total_length) + { + write_len = _value_length - offset; + } + + if (NULL != _value) + { + memcpy(_value + offset, value, write_len); + } + return ret; +} + diff --git a/libraries/CurieBLE/src/internal/BLEDescriptorImp.h b/libraries/CurieBLE/src/internal/BLEDescriptorImp.h index 32fceb1a..701f3f83 100644 --- a/libraries/CurieBLE/src/internal/BLEDescriptorImp.h +++ b/libraries/CurieBLE/src/internal/BLEDescriptorImp.h @@ -59,12 +59,80 @@ class BLEDescriptorImp: public BLEAttribute{ * @return unsigned short size of Descriptor value in bytes */ unsigned short valueLength(void) const; - + + /** + * @brief Fill the attribute for profile register structure + * + * @param bt_gatt_attr_t * The start pointer of the profile register structure array + * + * @param int& The current index in the profile structure array + * + * @return int Filled structure counter + * + * @note none + */ int updateProfile(bt_gatt_attr_t *attr_start, int& index); unsigned char operator[] (int offset) const; + + /** + * @brief Get the property mask of the descriptor + * + * @param none + * + * @return unsigned char The property mask of the descriptor + * + * @note none + */ unsigned char properties() const; + + /** + * @brief Get the maximum size of the value + * + * @param none + * + * @return int The maximum size of the value + * + * @note none + */ int valueSize() const; + + /** + * @brief Get the descriptor value handle + * + * @param none + * + * @return none + * + * @note none + */ + uint16_t valueHandle() const; + + /** + * @brief Write the value of the descriptor + * + * @param value The value buffer that want to write to descriptor + * + * @param length The value buffer's length + * + * @param offset The offset in the descriptor's data + * + * @return bool true - Success, false - Failed + * + * @note none + */ + bool writeValue(const byte value[], int length, int offset); + + /** + * @brief Read the descriptor value + * + * @param none + * + * @return bool true - Success, false - Failed + * + * @note Only for GATT client. Schedule read request to the GATT server + */ + bool read(); protected: @@ -75,9 +143,12 @@ class BLEDescriptorImp: public BLEAttribute{ unsigned char* _value; unsigned char _properties; // The characteristic property - bt_uuid_128 _descriptor_uuid; - BLEDevice _bledev; + + bool _reading; + bt_gatt_read_params_t _read_params; // GATT read parameter + + bt_gatt_attr_t *_attr_desc_value; // GATT server only }; #endif // _BLE_DESCRIPTOR_H_INCLUDED diff --git a/libraries/CurieBLE/src/internal/BLEProfileManager.cpp b/libraries/CurieBLE/src/internal/BLEProfileManager.cpp index 8dd33244..aba7981b 100644 --- a/libraries/CurieBLE/src/internal/BLEProfileManager.cpp +++ b/libraries/CurieBLE/src/internal/BLEProfileManager.cpp @@ -337,6 +337,30 @@ void BLEProfileManager::clearProfile(BLEServiceLinkNodeHeader* serviceHeader) } } +BLEDescriptorImp* BLEProfileManager::descriptor(const BLEDevice &bledevice, uint16_t handle) +{ + BLEDescriptorImp* descriptorImp = NULL; + BLEServiceLinkNodeHeader* serviceHeader = getServiceHeader(bledevice); + if (NULL == serviceHeader) + { + // Doesn't find the service + return NULL; + } + + BLEServiceNodePtr node = serviceHeader->next; + while (node != NULL) + { + BLEServiceImp *service = node->value; + descriptorImp = service->descriptor(handle); + if (NULL != descriptorImp) + { + break; + } + node = node->next; + } + return descriptorImp; +} + BLECharacteristicImp* BLEProfileManager::characteristic(const BLEDevice &bledevice, int index) { BLECharacteristicImp* characteristicImp = NULL; diff --git a/libraries/CurieBLE/src/internal/BLEProfileManager.h b/libraries/CurieBLE/src/internal/BLEProfileManager.h index a83ba431..1c05fc99 100644 --- a/libraries/CurieBLE/src/internal/BLEProfileManager.h +++ b/libraries/CurieBLE/src/internal/BLEProfileManager.h @@ -73,6 +73,7 @@ class BLEProfileManager{ inline bool hasRegisterProfile(){return _profile_registered;} + BLEDescriptorImp* descriptor(const BLEDevice &bledevice, uint16_t handle); /** * @brief Get the BLE's Characteristic implementation object by uuid and index * diff --git a/libraries/CurieBLE/src/internal/BLEServiceImp.cpp b/libraries/CurieBLE/src/internal/BLEServiceImp.cpp index ba479b90..d5d7afe6 100644 --- a/libraries/CurieBLE/src/internal/BLEServiceImp.cpp +++ b/libraries/CurieBLE/src/internal/BLEServiceImp.cpp @@ -177,6 +177,29 @@ void BLEServiceImp::releaseCharacteristic() } +BLEDescriptorImp* BLEServiceImp::descriptor(uint16_t handle) +{ + BLEDescriptorImp* descriptorImp = NULL; + + BLECharacteristicImp* characteristicImp = NULL; + BLECharacteristicNodePtr node = link_node_get_first(&_characteristics_header); + while (NULL != node) + { + characteristicImp = node->value; + descriptorImp = characteristicImp->descriptor(handle); + if (descriptorImp != NULL) + { + break; + } + node = node->next; + } + if (NULL == node) + { + descriptorImp = NULL; + } + return descriptorImp; +} + BLECharacteristicImp* BLEServiceImp::characteristic(int index) { BLECharacteristicImp* characteristicImp = NULL; diff --git a/libraries/CurieBLE/src/internal/BLEServiceImp.h b/libraries/CurieBLE/src/internal/BLEServiceImp.h index a2ef1571..f40ffd36 100644 --- a/libraries/CurieBLE/src/internal/BLEServiceImp.h +++ b/libraries/CurieBLE/src/internal/BLEServiceImp.h @@ -57,6 +57,8 @@ class BLEServiceImp: public BLEAttribute{ uint16_t handle, unsigned char properties); int getCharacteristicCount(); + + BLEDescriptorImp* descriptor(uint16_t handle); BLECharacteristicImp* characteristic(const bt_uuid_t* uuid); BLECharacteristicImp* characteristic(const char* uuid); From 3612e08ec902c391e38d862b26d0017e30bcbc28 Mon Sep 17 00:00:00 2001 From: lianggao Date: Wed, 4 Jan 2017 16:18:37 +0800 Subject: [PATCH 33/91] =?UTF-8?q?Jira=20836,=20Enumerate=20non=20connectab?= =?UTF-8?q?le=20Peripherals=20in=20Central=20scan=20=20=E2=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added feature: - In Central mode, the BLE library should enumerate Peripheral that are non-connectable (eg beacon). Code Mods: 1. BLEDevice.cpp: - Add the call to get Manufacturer Data info from a Peripheral. Non-connectable device may only broadcast this info. 2. BLEDevice.h: - Prototyping. 3. BLEDeviceManager.cpp: - Delete the filter about non-connectable advertisement. - Added APIs, hasManufacturerData(), setManufacturerData(), hasManufacturerData(), to gain access to adv info of non-connectable Peripherals. --- libraries/CurieBLE/src/BLEDevice.cpp | 11 + libraries/CurieBLE/src/BLEDevice.h | 5 + .../src/internal/BLEDeviceManager.cpp | 721 ++++++++++++------ .../CurieBLE/src/internal/BLEDeviceManager.h | 53 +- 4 files changed, 566 insertions(+), 224 deletions(-) diff --git a/libraries/CurieBLE/src/BLEDevice.cpp b/libraries/CurieBLE/src/BLEDevice.cpp index d96b70c2..2c5a3189 100644 --- a/libraries/CurieBLE/src/BLEDevice.cpp +++ b/libraries/CurieBLE/src/BLEDevice.cpp @@ -133,6 +133,17 @@ void BLEDevice::setManufacturerData(const unsigned char manufacturerData[], BLEDeviceManager::instance()->setManufacturerData(manufacturerData, manufacturerDataLength); } +bool BLEDevice::getManufacturerData (unsigned char* manu_data, + unsigned char& manu_data_len) const +{ + return BLEDeviceManager::instance()->getManufacturerData(this, manu_data, manu_data_len); +} + +bool BLEDevice::hasManufacturerData() const +{ + return BLEDeviceManager::instance()->hasManufacturerData(this); +} + void BLEDevice::setLocalName(const char *localName) { BLEDeviceManager::instance()->setLocalName(localName); diff --git a/libraries/CurieBLE/src/BLEDevice.h b/libraries/CurieBLE/src/BLEDevice.h index 6c1090d6..76e94f14 100644 --- a/libraries/CurieBLE/src/BLEDevice.h +++ b/libraries/CurieBLE/src/BLEDevice.h @@ -191,6 +191,11 @@ class BLEDevice void setManufacturerData(const unsigned char manufacturerData[], unsigned char manufacturerDataLength); + bool getManufacturerData (unsigned char* manu_data, + unsigned char& manu_data_len) const; + + bool hasManufacturerData() const; + /** * Set the local name that the BLE Peripheral Device advertises * diff --git a/libraries/CurieBLE/src/internal/BLEDeviceManager.cpp b/libraries/CurieBLE/src/internal/BLEDeviceManager.cpp index 643e6b97..56e2e960 100644 --- a/libraries/CurieBLE/src/internal/BLEDeviceManager.cpp +++ b/libraries/CurieBLE/src/internal/BLEDeviceManager.cpp @@ -33,9 +33,15 @@ BLEDeviceManager* BLEDeviceManager::_instance; BLEDeviceManager::BLEDeviceManager(): _min_conn_interval(0), _max_conn_interval(0), + _peer_temp_dev_index(0), _adv_critical_local_name(""), + _wait_for_connect_peripheral_adv_data_len(0), + _wait_for_connect_peripheral_scan_rsp_data_len(0), _wait_for_connect_peripheral_adv_rssi(0), + _available_for_connect_peripheral_adv_data_len(0), + _available_for_connect_peripheral_scan_rsp_data_len(0), _available_for_connect_peripheral_adv_rssi(0), + _available_for_connect_peripheral_connectable(false), _connecting(false), _has_service_uuid(false), _has_service_solicit_uuid(false), @@ -44,6 +50,7 @@ BLEDeviceManager::BLEDeviceManager(): _service_data_length(0), _adv_type(0), _adv_data_idx(0), + _scan_rsp_data_idx(0), _local_name(""), _state(BLE_PERIPH_STATE_NOT_READY), _local_ble(NULL), @@ -53,14 +60,7 @@ BLEDeviceManager::BLEDeviceManager(): _adv_duplicate_filter_enabled(false) { memset(&_local_bda, 0, sizeof(_local_bda)); - memset(&_wait_for_connect_peripheral, 0, sizeof(_wait_for_connect_peripheral)); - memset(&_service_uuid, 0, sizeof(_service_uuid)); - memset(&_service_solicit_uuid, 0, sizeof(_service_solicit_uuid)); - memset(&_service_data_uuid, 0, sizeof(_service_data_uuid)); - memset(_service_data, 0, sizeof(_service_data)); - memset(_service_data_buf, 0, sizeof(_service_data_buf)); - memset(_adv_data, 0, sizeof(_adv_data)); memset(&_peer_central, 0, sizeof (bt_addr_le_t)); @@ -78,20 +78,51 @@ BLEDeviceManager::BLEDeviceManager(): memset(_peer_adv_buffer, 0, sizeof(_peer_adv_buffer)); memset(_peer_adv_mill, 0, sizeof(_peer_adv_mill)); + memset(_peer_adv_data, 0, sizeof(_peer_adv_data)); + memset(_peer_adv_data_len, 0, sizeof(_peer_adv_data_len)); + memset(_peer_scan_rsp_data, 0, sizeof(_peer_scan_rsp_data)); + memset(_peer_scan_rsp_data_len, 0, sizeof(_peer_scan_rsp_data_len)); + memset(_peer_adv_rssi, 0, sizeof(_peer_adv_rssi)); + + memset(_peer_adv_connectable, 0, sizeof(_peer_adv_connectable)); + + memset(_peer_temp_adv_buffer, 0, sizeof(_peer_temp_adv_buffer)); + memset(_peer_temp_adv_data, 0, sizeof(_peer_temp_adv_data)); + memset(_peer_temp_adv_data_len, 0, sizeof(_peer_temp_adv_data_len)); + memset(_peer_temp_adv_connectable, 0, sizeof(_peer_adv_connectable)); + memset(&_adv_accept_critical, 0, sizeof(_adv_accept_critical)); memset(&_adv_critical_service_uuid, 0, sizeof(_adv_critical_service_uuid)); memset(&_adv_accept_device, 0, sizeof(_adv_accept_device)); + memset(&_wait_for_connect_peripheral, 0, sizeof(_wait_for_connect_peripheral)); + memset(&_wait_for_connect_peripheral_adv_data, 0, sizeof(_wait_for_connect_peripheral_adv_data)); + memset(&_wait_for_connect_peripheral_scan_rsp_data, 0, sizeof(_wait_for_connect_peripheral_scan_rsp_data)); + + memset(&_available_for_connect_peripheral_adv_data, 0, sizeof(_available_for_connect_peripheral_adv_data)); + memset(&_available_for_connect_peripheral_scan_rsp_data, 0, sizeof(_available_for_connect_peripheral_scan_rsp_data)); + + memset(&_wait_for_connect_peripheral, 0, sizeof(_wait_for_connect_peripheral)); + + memset(&_service_uuid, 0, sizeof(_service_uuid)); + memset(&_service_solicit_uuid, 0, sizeof(_service_solicit_uuid)); + memset(_manufacturer_data, 0, sizeof(_manufacturer_data)); + + memset(&_service_data_uuid, 0, sizeof(_service_data_uuid)); + memset(_service_data, 0, sizeof(_service_data)); + memset(_service_data_buf, 0, sizeof(_service_data_buf)); + + memset(_adv_data, 0, sizeof(_adv_data)); + memset(_scan_rsp_data, 0, sizeof(_scan_rsp_data)); + memset(_peer_peripheral, 0, sizeof(_peer_peripheral)); memset(_peer_peripheral_adv_data, 0, sizeof(_peer_peripheral_adv_data)); memset(_peer_peripheral_adv_data_len, 0, sizeof(_peer_peripheral_adv_data_len)); + memset(_peer_peripheral_scan_rsp_data, 0, sizeof(_peer_peripheral_scan_rsp_data)); + memset(_peer_peripheral_scan_rsp_data_len, 0, sizeof(_peer_peripheral_scan_rsp_data_len)); memset(_peer_peripheral_adv_rssi, 0, sizeof(_peer_peripheral_adv_rssi)); memset(_device_events, 0, sizeof(_device_events)); - memset(_manufacturer_data, 0, sizeof(_manufacturer_data)); - memset(_peer_adv_data, 0, sizeof(_peer_adv_data)); - memset(_peer_adv_data_len, 0, sizeof(_peer_adv_data_len)); - memset(_peer_adv_rssi, 0, sizeof(_peer_adv_rssi)); } BLEDeviceManager::~BLEDeviceManager() @@ -311,109 +342,132 @@ void BLEDeviceManager::setAppearance(unsigned short appearance) _appearance = appearance; } +BLE_STATUS_T +BLEDeviceManager::setAdvertiseData(uint8_t type, const uint8_t* data, uint8_t length) +{ + uint8_t lengthOfAdv = 0; // Flags data length + uint8_t lengthOfScanRsp = 0; // Flags data length + bt_data_t *fill_area = NULL; + + // Get the length of the Advertisement + for (uint8_t i = 0; i < _adv_data_idx; i++) + { + lengthOfAdv += _adv_data[i].data_len + 2; + } + + for (uint8_t i = 0; i < _scan_rsp_data_idx; i++) + { + lengthOfAdv += _scan_rsp_data[i].data_len + 2; + } + + + if (((length + lengthOfAdv) < BLE_MAX_ADV_SIZE) && + (_adv_data_idx < ARRAY_SIZE(_adv_data))) + { + fill_area = &_adv_data[_adv_data_idx]; + _adv_data_idx++; + } + else if ((length + lengthOfScanRsp) < BLE_MAX_ADV_SIZE && + (_scan_rsp_data_idx < ARRAY_SIZE(_scan_rsp_data))) + { + fill_area = &_scan_rsp_data[_scan_rsp_data_idx]; + _scan_rsp_data_idx++; + } + else + { + // Service data block is too large. + return BLE_STATUS_ERROR_PARAMETER; + } + + if (fill_area) + { + fill_area->type = type; + fill_area->data = data; + fill_area->data_len = length; + + pr_info(LOG_MODULE_BLE, "ADV type %d Len - %d",type, length); + } + return BLE_STATUS_SUCCESS; +} + BLE_STATUS_T BLEDeviceManager::_advDataInit(void) { - uint8_t lengthTotal = 2; // Flags data length + BLE_STATUS_T ret = BLE_STATUS_SUCCESS; + // Clear the indexs _adv_data_idx = 0; + _scan_rsp_data_idx = 0; /* Add flags */ _adv_type = (BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR); - _adv_data[_adv_data_idx].type = BT_DATA_FLAGS; - _adv_data[_adv_data_idx].data = &_adv_type; - _adv_data[_adv_data_idx].data_len = 1; - _adv_data_idx++; + ret = setAdvertiseData (BT_DATA_FLAGS, &_adv_type, sizeof(_adv_type)); - if (_has_service_uuid) + if (_has_service_solicit_uuid && + (BLE_STATUS_SUCCESS == ret)) { uint8_t type; uint8_t length; uint8_t *data = NULL; - pr_info(LOG_MODULE_BLE, "ADV Type-%d", _service_uuid.uuid.type); - if (BT_UUID_TYPE_16 == _service_uuid.uuid.type) + pr_info(LOG_MODULE_BLE, "ADV Type-%d", _service_solicit_uuid.uuid.type); + if (BT_UUID_TYPE_16 == _service_solicit_uuid.uuid.type) { - //UINT16_TO_LESTREAM(adv_tmp, uuid.uuid16); - data = (uint8_t *)&(((bt_uuid_16_t *)&_service_uuid)->val); + data = (uint8_t *)&(((bt_uuid_16_t *)&_service_solicit_uuid)->val); length = UUID_SIZE_16; - type = BT_DATA_UUID16_ALL; + type = BT_DATA_SOLICIT16; } - else // Sid. KW, default is BT_UUID_TYPE_128 + else // Sid. KW, default is BT_UUID_TYPE_128 { - data = _service_uuid.val; + data = _service_solicit_uuid.val; length = UUID_SIZE_128; - type = BT_DATA_UUID128_ALL; - } - - // if (data) // Sid. KW, data is always initialized - { - _adv_data[_adv_data_idx].type = type; - _adv_data[_adv_data_idx].data = data; - _adv_data[_adv_data_idx].data_len = length; - _adv_data_idx++; - lengthTotal += length; - - pr_info(LOG_MODULE_BLE, "Service UUID Len -%d", length); + type = BT_DATA_SOLICIT128; } + + ret = setAdvertiseData(type, data, length); } - if (_has_service_solicit_uuid) + if (_has_service_uuid && + (BLE_STATUS_SUCCESS == ret)) { uint8_t type; uint8_t length; uint8_t *data = NULL; - pr_info(LOG_MODULE_BLE, "ADV Type-%d", _service_solicit_uuid.uuid.type); - if (BT_UUID_TYPE_16 == _service_solicit_uuid.uuid.type) + pr_info(LOG_MODULE_BLE, "ADV Type-%d", _service_uuid.uuid.type); + if (BT_UUID_TYPE_16 == _service_uuid.uuid.type) { - //UINT16_TO_LESTREAM(adv_tmp, uuid.uuid16); - data = (uint8_t *)&(((bt_uuid_16_t *)&_service_solicit_uuid)->val); + data = (uint8_t *)&(((bt_uuid_16_t *)&_service_uuid)->val); length = UUID_SIZE_16; - type = BT_DATA_SOLICIT16; + type = BT_DATA_UUID16_ALL; } - else // Sid. KW, default is BT_UUID_TYPE_128 + else // Sid. KW, default is BT_UUID_TYPE_128 { - data = _service_solicit_uuid.val; + data = _service_uuid.val; length = UUID_SIZE_128; - type = BT_DATA_SOLICIT128; - } - // Sid. KW, data is always initialized. if (data) - { - _adv_data[_adv_data_idx].type = type; - _adv_data[_adv_data_idx].data = data; - _adv_data[_adv_data_idx].data_len = length; - _adv_data_idx++; - lengthTotal += length; - - pr_info(LOG_MODULE_BLE, "Service UUID Len -%d", length); + type = BT_DATA_UUID128_ALL; } + ret = setAdvertiseData(type, data, length); } - - if (_local_name.length() > 0) + + if (_manufacturer_data_length > 0 && + (BLE_STATUS_SUCCESS == ret)) { - /* Add device name (truncated if too long) */ - _adv_data[_adv_data_idx].type = BT_DATA_NAME_COMPLETE; - _adv_data[_adv_data_idx].data = (const uint8_t*)_local_name.c_str(); - _adv_data[_adv_data_idx].data_len = _local_name.length(); - _adv_data_idx++; - - lengthTotal += _local_name.length(); - pr_info(LOG_MODULE_BLE, "Local Name -%s", _local_name.c_str()); - pr_info(LOG_MODULE_BLE, "Local Name Len -%d", _local_name.length()); + ret = setAdvertiseData (BT_DATA_MANUFACTURER_DATA, + _manufacturer_data, + _manufacturer_data_length); } - - if (_manufacturer_data_length > 0) + + if (_local_name.length() > 0 && + (BLE_STATUS_SUCCESS == ret)) { - // Add manufacturer data - _adv_data[_adv_data_idx].type = BT_DATA_MANUFACTURER_DATA; - _adv_data[_adv_data_idx].data = _manufacturer_data; - _adv_data[_adv_data_idx].data_len = _manufacturer_data_length; - _adv_data_idx++; - - lengthTotal += _manufacturer_data_length; + uint8_t length = _local_name.length(); + ret = setAdvertiseData (BT_DATA_NAME_COMPLETE, + (const uint8_t*)_local_name.c_str(), + length); } - if (_service_data_length > 0) + if (_service_data_length > 0 && + (BLE_STATUS_SUCCESS == ret)) { /* Add Service Data (if it will fit) */ @@ -431,29 +485,18 @@ BLEDeviceManager::_advDataInit(void) return BLE_STATUS_ERROR_PARAMETER; } - _adv_data[_adv_data_idx].type = BT_DATA_SVC_DATA16; - _adv_data[_adv_data_idx].data = _service_data_buf; - _adv_data[_adv_data_idx].data_len = block_len; - _adv_data_idx++; + ret = setAdvertiseData (BT_DATA_SVC_DATA16, + _service_data_buf, + block_len); uint8_t *adv_tmp = _service_data_buf; - //UINT16_TO_LESTREAM(adv_tmp, (((bt_uuid_16_t *)&_service_data_uuid)->val)); memcpy(adv_tmp, &((bt_uuid_16_t*)&_service_data_uuid)->val, sizeof(uint16_t)); adv_tmp += 2; memcpy(adv_tmp, _service_data, _service_data_length); - - lengthTotal += block_len; - pr_info(LOG_MODULE_BLE, "SVC Len -%d", block_len); } - - if (lengthTotal > BLE_MAX_ADV_SIZE) - { - pr_error(LOG_MODULE_BLE, "ADV Total length-%d", lengthTotal); - // Service data block is too large. - return BLE_STATUS_ERROR_PARAMETER; - } - return BLE_STATUS_SUCCESS; + + return ret; } BLE_STATUS_T BLEDeviceManager::startAdvertising() @@ -470,7 +513,9 @@ BLE_STATUS_T BLEDeviceManager::startAdvertising() if (_state != BLE_PERIPH_STATE_READY) return BLE_STATUS_WRONG_STATE; - ret = bt_le_adv_start(&_adv_param, _adv_data, _adv_data_idx, NULL, 0); + ret = bt_le_adv_start(&_adv_param, + _adv_data, _adv_data_idx, + _scan_rsp_data, _scan_rsp_data_idx); if (0 != ret) { pr_error(LOG_MODULE_APP, "[ADV] Start failed. Error: %d", ret); @@ -617,48 +662,119 @@ void BLEDeviceManager::setAdvertiseCritical(const char* macaddress) BLEUtils::macAddressString2BT(macaddress, _adv_accept_device); } -bool BLEDeviceManager::hasLocalName(const BLEDevice* device) const +bool BLEDeviceManager::getDataFromAdvertiseByType(const BLEDevice* device, + const uint8_t eir_type, + const uint8_t* &data, + uint8_t &data_len) const { - if (BLEUtils::isLocalBLE(*device) == true) - { - return (_local_name.length() != 0); - } - const uint8_t* adv_data = NULL; uint8_t adv_data_len = 0; + bool retval = false; + bool scan_response_proced = false; + getDeviceAdvertiseBuffer(device->bt_le_address(), adv_data, adv_data_len); - if (NULL == adv_data) - { - return false; - } - - while (adv_data_len > 1) - { - uint8_t len = adv_data[0]; - uint8_t type = adv_data[1]; - /* Check for early termination */ - if (len == 0) + while (NULL != adv_data) + { + while (adv_data_len > 1) { - return false; - } + uint8_t len = adv_data[0]; + uint8_t type = adv_data[1]; - if ((len + 1) > adv_data_len) { // Sid. KW, can't be (adv_data_len < 2) - pr_info(LOG_MODULE_BLE, "AD malformed\n"); - return false; - } + /* Check for early termination */ + if ((len == 0) || ((len + 1) > adv_data_len)) { + break; + } + + if (type == eir_type) + { + if (len >= BLE_MAX_ADV_SIZE) + { + len = BLE_MAX_ADV_SIZE-1; + } + data = &adv_data[2]; + data_len = len - 1; + retval = true; + break; + } - if (type == BT_DATA_NAME_COMPLETE) + adv_data_len -= len + 1; + adv_data += len + 1; + } + if (retval == true || scan_response_proced == true) { - return true; + break; } + getDeviceScanResponseBuffer(device->bt_le_address(), + adv_data, + adv_data_len); + scan_response_proced = true; + } + return retval; +} - adv_data_len -= len + 1; - adv_data += len + 1; + +bool BLEDeviceManager::hasLocalName(const BLEDevice* device) const +{ + if (BLEUtils::isLocalBLE(*device) == true) + { + return (_local_name.length() != 0); } - return false; + + const uint8_t* local_name = NULL; + uint8_t local_name_len = 0; + bool retval = getDataFromAdvertiseByType(device, + BT_DATA_NAME_COMPLETE, + local_name, + local_name_len); + if (false == retval) + { + retval = getDataFromAdvertiseByType(device, + BT_DATA_NAME_SHORTENED, + local_name, + local_name_len); + } + return retval; +} + +bool BLEDeviceManager::hasManufacturerData(const BLEDevice* device) const +{ + if (BLEUtils::isLocalBLE(*device) == true) + { + return (_manufacturer_data_length != 0); + } + + const uint8_t* manufactgurer_data = NULL; + uint8_t manufactgurer_data_len = 0; + return getDataFromAdvertiseByType(device, + BT_DATA_MANUFACTURER_DATA, + manufactgurer_data, + manufactgurer_data_len); +} + +bool BLEDeviceManager::getManufacturerData (const BLEDevice* device, + uint8_t* manu_data, + uint8_t&manu_data_len) const +{ + if (BLEUtils::isLocalBLE(*device) == true) + { + return (_manufacturer_data_length != 0); + } + + const uint8_t* manufactgurer_data = NULL; + uint8_t manufactgurer_data_len = 0; + bool retval = getDataFromAdvertiseByType(device, + BT_DATA_MANUFACTURER_DATA, + manufactgurer_data, + manufactgurer_data_len); + if (retval) + { + memcpy (manu_data, manufactgurer_data, manufactgurer_data_len); + manu_data_len = manufactgurer_data_len; + } + return retval; } bool BLEDeviceManager::hasAdvertisedServiceUuid(const BLEDevice* device) const @@ -713,6 +829,41 @@ void BLEDeviceManager::getDeviceAdvertiseBuffer(const bt_addr_le_t* addr, return; } +void BLEDeviceManager::getDeviceScanResponseBuffer(const bt_addr_le_t* addr, + const uint8_t* &adv_data, + uint8_t &adv_len) const +{ + const bt_addr_le_t* temp = NULL; + // Connected device + for (int i = 0; i < BLE_MAX_CONN_CFG; i++) + { + temp = &_peer_peripheral[i]; + if (bt_addr_le_cmp(temp, addr) == 0) + { + adv_data = _peer_peripheral_scan_rsp_data[i]; + adv_len = _peer_peripheral_scan_rsp_data_len[i]; + return; + } + } + + // Connecting device + if (bt_addr_le_cmp(&_wait_for_connect_peripheral, addr) == 0) + { + adv_data = _wait_for_connect_peripheral_scan_rsp_data; + adv_len = _wait_for_connect_peripheral_scan_rsp_data_len; + return; + } + + // Available device + if (bt_addr_le_cmp(&_available_for_connect_peripheral, addr) == 0) + { + adv_data = _available_for_connect_peripheral_scan_rsp_data; + adv_len = _available_for_connect_peripheral_scan_rsp_data_len; + return; + } + return; +} + int BLEDeviceManager::advertisedServiceUuidCount(const BLEDevice* device) const { const uint8_t* adv_data = NULL; @@ -740,7 +891,7 @@ int BLEDeviceManager::advertisedServiceUuidCount(const BLEDevice* device) const uint8_t type = adv_data[1]; /* Check for early termination */ - if (len == 0) + if (len == 0 || ((len + 1) > adv_data_len)) { return service_cnt; } @@ -773,57 +924,34 @@ String BLEDeviceManager::localName(const BLEDevice* device) const { return _local_name; } - const uint8_t* adv_data = NULL; - uint8_t adv_data_len = 0; - char localname_string[BLE_MAX_ADV_SIZE]; - memset(localname_string, 0, sizeof(localname_string)); - - getDeviceAdvertiseBuffer(device->bt_le_address(), - adv_data, - adv_data_len); - if (NULL == adv_data) { - String temp(localname_string); - return temp; + const uint8_t* local_name = NULL; + uint8_t local_name_len = 0; + String temp(""); + char local_name_buff[BLE_MAX_ADV_SIZE]; + bool retval = getDataFromAdvertiseByType(device, + BT_DATA_NAME_COMPLETE, + local_name, + local_name_len); + if (false == retval) + { + retval = getDataFromAdvertiseByType(device, + BT_DATA_NAME_SHORTENED, + local_name, + local_name_len); } - while (adv_data_len > 1) + if (true == retval) { - uint8_t len = adv_data[0]; - uint8_t type = adv_data[1]; - - /* Check for early termination */ - if (len == 0) { - String temp(localname_string); - return temp; - } - - if ((len + 1) > adv_data_len) { // Sid. KW, cannot be (adv_data_len < 2) - pr_info(LOG_MODULE_BLE, "AD malformed\n"); - String temp(localname_string); - return temp; - } - - /* Sid, 2/15/2017. Support both forms of data name. - */ - if (type == BT_DATA_NAME_COMPLETE || - type == BT_DATA_NAME_SHORTENED) + if (local_name_len >= BLE_MAX_ADV_SIZE) { - if (len >= BLE_MAX_ADV_SIZE) - { - len = BLE_MAX_ADV_SIZE-1; - } - uint8_t copy_len = len - 1; - memcpy(localname_string, &adv_data[2], copy_len); - localname_string[copy_len] = '\0'; - break; + local_name_len = BLE_MAX_ADV_SIZE - 1; } - - adv_data_len -= len + 1; - adv_data += len + 1; + memcpy(local_name_buff, local_name, local_name_len); + local_name_buff[local_name_len] = '\0'; + temp = local_name_buff; } - - String temp(localname_string); + return temp; } @@ -867,14 +995,9 @@ String BLEDeviceManager::advertisedServiceUuid(const BLEDevice* device, int inde uint8_t type = adv_data[1]; /* Check for early termination */ - if (len == 0) + if (len == 0 || ((len + 1) > adv_data_len)) { - return String(uuid_string); - } - - if ((len + 1) > adv_data_len) { // Sid. KW, cannot be adv_data_len < 2 - pr_info(LOG_MODULE_BLE, "AD malformed\n"); - return String(uuid_string); + break; } if (type == BT_DATA_UUID16_ALL || @@ -947,7 +1070,9 @@ bool BLEDeviceManager::connect(BLEDevice &device) bt_addr_le_copy(&_wait_for_connect_peripheral, device.bt_le_address()); // Buffer the ADV data memcpy(_wait_for_connect_peripheral_adv_data, _available_for_connect_peripheral_adv_data, BLE_MAX_ADV_SIZE); + memcpy(_wait_for_connect_peripheral_scan_rsp_data, _available_for_connect_peripheral_scan_rsp_data, BLE_MAX_ADV_SIZE); _wait_for_connect_peripheral_adv_data_len = _available_for_connect_peripheral_adv_data_len; + _wait_for_connect_peripheral_scan_rsp_data_len = _available_for_connect_peripheral_scan_rsp_data_len; _wait_for_connect_peripheral_adv_rssi = _available_for_connect_peripheral_adv_rssi; startScanning(); @@ -1016,6 +1141,10 @@ bool BLEDeviceManager::connectToDevice(BLEDevice &device) _wait_for_connect_peripheral_adv_data, BLE_MAX_ADV_SIZE); _peer_peripheral_adv_data_len[i] = _wait_for_connect_peripheral_adv_data_len; + memcpy(_peer_peripheral_scan_rsp_data[i], + _wait_for_connect_peripheral_scan_rsp_data, + BLE_MAX_ADV_SIZE); + _peer_peripheral_scan_rsp_data_len[i] = _wait_for_connect_peripheral_scan_rsp_data_len; _peer_peripheral_adv_rssi[i] = _wait_for_connect_peripheral_adv_rssi; } } @@ -1240,10 +1369,12 @@ BLEDevice BLEDeviceManager::available() tempdevice.setAddress(*temp); bt_addr_le_copy(&_available_for_connect_peripheral, temp); memcpy(_available_for_connect_peripheral_adv_data, _peer_adv_data[index], BLE_MAX_ADV_SIZE); + memcpy(_available_for_connect_peripheral_scan_rsp_data, _peer_scan_rsp_data[index], BLE_MAX_ADV_SIZE); + _available_for_connect_peripheral_scan_rsp_data_len = _peer_scan_rsp_data_len[index]; _available_for_connect_peripheral_adv_data_len = _peer_adv_data_len[index]; _available_for_connect_peripheral_adv_rssi = _peer_adv_rssi[index]; - - pr_debug(LOG_MODULE_BLE, "%s-%d:Con addr-%s", __FUNCTION__, __LINE__, BLEUtils::macAddressBT2String(*temp).c_str()); + _available_for_connect_peripheral_connectable = _peer_adv_connectable[index]; + //pr_debug(LOG_MODULE_BLE, "%s-%d:Con addr-%s", __FUNCTION__, __LINE__, BLEUtils::macAddressBT2String(*temp).c_str()); _peer_adv_mill[index] -= 2000; // Set it as expired if (_adv_duplicate_filter_enabled) { @@ -1257,7 +1388,8 @@ BLEDevice BLEDeviceManager::available() bool BLEDeviceManager::setAdvertiseBuffer(const bt_addr_le_t* bt_addr, const uint8_t *ad, uint8_t data_len, - int8_t rssi) + int8_t rssi, + bool connectable) { bt_addr_le_t* temp = NULL; uint64_t timestamp = millis(); @@ -1303,12 +1435,163 @@ bool BLEDeviceManager::setAdvertiseBuffer(const bt_addr_le_t* bt_addr, _peer_adv_rssi[index] = rssi; // Update the timestamp _peer_adv_mill[index] = timestamp; + _peer_adv_connectable[index] = connectable; + retval = true; + } + + return retval; +} + +bool BLEDeviceManager::setScanRespBuffer(const bt_addr_le_t* bt_addr, + const uint8_t *ad, + uint8_t data_len, + int8_t rssi) +{ + bt_addr_le_t* temp = NULL; + uint64_t timestamp = millis(); + uint8_t index = BLE_MAX_ADV_BUFFER_CFG; + uint8_t i = 0; + bool retval = false; + //pr_debug(LOG_MODULE_BLE, "%s-%d-1", __FUNCTION__, __LINE__); + for (i = 0; i < BLE_MAX_ADV_BUFFER_CFG; i++) + { + temp = &_peer_adv_buffer[i]; + + if (bt_addr_le_cmp(temp, bt_addr) == 0) + { + // The device alread in the buffer + index = i; + break; + } + } + + //pr_debug(LOG_MODULE_BLE, "%s-%d", __FUNCTION__, __LINE__); + if (index < BLE_MAX_ADV_BUFFER_CFG) + { + if (data_len > BLE_MAX_ADV_SIZE) + { + data_len = BLE_MAX_ADV_SIZE; + } + memcpy(_peer_scan_rsp_data[index], ad, data_len); + _peer_scan_rsp_data_len[index] = data_len; + //_peer_adv_rssi[index] = rssi; + // Update the timestamp + _peer_adv_mill[index] = timestamp; retval = true; } return retval; } + +uint8_t BLEDeviceManager::getTempAdvertiseIndexFromBuffer(const bt_addr_le_t* bt_addr) +{ + bt_addr_le_t* temp = NULL; + uint8_t i = 0; + + for (i = 0; i < BLE_MAX_ADV_BUFFER_CFG; i++) + { + temp = &_peer_temp_adv_buffer[i]; + + if (bt_addr_le_cmp(temp, bt_addr) == 0) + { + // The device alread in the buffer + break; + } + } + + return i; +} + +void BLEDeviceManager::setTempAdvertiseBuffer(const bt_addr_le_t* bt_addr, + int8_t rssi, + const uint8_t *ad, + uint8_t data_len, + bool connectable) +{ + bt_addr_le_t* temp = NULL; + uint8_t i = getTempAdvertiseIndexFromBuffer(bt_addr); + if (i >= BLE_MAX_ADV_BUFFER_CFG) + { + _peer_temp_dev_index = (_peer_temp_dev_index + 1) % BLE_MAX_ADV_BUFFER_CFG; + i = _peer_temp_dev_index; + } + + temp = &_peer_temp_adv_buffer[i]; + memcpy(temp, bt_addr, sizeof (bt_addr_le_t)); + if (data_len > BLE_MAX_ADV_SIZE) + { + data_len = BLE_MAX_ADV_SIZE; + } + + memcpy(_peer_temp_adv_data[i], ad, data_len); + _peer_temp_adv_data_len[i] = data_len; + _peer_temp_adv_connectable[i] = connectable; + + return; +} + +void BLEDeviceManager::advertiseAcceptHandler(const bt_addr_le_t *addr, + int8_t rssi, + uint8_t type, + const uint8_t *ad, + uint8_t data_len) +{ + if (true == BLEUtils::macAddressValid(_wait_for_connect_peripheral)) + { + // Not add to the buffer when try to establish the connection + if (true == BLEUtils::macAddressSame(*addr, _wait_for_connect_peripheral)) + { + BLEDevice testdev(addr); + stopScanning(); + connectToDevice(testdev); + } + } + else + { + const uint8_t *adv_data = ad; + uint8_t adv_data_len = data_len; + bool connectable = (BT_LE_ADV_NONCONN_IND != type); + bool update_advertise_data = true; + // The critical is accepted + // Find the oldest and expired buffer + if (BT_LE_ADV_SCAN_RSP == type) + { + update_advertise_data = false; + pr_debug(LOG_MODULE_BLE, "%s-%d", __FUNCTION__, __LINE__); + if (false == setScanRespBuffer(addr, ad, data_len, rssi)) + { + // Find the device in the ADV temp buffer + uint8_t tempIndex = getTempAdvertiseIndexFromBuffer(addr); + if (tempIndex < BLE_MAX_ADV_BUFFER_CFG) + { + adv_data = _peer_temp_adv_data[tempIndex]; + adv_data_len = _peer_temp_adv_data_len[tempIndex]; + connectable = _peer_temp_adv_connectable[tempIndex]; + update_advertise_data = true; + } + } + } + pr_debug(LOG_MODULE_BLE, "%s-%d", __FUNCTION__, __LINE__); + + if (true == update_advertise_data) + { + if (false == setAdvertiseBuffer(addr, + adv_data, + adv_data_len, + rssi, + connectable)) + { + pr_info(LOG_MODULE_BLE, "No buffer to store the ADV\n"); + } + else if (BT_LE_ADV_SCAN_RSP == type) + { + setScanRespBuffer(addr, ad, data_len, rssi); + } + } + } +} + void BLEDeviceManager::handleDeviceFound(const bt_addr_le_t *addr, int8_t rssi, uint8_t type, @@ -1319,60 +1602,52 @@ void BLEDeviceManager::handleDeviceFound(const bt_addr_le_t *addr, uint8_t real_adv_len = data_len; /* We're only interested in connectable events */ - if (type == BT_LE_ADV_IND || type == BT_LE_ADV_DIRECT_IND) + //pr_debug(LOG_MODULE_BLE, "%s-%d", __FUNCTION__, __LINE__); + // Filter address + if (BLEUtils::macAddressValid(_adv_accept_device) == true && + (memcmp(addr->val, _adv_accept_device.val, sizeof (addr->val)) != 0)) + { + pr_debug(LOG_MODULE_BLE, "%s-%d", __FUNCTION__, __LINE__); + return; + } + + while (data_len > 1) { - //pr_debug(LOG_MODULE_BLE, "%s-%d", __FUNCTION__, __LINE__); - // Filter address - if (BLEUtils::macAddressValid(_adv_accept_device) == true && - (memcmp(addr->val, _adv_accept_device.val, sizeof (addr->val)) != 0)) + uint8_t len = data[0]; + + /* Check for early termination */ + if (len == 0) { return; } - - while (data_len > 1) - { - uint8_t len = data[0]; - /* Check for early termination */ - if (len == 0) - { - return; - } - - if ((len + 1) > data_len) { // Sid. KW, cannot be (data_len < 2) - pr_info(LOG_MODULE_BLE, "AD malformed\n"); - return; - } - - if (true == advertiseDataProc(data[1], &data[2], len - 1)) - { - if (true == BLEUtils::macAddressValid(_wait_for_connect_peripheral)) - { - // Not add to the buffer when try to establish the connection - if (true == BLEUtils::macAddressSame(*addr, _wait_for_connect_peripheral)) - { - BLEDevice testdev(addr); - stopScanning(); - connectToDevice(testdev); - } - } - else - { - // The critical is accepted - // Find the oldest and expired buffer - if(false == setAdvertiseBuffer(addr, ad, real_adv_len, rssi)) - { - pr_info(LOG_MODULE_BLE, "No buffer to store the ADV\n"); - } - } - pr_debug(LOG_MODULE_BLE, "%s-%d: Done", __FUNCTION__, __LINE__); - return; - } + if ((len + 1) > data_len) { // Sid. KW, cannot be (data_len < 2) + pr_info(LOG_MODULE_BLE, "AD malformed\n"); + return; + } - data_len -= len + 1; - data += len + 1; + if (true == advertiseDataProc(data[1], &data[2], len - 1)) + { + advertiseAcceptHandler(addr, rssi, type, ad, real_adv_len); + //pr_debug(LOG_MODULE_BLE, "%s-%d: Done", __FUNCTION__, __LINE__); + return; } - //pr_debug(LOG_MODULE_BLE, "%s: done", __FUNCTION__); + + data_len -= len + 1; + data += len + 1; + } + //pr_debug(LOG_MODULE_BLE, "%s: done", __FUNCTION__); + // Doesn't accept the ADV/scan data + // Check it in the buffer + if (BT_LE_ADV_SCAN_RSP == type) + { + // Find the ADV and set response + setScanRespBuffer(addr, ad, real_adv_len, rssi); + } + else + { + // Add advertise into buffer + setTempAdvertiseBuffer(addr, rssi, ad, real_adv_len, BT_LE_ADV_NONCONN_IND != type); } } diff --git a/libraries/CurieBLE/src/internal/BLEDeviceManager.h b/libraries/CurieBLE/src/internal/BLEDeviceManager.h index e09bfe6c..118c4c11 100644 --- a/libraries/CurieBLE/src/internal/BLEDeviceManager.h +++ b/libraries/CurieBLE/src/internal/BLEDeviceManager.h @@ -140,6 +140,10 @@ class BLEDeviceManager */ void setManufacturerData(const unsigned char manufacturerData[], unsigned char manufacturerDataLength); + bool getManufacturerData (const BLEDevice* device, + uint8_t* manu_data, + uint8_t&manu_data_len) const; + bool hasManufacturerData(const BLEDevice* device) const; /** * Set the local name that the BLE Peripheral Device advertises @@ -350,6 +354,9 @@ class BLEDeviceManager protected: private: + BLE_STATUS_T setAdvertiseData (uint8_t type, + const uint8_t* data, + uint8_t length); BLE_STATUS_T _advDataInit(void); bool advertiseDataProc(uint8_t type, const uint8_t *dataPtr, @@ -357,13 +364,36 @@ class BLEDeviceManager bool setAdvertiseBuffer(const bt_addr_le_t* bt_addr, const uint8_t *ad, uint8_t data_len, - int8_t rssi); + int8_t rssi, + bool connectable); void getDeviceAdvertiseBuffer(const bt_addr_le_t* addr, const uint8_t* &adv_data, uint8_t &adv_len) const; + bool setScanRespBuffer(const bt_addr_le_t* bt_addr, + const uint8_t *ad, + uint8_t data_len, + int8_t rssi); + void getDeviceScanResponseBuffer(const bt_addr_le_t* addr, + const uint8_t* &adv_data, + uint8_t &adv_len) const; + bool getDataFromAdvertiseByType(const BLEDevice* device, + const uint8_t eir_type, + const uint8_t* &data, + uint8_t &data_len) const; bool disconnectSingle(const bt_addr_le_t *peer); void updateDuplicateFilter(const bt_addr_le_t* addr); bool deviceInDuplicateFilterBuffer(const bt_addr_le_t* addr); + void advertiseAcceptHandler(const bt_addr_le_t *addr, + int8_t rssi, + uint8_t type, + const uint8_t *ad, + uint8_t data_len); + void setTempAdvertiseBuffer(const bt_addr_le_t* bt_addr, + int8_t rssi, + const uint8_t *ad, + uint8_t data_len, + bool connectable); + uint8_t getTempAdvertiseIndexFromBuffer(const bt_addr_le_t* bt_addr); private: uint16_t _min_conn_interval; @@ -377,7 +407,19 @@ class BLEDeviceManager uint64_t _peer_adv_mill[BLE_MAX_ADV_BUFFER_CFG]; // The ADV found time stamp uint8_t _peer_adv_data[BLE_MAX_ADV_BUFFER_CFG][BLE_MAX_ADV_SIZE]; uint8_t _peer_adv_data_len[BLE_MAX_ADV_BUFFER_CFG]; + uint8_t _peer_scan_rsp_data[BLE_MAX_ADV_BUFFER_CFG][BLE_MAX_ADV_SIZE]; + uint8_t _peer_scan_rsp_data_len[BLE_MAX_ADV_BUFFER_CFG]; int8_t _peer_adv_rssi[BLE_MAX_ADV_BUFFER_CFG]; + bool _peer_adv_connectable[BLE_MAX_ADV_BUFFER_CFG]; + + // The accept critical may include in scan response + bt_addr_le_t _peer_temp_adv_buffer[BLE_MAX_ADV_BUFFER_CFG]; + uint8_t _peer_temp_dev_index; + uint8_t _peer_temp_adv_data[BLE_MAX_ADV_BUFFER_CFG][BLE_MAX_ADV_SIZE]; + uint8_t _peer_temp_adv_data_len[BLE_MAX_ADV_BUFFER_CFG]; + bool _peer_temp_adv_connectable[BLE_MAX_ADV_BUFFER_CFG]; + + // The critical for central scan bt_data_t _adv_accept_critical; // The filters for central device String _adv_critical_local_name; bt_uuid_128_t _adv_critical_service_uuid; @@ -386,12 +428,17 @@ class BLEDeviceManager bt_addr_le_t _wait_for_connect_peripheral; uint8_t _wait_for_connect_peripheral_adv_data[BLE_MAX_ADV_SIZE]; uint8_t _wait_for_connect_peripheral_adv_data_len; + uint8_t _wait_for_connect_peripheral_scan_rsp_data[BLE_MAX_ADV_SIZE]; + uint8_t _wait_for_connect_peripheral_scan_rsp_data_len; int8_t _wait_for_connect_peripheral_adv_rssi; bt_addr_le_t _available_for_connect_peripheral; uint8_t _available_for_connect_peripheral_adv_data[BLE_MAX_ADV_SIZE]; uint8_t _available_for_connect_peripheral_adv_data_len; + uint8_t _available_for_connect_peripheral_scan_rsp_data[BLE_MAX_ADV_SIZE]; + uint8_t _available_for_connect_peripheral_scan_rsp_data_len; int8_t _available_for_connect_peripheral_adv_rssi; + bool _available_for_connect_peripheral_connectable; volatile bool _connecting; // For peripheral @@ -412,6 +459,8 @@ class BLEDeviceManager uint8_t _adv_type; bt_data_t _adv_data[6]; // KW: fount _advDataInit() can use 6 slots. size_t _adv_data_idx; + bt_data_t _scan_rsp_data[6]; + size_t _scan_rsp_data_idx; String _local_name; // Peripheral states @@ -433,6 +482,8 @@ class BLEDeviceManager uint8_t _peer_peripheral_index; uint8_t _peer_peripheral_adv_data[BLE_MAX_CONN_CFG][BLE_MAX_ADV_SIZE]; uint8_t _peer_peripheral_adv_data_len[BLE_MAX_CONN_CFG]; + uint8_t _peer_peripheral_scan_rsp_data[BLE_MAX_CONN_CFG][BLE_MAX_ADV_SIZE]; + uint8_t _peer_peripheral_scan_rsp_data_len[BLE_MAX_CONN_CFG]; uint8_t _peer_peripheral_adv_rssi[BLE_MAX_CONN_CFG]; bt_addr_le_t _peer_duplicate_address_buffer[BLE_MAX_ADV_FILTER_SIZE_CFG]; uint8_t _duplicate_filter_header; From c9129264b89dc92bcb17233b864550660b25200a Mon Sep 17 00:00:00 2001 From: lianggao Date: Thu, 2 Mar 2017 15:18:23 +0800 Subject: [PATCH 34/91] Jira 868, BLE Peripheral stack crash with long write, git456 Root cause: - Upon processing the write event, The received user data was casted incorrectly using the base class. Resulted in using an incorrect offset that caused memcpy to use incorrect address and length. Code Mods: 1. BLECallbacks.cpp: Adjust the typecast order, from base class to child class in profile_longwrite_process() and profile_longflush_process(). --- libraries/CurieBLE/src/internal/BLECallbacks.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/libraries/CurieBLE/src/internal/BLECallbacks.cpp b/libraries/CurieBLE/src/internal/BLECallbacks.cpp index edfcaeec..328c196b 100644 --- a/libraries/CurieBLE/src/internal/BLECallbacks.cpp +++ b/libraries/CurieBLE/src/internal/BLECallbacks.cpp @@ -77,7 +77,13 @@ ssize_t profile_longwrite_process(struct bt_conn *conn, const void *buf, uint16_t len, uint16_t offset) { - BLECharacteristicImp *blecharacteritic = (BLECharacteristicImp*)attr->user_data; + BLEAttribute *bleattr = (BLEAttribute *)attr->user_data; + BLEAttributeType type = bleattr->type(); + if (BLETypeCharacteristic != type) + { + return 0; + } + BLECharacteristicImp *blecharacteritic = (BLECharacteristicImp*)bleattr; blecharacteritic->setBuffer((const uint8_t *) buf, len, offset); @@ -88,7 +94,13 @@ int profile_longflush_process(struct bt_conn *conn, const struct bt_gatt_attr *attr, uint8_t flags) { - BLECharacteristicImp *blecharacteritic = (BLECharacteristicImp*)attr->user_data; + BLEAttribute *bleattr = (BLEAttribute *)attr->user_data; + BLEAttributeType type = bleattr->type(); + if (BLETypeCharacteristic != type) + { + return 0; + } + BLECharacteristicImp *blecharacteritic = (BLECharacteristicImp*)bleattr; switch (flags) { From 17d642b7324c7610b6c5a669fc4ffc3e4230d9e0 Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Tue, 31 Jan 2017 09:46:55 +0100 Subject: [PATCH 35/91] Fix arduino101load argument passing if binary path contains spaces --- platform.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform.txt b/platform.txt index 308ce967..e60f5ceb 100644 --- a/platform.txt +++ b/platform.txt @@ -103,7 +103,7 @@ tools.arduino101load.cmd.path={runtime.tools.arduino101load.path}/arduino101load tools.arduino101load.upload.params.verbose=verbose tools.arduino101load.upload.params.quiet=quiet -tools.arduino101load.upload.pattern="{cmd.path}" "{runtime.tools.arduino101load.path}/x86/bin" {build.path}/{build.project_name}.bin {serial.port} "{upload.verbose}" {ble.fw.string} {ble.fw.position} +tools.arduino101load.upload.pattern="{cmd.path}" "{runtime.tools.arduino101load.path}/x86/bin" "{build.path}/{build.project_name}.bin" {serial.port} "{upload.verbose}" {ble.fw.string} {ble.fw.position} # This is needed to avoid an error on unexistent fields tools.arduino101load.erase.params.verbose= From 037654751d5e65a03882f8837f60962cb7fe3559 Mon Sep 17 00:00:00 2001 From: Sidney Leung Date: Fri, 3 Mar 2017 17:00:43 -0800 Subject: [PATCH 36/91] Jira 870, Change sensortag_button.ino to use localName Feature added: - Since the BLE library now support the Scan Response Data processing, update the sketch to look for the sensorTag localName instead of its specific unit address. Cod mods: 1. sensortag_button.ino: - Replace MAC address comparison with localName string comparison. --- .../sensortag_button/sensortag_button.ino | 23 +++++-------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/libraries/CurieBLE/examples/central/sensortag_button/sensortag_button.ino b/libraries/CurieBLE/examples/central/sensortag_button/sensortag_button.ino index de85c6a8..3209012f 100644 --- a/libraries/CurieBLE/examples/central/sensortag_button/sensortag_button.ino +++ b/libraries/CurieBLE/examples/central/sensortag_button/sensortag_button.ino @@ -43,23 +43,12 @@ void loop() { Serial.print(peripheral.advertisedServiceUuid()); Serial.println(); - /*see if peripheral is a SensorTag - The localName SensorTag is in the Scan Response data packet - In this release we do not have the feature that gets the scan response data and hence - the local name in the scan is blank - We have to explicitly find the BLE mac address - Please use another deviice like nrfConnect app to discover the Bluetooth Address - */ - //if (peripheral.localName() == "SensorTag") { - - - /****************************************************** - * ATTENTION: - * Change to the mac address according to your device! - * Use a central app that can display the BT MAC address - * ****************************************************** - */ - if (peripheral.address() == "68:C9:0B:06:BC:81") { + /* see if peripheral is a SensorTag + * The localName, CC2650 SensorTag, is in the Scan Response Data packet. + * If this is not the expected name, please change the following + * if-statement accordingly. + */ + if (peripheral.localName() == "CC2650 SensorTag") { // stop scanning BLE.stopScan(); From 76f7d75160e04ec37eda3e189b705f9a5a4f6b74 Mon Sep 17 00:00:00 2001 From: Noel F Paz Date: Wed, 8 Mar 2017 17:29:03 -0800 Subject: [PATCH 37/91] Modify comments to point to Paul Stoffregen's Serial Flash library in github --- .../examples/CopyFromSerial/CopyFromSerial.ino | 3 ++- .../examples/EraseEverything/EraseEverything.ino | 3 ++- libraries/CurieSerialFlash/examples/FileWrite/FileWrite.ino | 3 ++- libraries/CurieSerialFlash/examples/ListFiles/ListFiles.ino | 3 ++- .../examples/RawHardwareTest/RawHardwareTest.ino | 4 ++-- 5 files changed, 10 insertions(+), 6 deletions(-) diff --git a/libraries/CurieSerialFlash/examples/CopyFromSerial/CopyFromSerial.ino b/libraries/CurieSerialFlash/examples/CopyFromSerial/CopyFromSerial.ino index 85723894..68a30af3 100644 --- a/libraries/CurieSerialFlash/examples/CopyFromSerial/CopyFromSerial.ino +++ b/libraries/CurieSerialFlash/examples/CopyFromSerial/CopyFromSerial.ino @@ -58,7 +58,8 @@ * * SerialFlash library API: https://github.com/PaulStoffregen/SerialFlash * - * This example depens on http://librarymanager/all#SerialFlash&SPI (clickme!) + * This example depends on Paul Stoffregen's SerialFlash library. + * Download at https://github.com/PaulStoffregen/SerialFlash. */ #include diff --git a/libraries/CurieSerialFlash/examples/EraseEverything/EraseEverything.ino b/libraries/CurieSerialFlash/examples/EraseEverything/EraseEverything.ino index c79bf5fa..43425324 100644 --- a/libraries/CurieSerialFlash/examples/EraseEverything/EraseEverything.ino +++ b/libraries/CurieSerialFlash/examples/EraseEverything/EraseEverything.ino @@ -1,4 +1,5 @@ -// This example depens on http://librarymanager/all#SerialFlash&SPI (clickme!) +// This example depends on Paul Stoffregen's SerialFlash library +// Download at https://github.com/PaulStoffregen/SerialFlash #include #include diff --git a/libraries/CurieSerialFlash/examples/FileWrite/FileWrite.ino b/libraries/CurieSerialFlash/examples/FileWrite/FileWrite.ino index 3e10bc84..e9f5ab9a 100755 --- a/libraries/CurieSerialFlash/examples/FileWrite/FileWrite.ino +++ b/libraries/CurieSerialFlash/examples/FileWrite/FileWrite.ino @@ -1,4 +1,5 @@ -// This example depens on http://librarymanager/all#SerialFlash&SPI (clickme!) +// This example depends on Paul Stoffregen's SerialFlash library +// Download at https://github.com/PaulStoffregen/SerialFlash #include #include diff --git a/libraries/CurieSerialFlash/examples/ListFiles/ListFiles.ino b/libraries/CurieSerialFlash/examples/ListFiles/ListFiles.ino index 21888537..6dfda8b7 100644 --- a/libraries/CurieSerialFlash/examples/ListFiles/ListFiles.ino +++ b/libraries/CurieSerialFlash/examples/ListFiles/ListFiles.ino @@ -1,4 +1,5 @@ -// This example depens on http://librarymanager/all#SerialFlash&SPI (clickme!) +// This example depends on Paul Stoffregen's SerialFlash library +// Download at https://github.com/PaulStoffregen/SerialFlash #include #include diff --git a/libraries/CurieSerialFlash/examples/RawHardwareTest/RawHardwareTest.ino b/libraries/CurieSerialFlash/examples/RawHardwareTest/RawHardwareTest.ino index 453bb123..a124010f 100644 --- a/libraries/CurieSerialFlash/examples/RawHardwareTest/RawHardwareTest.ino +++ b/libraries/CurieSerialFlash/examples/RawHardwareTest/RawHardwareTest.ino @@ -19,8 +19,8 @@ // You MUST post the complete output of this program, and // the exact part number and manufacturer of the chip. // -// This example depens on http://librarymanager/all#SerialFlash&SPI (clickme!) - +// This example depends on Paul Stoffregen's SerialFlash library +// Download at https://github.com/PaulStoffregen/SerialFlash #include #include From 9c079d15befd3faf2701ab81fdf85d2cf3b9c428 Mon Sep 17 00:00:00 2001 From: Erik Nyquist Date: Wed, 8 Mar 2017 14:01:07 -0800 Subject: [PATCH 38/91] SerialFlash: fix compile errors Old SerialFlash directory was still there-- delete it --- .../CopyFromSerial/CopyFromSerial.ino | 267 ------------------ 1 file changed, 267 deletions(-) delete mode 100644 libraries/SerialFlash/examples/CopyFromSerial/CopyFromSerial.ino diff --git a/libraries/SerialFlash/examples/CopyFromSerial/CopyFromSerial.ino b/libraries/SerialFlash/examples/CopyFromSerial/CopyFromSerial.ino deleted file mode 100644 index 6d1af440..00000000 --- a/libraries/SerialFlash/examples/CopyFromSerial/CopyFromSerial.ino +++ /dev/null @@ -1,267 +0,0 @@ -/* - * This is free and unencumbered software released into the public domain. - * - * Anyone is free to copy, modify, publish, use, compile, sell, or - * distribute this software, either in source code form or as a compiled - * binary, for any purpose, commercial or non-commercial, and by any - * means. - * - * In jurisdictions that recognize copyright laws, the author or authors - * of this software dedicate any and all copyright interest in the - * software to the public domain. We make this dedication for the benefit - * of the public at large and to the detriment of our heirs and - * successors. We intend this dedication to be an overt act of - * relinquishment in perpetuity of all present and future rights to this - * software under copyright law. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - * - * For more information, please refer to - * ------------------------------------------------------------------------- - * - * This is example code to 1) format an SPI Flash chip, and 2) copy raw - * audio files (mono channel, 16 bit signed, 44100Hz) to it using the - * SerialFlash library. The audio can then be played back using the - * AudioPlaySerialflashRaw object in the Teensy Audio library. - * - * To convert a .wav file to the proper .RAW format, use sox: - * sox input.wav -r 44100 -b 16 --norm -e signed-integer -t raw OUTPUT.RAW remix 1,2 - * - * Note that the OUTPUT.RAW filename must be all caps and contain only the following - * characters: A-Z, 0-9, comma, period, colon, dash, underscore. (The SerialFlash - * library converts filenames to caps, so to avoid confusion we just enforce it here). - * - * It is a little difficult to see what is happening; aswe are using the Serial port - * to upload files, we can't just throw out debug information. Instead, we use the LED - * (pin 13) to convey state. - * - * While the chip is being formatted, the LED (pin 13) will toggle at 1Hz rate. When - * the formatting is done, it flashes quickly (10Hz) for one second, then stays on - * solid. When nothing has been received for 3 seconds, the upload is assumed to be - * completed, and the light goes off. - * - * Use the 'rawfile-uploader.py' python script (included in the extras folder) to upload - * the files. You can start the script as soon as the Teensy is turned on, and the - * USB serial upload will just buffer and wait until the flash is formatted. - * - * This code was written by Wyatt Olson (originally as part - * of Drum Master http://drummaster.digitalcave.ca and later modified into a - * standalone sample). - * - * Enjoy! - * - * SerialFlash library API: https://github.com/PaulStoffregen/SerialFlash - */ - -#include -#include - -//Buffer sizes -#define USB_BUFFER_SIZE 128 -#define FLASH_BUFFER_SIZE 4096 - -//Max filename length (8.3 plus a null char terminator) -#define FILENAME_STRING_SIZE 13 - -//State machine -#define STATE_START 0 -#define STATE_SIZE 1 -#define STATE_CONTENT 2 - -//Special bytes in the communication protocol -#define BYTE_START 0x7e -#define BYTE_ESCAPE 0x7d -#define BYTE_SEPARATOR 0x7c - -#define CSPIN 21 - -void setup(){ - Serial.begin(9600); // initialize Serial communication - while(!Serial) ; // wait for serial port to connect. - - pinMode(13, OUTPUT); - - SerialFlash.begin(CSPIN); - - //We start by formatting the flash... - uint8_t id[5]; - SerialFlash.readID(id); - SerialFlash.eraseAll(); - - //Flash LED at 1Hz while formatting - while (!SerialFlash.ready()) { - delay(500); - digitalWrite(13, HIGH); - delay(500); - digitalWrite(13, LOW); - } - - //Quickly flash LED a few times when completed, then leave the light on solid - for(uint8_t i = 0; i < 10; i++){ - delay(100); - digitalWrite(13, HIGH); - delay(100); - digitalWrite(13, LOW); - } - digitalWrite(13, HIGH); - - //We are now going to wait for the upload program - while(!Serial.available()); - - SerialFlashFile flashFile; - - uint8_t state = STATE_START; - uint8_t escape = 0; - uint8_t fileSizeIndex = 0; - uint32_t fileSize = 0; - char filename[FILENAME_STRING_SIZE]; - - char usbBuffer[USB_BUFFER_SIZE]; - uint8_t flashBuffer[FLASH_BUFFER_SIZE]; - - uint16_t flashBufferIndex = 0; - uint8_t filenameIndex = 0; - - uint32_t lastReceiveTime = millis(); - - //We assume the serial receive part is finished when we have not received something for 3 seconds - while(Serial.available() || lastReceiveTime + 3000 > millis()){ - uint16_t available = Serial.readBytes(usbBuffer, USB_BUFFER_SIZE); - if (available){ - lastReceiveTime = millis(); - } - - for (uint16_t usbBufferIndex = 0; usbBufferIndex < available; usbBufferIndex++){ - uint8_t b = usbBuffer[usbBufferIndex]; - - if (state == STATE_START){ - //Start byte. Repeat start is fine. - if (b == BYTE_START){ - for (uint8_t i = 0; i < FILENAME_STRING_SIZE; i++){ - filename[i] = 0x00; - } - filenameIndex = 0; - } - //Valid characters are A-Z, 0-9, comma, period, colon, dash, underscore - else if ((b >= 'A' && b <= 'Z') || (b >= '0' && b <= '9') || b == '.' || b == ',' || b == ':' || b == '-' || b == '_'){ - filename[filenameIndex++] = b; - if (filenameIndex >= FILENAME_STRING_SIZE){ - //Error name too long - flushError(); - return; - } - } - //Filename end character - else if (b == BYTE_SEPARATOR){ - if (filenameIndex == 0){ - //Error empty filename - flushError(); - return; - } - - //Change state - state = STATE_SIZE; - fileSizeIndex = 0; - fileSize = 0; - - } - //Invalid character - else { - //Error bad filename - flushError(); - return; - } - } - //We read 4 bytes as a uint32_t for file size - else if (state == STATE_SIZE){ - if (fileSizeIndex < 4){ - fileSize = (fileSize << 8) + b; - fileSizeIndex++; - } - else if (b == BYTE_SEPARATOR){ - state = STATE_CONTENT; - flashBufferIndex = 0; - escape = 0; - - if (SerialFlash.exists(filename)){ - SerialFlash.remove(filename); //It doesn't reclaim the space, but it does let you create a new file with the same name. - } - - //Create a new file and open it for writing - if (SerialFlash.create(filename, fileSize)) { - flashFile = SerialFlash.open(filename); - if (!flashFile) { - //Error flash file open - flushError(); - return; - } - } - else { - //Error flash create (no room left?) - flushError(); - return; - } - } - else { - //Error invalid length requested - flushError(); - return; - } - } - else if (state == STATE_CONTENT){ - //Previous byte was escaped; unescape and add to buffer - if (escape){ - escape = 0; - flashBuffer[flashBufferIndex++] = b ^ 0x20; - } - //Escape the next byte - else if (b == BYTE_ESCAPE){ - //Serial.println("esc"); - escape = 1; - } - //End of file - else if (b == BYTE_START){ - //Serial.println("End of file"); - state = STATE_START; - flashFile.write(flashBuffer, flashBufferIndex); - flashFile.close(); - flashBufferIndex = 0; - } - //Normal byte; add to buffer - else { - flashBuffer[flashBufferIndex++] = b; - } - - //The buffer is filled; write to SD card - if (flashBufferIndex >= FLASH_BUFFER_SIZE){ - flashFile.write(flashBuffer, FLASH_BUFFER_SIZE); - flashBufferIndex = 0; - } - } - } - } - - //Success! Turn the light off. - digitalWrite(13, LOW); -} - -void loop(){ - //Do nothing. -} - -void flushError(){ - uint32_t lastReceiveTime = millis(); - char usbBuffer[USB_BUFFER_SIZE]; - //We assume the serial receive part is finished when we have not received something for 3 seconds - while(Serial.available() || lastReceiveTime + 3000 > millis()){ - if (Serial.readBytes(usbBuffer, USB_BUFFER_SIZE)){ - lastReceiveTime = millis(); - } - } -} From 80cf4edb532693c2dcad4f6bbbcbaa23dd655e16 Mon Sep 17 00:00:00 2001 From: Yashaswini Hanji Date: Fri, 10 Mar 2017 13:02:56 -0800 Subject: [PATCH 39/91] [TEMP] remove test direcyory from CurieBLE examples --- .../examples/test/CallbackLED/CallbackLED.ino | 90 -- .../Genuino101CurieBLEHeartRateMonitor.ino | 112 --- .../StandardFirmataBLE/BLEStream.h | 243 ----- .../StandardFirmataBLE/StandardFirmataBLE.ino | 853 ------------------ .../StandardFirmataBLE/bleConfig.h | 112 --- .../discoveratperipheral.ino | 124 --- .../profileatcentral/profileatcentral.ino | 91 -- 7 files changed, 1625 deletions(-) delete mode 100644 libraries/CurieBLE/examples/test/CallbackLED/CallbackLED.ino delete mode 100644 libraries/CurieBLE/examples/test/CommunitySketches/Genuino101CurieBLEHeartRateMonitor/Genuino101CurieBLEHeartRateMonitor.ino delete mode 100644 libraries/CurieBLE/examples/test/CommunitySketches/StandardFirmataBLE/BLEStream.h delete mode 100644 libraries/CurieBLE/examples/test/CommunitySketches/StandardFirmataBLE/StandardFirmataBLE.ino delete mode 100644 libraries/CurieBLE/examples/test/CommunitySketches/StandardFirmataBLE/bleConfig.h delete mode 100644 libraries/CurieBLE/examples/test/discoveratperipheral/discoveratperipheral.ino delete mode 100644 libraries/CurieBLE/examples/test/profileatcentral/profileatcentral.ino diff --git a/libraries/CurieBLE/examples/test/CallbackLED/CallbackLED.ino b/libraries/CurieBLE/examples/test/CallbackLED/CallbackLED.ino deleted file mode 100644 index 7cbcd21b..00000000 --- a/libraries/CurieBLE/examples/test/CallbackLED/CallbackLED.ino +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (c) 2016 Intel Corporation. All rights reserved. - * See the bottom of this file for the license terms. - */ - -#include "CurieBLE.h" - -const int ledPin = 13; // set ledPin to use on-board LED -BLEPeripheral blePeripheral; // create peripheral instance - -BLEService ledService("19B10000-E8F2-537E-4F6C-D104768A1214"); // create service - -// create switch characteristic and allow remote device to read and write -BLECharCharacteristic switchChar("19B10001-E8F2-537E-4F6C-D104768A1214", BLERead | BLEWrite); - -void setup() { - Serial.begin(9600); - pinMode(ledPin, OUTPUT); // use the LED on pin 13 as an output - - // set the local name peripheral advertises - blePeripheral.setLocalName("LEDCB"); - // set the UUID for the service this peripheral advertises - blePeripheral.setAdvertisedServiceUuid(ledService.uuid()); - - // add service and characteristic - blePeripheral.addAttribute(ledService); - blePeripheral.addAttribute(switchChar); - - // assign event handlers for connected, disconnected to peripheral - blePeripheral.setEventHandler(BLEConnected, blePeripheralConnectHandler); - blePeripheral.setEventHandler(BLEDisconnected, blePeripheralDisconnectHandler); - - // assign event handlers for characteristic - switchChar.setEventHandler(BLEWritten, switchCharacteristicWritten); -// set an initial value for the characteristic - switchChar.setValue(0); - - // advertise the service - blePeripheral.begin(); - Serial.println(("Bluetooth device active, waiting for connections...")); -} - -void loop() { - // poll peripheral - blePeripheral.poll(); -} - -void blePeripheralConnectHandler(BLECentral& central) { - // central connected event handler - Serial.print("Connected event, central: "); - Serial.println(central.address()); -} - -void blePeripheralDisconnectHandler(BLECentral& central) { - // central disconnected event handler - Serial.print("Disconnected event, central: "); - Serial.println(central.address()); -} - -void switchCharacteristicWritten(BLEDevice central, BLECharacteristic characteristic) { - // central wrote new value to characteristic, update LED - Serial.print("Characteristic event, written: "); - - if (switchChar.value()) { - Serial.println("LED on"); - digitalWrite(ledPin, HIGH); - } else { - Serial.println("LED off"); - digitalWrite(ledPin, LOW); - } -} - -/* - Copyright (c) 2016 Intel Corporation. All rights reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110- - 1301 USA -*/ diff --git a/libraries/CurieBLE/examples/test/CommunitySketches/Genuino101CurieBLEHeartRateMonitor/Genuino101CurieBLEHeartRateMonitor.ino b/libraries/CurieBLE/examples/test/CommunitySketches/Genuino101CurieBLEHeartRateMonitor/Genuino101CurieBLEHeartRateMonitor.ino deleted file mode 100644 index 5428572f..00000000 --- a/libraries/CurieBLE/examples/test/CommunitySketches/Genuino101CurieBLEHeartRateMonitor/Genuino101CurieBLEHeartRateMonitor.ino +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright (c) 2016 Intel Corporation. All rights reserved. - * See the bottom of this file for the license terms. - */ - -/* - * Sketch: Genuino101CurieBLEHeartRateMonitor.ino. - * - * Description: - * This sketch example partially implements the standard Bluetooth Low-Energy - * Heart Rate service. For more information: - * https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx - * - */ - -#include - -BLEPeripheral blePeripheral; // BLE Peripheral Device (the board you're programming) -BLEService heartRateService("180D"); // BLE Heart Rate Service - -// BLE Heart Rate Measurement Characteristic" -BLECharacteristic heartRateChar("2A37", // standard 16-bit characteristic UUID - BLERead | BLENotify, 2); // remote clients will be able to get notifications if this characteristic changes - // the characteristic is 2 bytes long as the first field needs to be "Flags" as per BLE specifications - // https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.heart_rate_measurement.xml - -int oldHeartRate = 0; // last heart rate reading from analog input -long previousMillis = 0; // last time the heart rate was checked, in ms - -void setup() { - Serial.begin(9600); // initialize serial communication - pinMode(13, OUTPUT); // initialize the LED on pin 13 to indicate when a central is connected - - /* Set a local name for the BLE device - This name will appear in advertising packets - and can be used by remote devices to identify this BLE device - The name can be changed but maybe be truncated based on space left in advertisement packet */ - blePeripheral.setLocalName("HeartRateSketch"); - blePeripheral.setAdvertisedServiceUuid(heartRateService.uuid()); // add the service UUID - blePeripheral.addAttribute(heartRateService); // Add the BLE Heart Rate service - blePeripheral.addAttribute(heartRateChar); // add the Heart Rate Measurement characteristic - - /* Now activate the BLE device. It will start continuously transmitting BLE - advertising packets and will be visible to remote BLE central devices - until it receives a new connection */ - blePeripheral.begin(); - Serial.println("Bluetooth device active, waiting for connections..."); -} - -void loop() { - // listen for BLE peripherals to connect: - BLECentral central = blePeripheral.central(); - - // if a central is connected to peripheral: - if (central) { - Serial.print("Connected to central: "); - // print the central's MAC address: - Serial.println(central.address()); - // turn on the LED to indicate the connection: - digitalWrite(13, HIGH); - - // check the heart rate measurement every 200ms - // as long as the central is still connected: - while (central.connected()) { - long currentMillis = millis(); - // if 200ms have passed, check the heart rate measurement: - if (currentMillis - previousMillis >= 200) { - previousMillis = currentMillis; - updateHeartRate(); - } - } - // when the central disconnects, turn off the LED: - digitalWrite(13, LOW); - Serial.print("Disconnected from central: "); - Serial.println(central.address()); - } -} - -void updateHeartRate() { - /* Read the current voltage level on the A0 analog input pin. - This is used here to simulate the heart rate's measurement. - */ - int heartRateMeasurement = analogRead(A0); - int heartRate = map(heartRateMeasurement, 0, 1023, 0, 100); - if (heartRate != oldHeartRate) { // if the heart rate has changed - Serial.print("Heart Rate is now: "); // print it - Serial.println(heartRate); - const unsigned char heartRateCharArray[2] = { 0, (char)heartRate }; - heartRateChar.setValue(heartRateCharArray, 2); // and update the heart rate measurement characteristic - oldHeartRate = heartRate; // save the level for next comparison - } -} - -/* - Copyright (c) 2015 Intel Corporation. All rights reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - - diff --git a/libraries/CurieBLE/examples/test/CommunitySketches/StandardFirmataBLE/BLEStream.h b/libraries/CurieBLE/examples/test/CommunitySketches/StandardFirmataBLE/BLEStream.h deleted file mode 100644 index 87256762..00000000 --- a/libraries/CurieBLE/examples/test/CommunitySketches/StandardFirmataBLE/BLEStream.h +++ /dev/null @@ -1,243 +0,0 @@ -/* - BLEStream.h - - Based on BLESerial.cpp by Voita Molda - https://github.com/sandeepmistry/arduino-BLEPeripheral/blob/master/examples/serial/BLESerial.h - - Last updated April 4th, 2016 - */ - -#ifndef _BLE_STREAM_H_ -#define _BLE_STREAM_H_ - -#include -#if defined(_VARIANT_ARDUINO_101_X_) -#include -#define _MAX_ATTR_DATA_LEN_ BLE_MAX_ATTR_DATA_LEN -#else -//#include -#define _MAX_ATTR_DATA_LEN_ BLE_ATTRIBUTE_MAX_VALUE_LENGTH -#endif - -#define BLESTREAM_TXBUFFER_FLUSH_INTERVAL 80 -#define BLESTREAM_MIN_FLUSH_INTERVAL 8 // minimum interval for flushing the TX buffer - -// #define BLE_SERIAL_DEBUG - -class BLEStream : public BLEPeripheral, public Stream -{ - public: - BLEStream(unsigned char req = 0, unsigned char rdy = 0, unsigned char rst = 0); - - void begin(...); - bool poll(); - void end(); - void setFlushInterval(int); - - virtual int available(void); - virtual int peek(void); - virtual int read(void); - virtual void flush(void); - virtual size_t write(uint8_t byte); - using Print::write; - virtual operator bool(); - - private: - bool _connected; - unsigned long _flushed; - int _flushInterval; - static BLEStream* _instance; - - size_t _rxHead; - size_t _rxTail; - size_t _rxCount() const; - unsigned char _rxBuffer[256]; - size_t _txCount; - unsigned char _txBuffer[_MAX_ATTR_DATA_LEN_]; - - BLEService _uartService = BLEService("6E400001-B5A3-F393-E0A9-E50E24DCCA9E"); - BLEDescriptor _uartNameDescriptor = BLEDescriptor("2901", "UART"); - BLECharacteristic _rxCharacteristic = BLECharacteristic("6E400002-B5A3-F393-E0A9-E50E24DCCA9E", BLEWriteWithoutResponse, _MAX_ATTR_DATA_LEN_); - BLEDescriptor _rxNameDescriptor = BLEDescriptor("2901", "RX - Receive Data (Write)"); - BLECharacteristic _txCharacteristic = BLECharacteristic("6E400003-B5A3-F393-E0A9-E50E24DCCA9E", BLENotify, _MAX_ATTR_DATA_LEN_); - BLEDescriptor _txNameDescriptor = BLEDescriptor("2901", "TX - Transfer Data (Notify)"); - - void _received(const unsigned char* data, size_t size); - static void _received(BLECentral& /*central*/, BLECharacteristic& rxCharacteristic); -}; - - -/* - * BLEStream.cpp - * Copied here as a hack to avoid having to install the BLEPeripheral libarary even if it's - * not needed. - */ - -BLEStream* BLEStream::_instance = NULL; - -BLEStream::BLEStream(unsigned char req, unsigned char rdy, unsigned char rst) : -#if defined(_VARIANT_ARDUINO_101_X_) - BLEPeripheral() -#else - BLEPeripheral(req, rdy, rst) -#endif -{ - this->_txCount = 0; - this->_rxHead = this->_rxTail = 0; - this->_flushed = 0; - this->_flushInterval = BLESTREAM_TXBUFFER_FLUSH_INTERVAL; - BLEStream::_instance = this; - - addAttribute(this->_uartService); - addAttribute(this->_uartNameDescriptor); - setAdvertisedServiceUuid(this->_uartService.uuid()); - addAttribute(this->_rxCharacteristic); - addAttribute(this->_rxNameDescriptor); - this->_rxCharacteristic.setEventHandler(BLEWritten, BLEStream::_received); - addAttribute(this->_txCharacteristic); - addAttribute(this->_txNameDescriptor); -} - -void BLEStream::begin(...) -{ - BLEPeripheral::begin(); -#ifdef BLE_SERIAL_DEBUG - Serial.println(F("BLEStream::begin()")); -#endif -} - -bool BLEStream::poll() -{ - // BLEPeripheral::poll is called each time connected() is called - this->_connected = BLEPeripheral::connected(); - if (millis() > this->_flushed + this->_flushInterval) { - flush(); - } - return this->_connected; -} - -void BLEStream::end() -{ - this->_rxCharacteristic.setEventHandler(BLEWritten, (void(*)(BLECentral&, BLECharacteristic&))NULL); - this->_rxHead = this->_rxTail = 0; - flush(); - BLEPeripheral::disconnect(); -} - -int BLEStream::available(void) -{ -// BLEPeripheral::poll only calls delay(1) in CurieBLE so skipping it here to avoid the delay -#ifndef _VARIANT_ARDUINO_101_X_ - // TODO Need to do more testing to determine if all of these calls to BLEPeripheral::poll are - // actually necessary. Seems to run fine without them, but only minimal testing so far. - BLEPeripheral::poll(); -#endif - int retval = (this->_rxHead - this->_rxTail + sizeof(this->_rxBuffer)) % sizeof(this->_rxBuffer); -#ifdef BLE_SERIAL_DEBUG - if (retval > 0) { - Serial.print(F("BLEStream::available() = ")); - Serial.println(retval); - } -#endif - return retval; -} - -int BLEStream::peek(void) -{ -#ifndef _VARIANT_ARDUINO_101_X_ - BLEPeripheral::poll(); -#endif - if (this->_rxTail == this->_rxHead) return -1; - uint8_t byte = this->_rxBuffer[this->_rxTail]; -#ifdef BLE_SERIAL_DEBUG - Serial.print(F("BLEStream::peek() = 0x")); - Serial.println(byte, HEX); -#endif - return byte; -} - -int BLEStream::read(void) -{ -#ifndef _VARIANT_ARDUINO_101_X_ - BLEPeripheral::poll(); -#endif - if (this->_rxTail == this->_rxHead) return -1; - this->_rxTail = (this->_rxTail + 1) % sizeof(this->_rxBuffer); - uint8_t byte = this->_rxBuffer[this->_rxTail]; -#ifdef BLE_SERIAL_DEBUG - Serial.print(F("BLEStream::read() = 0x")); - Serial.println(byte, HEX); -#endif - return byte; -} - -void BLEStream::flush(void) -{ - if (this->_txCount == 0) return; -#ifndef _VARIANT_ARDUINO_101_X_ - // ensure there are available packets before sending - while(!this->_txCharacteristic.canNotify()) { - BLEPeripheral::poll(); - } -#endif - this->_txCharacteristic.setValue(this->_txBuffer, this->_txCount); - this->_flushed = millis(); - this->_txCount = 0; -#ifdef BLE_SERIAL_DEBUG - Serial.println(F("BLEStream::flush()")); -#endif -} - -size_t BLEStream::write(uint8_t byte) -{ -#ifndef _VARIANT_ARDUINO_101_X_ - BLEPeripheral::poll(); -#endif - if (this->_txCharacteristic.subscribed() == false) return 0; - this->_txBuffer[this->_txCount++] = byte; - if (this->_txCount == sizeof(this->_txBuffer)) flush(); -#ifdef BLE_SERIAL_DEBUG - Serial.print(F("BLEStream::write( 0x")); - Serial.print(byte, HEX); - Serial.println(F(") = 1")); -#endif - return 1; -} - -BLEStream::operator bool() -{ - bool retval = this->_connected = BLEPeripheral::connected(); -#ifdef BLE_SERIAL_DEBUG - Serial.print(F("BLEStream::operator bool() = ")); - Serial.println(retval); -#endif - return retval; -} - -void BLEStream::setFlushInterval(int interval) -{ - if (interval > BLESTREAM_MIN_FLUSH_INTERVAL) { - this->_flushInterval = interval; - } -} - -void BLEStream::_received(const unsigned char* data, size_t size) -{ - for (size_t i = 0; i < size; i++) { - this->_rxHead = (this->_rxHead + 1) % sizeof(this->_rxBuffer); - this->_rxBuffer[this->_rxHead] = data[i]; - } -#ifdef BLE_SERIAL_DEBUG - Serial.print(F("BLEStream::received(")); - for (int i = 0; i < size; i++) Serial.print(data[i], HEX); - Serial.println(F(")")); -#endif -} - -void BLEStream::_received(BLECentral& /*central*/, BLECharacteristic& rxCharacteristic) -{ - BLEStream::_instance->_received(rxCharacteristic.value(), rxCharacteristic.valueLength()); -} - - -#endif // _BLE_STREAM_H_ diff --git a/libraries/CurieBLE/examples/test/CommunitySketches/StandardFirmataBLE/StandardFirmataBLE.ino b/libraries/CurieBLE/examples/test/CommunitySketches/StandardFirmataBLE/StandardFirmataBLE.ino deleted file mode 100644 index 398993f9..00000000 --- a/libraries/CurieBLE/examples/test/CommunitySketches/StandardFirmataBLE/StandardFirmataBLE.ino +++ /dev/null @@ -1,853 +0,0 @@ -/* - * Copyright (c) 2016 Intel Corporation. All rights reserved. - * See the bottom of this file for the license terms. - */ - -/* - * Sketch: StandardFirmataBLE.ino. - * - * Description: - * Firmata is a generic protocol for communicating with microcontrollers - * from software on a host computer. It is intended to work with - * any host computer software package. - * - * Notes: - * - Please use the link stated at the end of this file to - * download a host s/w package. - */ - -#include -#include -#include - -//#define SERIAL_DEBUG -#include "utility/firmataDebug.h" - -/* - * Uncomment the following include to enable interfacing - * with Serial devices via hardware or software serial. - */ -// In order to use software serial, you will need to compile this sketch with -// Arduino IDE v1.6.6 or higher. Hardware serial should work back to Arduino 1.0. -//#include "utility/SerialFirmata.h" - -// follow the instructions in bleConfig.h to configure your BLE hardware -#include "bleConfig.h" - -#define I2C_WRITE 0x00 //B00000000 -#define I2C_READ 0x08 //B00001000 -#define I2C_READ_CONTINUOUSLY 0x10 //B00010000 -#define I2C_STOP_READING 0x18 //B00011000 -#define I2C_READ_WRITE_MODE_MASK 0x18 //B00011000 -#define I2C_10BIT_ADDRESS_MODE_MASK 0x20 //B00100000 -#define I2C_END_TX_MASK 0x40 //B01000000 -#define I2C_STOP_TX 1 -#define I2C_RESTART_TX 0 -#define I2C_MAX_QUERIES 8 -#define I2C_REGISTER_NOT_SPECIFIED -1 - -// the minimum interval for sampling analog input -#define MINIMUM_SAMPLING_INTERVAL 1 - -// min cannot be < 0x0006. Adjust max if necessary -#define FIRMATA_BLE_MIN_INTERVAL 0x0006 // 7.5ms (7.5 / 1.25) -#define FIRMATA_BLE_MAX_INTERVAL 0x0018 // 30ms (30 / 1.25) - -/*============================================================================== - * GLOBAL VARIABLES - *============================================================================*/ - -#ifdef FIRMATA_SERIAL_FEATURE -SerialFirmata serialFeature; -#endif - -/* analog inputs */ -int analogInputsToReport = 0; // bitwise array to store pin reporting - -/* digital input ports */ -byte reportPINs[TOTAL_PORTS]; // 1 = report this port, 0 = silence -byte previousPINs[TOTAL_PORTS]; // previous 8 bits sent - -/* pins configuration */ -byte portConfigInputs[TOTAL_PORTS]; // each bit: 1 = pin in INPUT, 0 = anything else - -/* timer variables */ -unsigned long currentMillis; // store the current value from millis() -unsigned long previousMillis; // for comparison with currentMillis -unsigned int samplingInterval = 19; // how often to run the main loop (in ms) - -/* i2c data */ -struct i2c_device_info { - byte addr; - int reg; - byte bytes; - byte stopTX; -}; - -/* for i2c read continuous more */ -i2c_device_info query[I2C_MAX_QUERIES]; - -byte i2cRxData[64]; -boolean isI2CEnabled = false; -signed char queryIndex = -1; -// default delay time between i2c read request and Wire.requestFrom() -unsigned int i2cReadDelayTime = 0; - -Servo servos[MAX_SERVOS]; -byte servoPinMap[TOTAL_PINS]; -byte detachedServos[MAX_SERVOS]; -byte detachedServoCount = 0; -byte servoCount = 0; - -boolean isResetting = false; - -// Forward declare a few functions to avoid compiler errors with older versions -// of the Arduino IDE. -void setPinModeCallback(byte, int); -void reportAnalogCallback(byte analogPin, int value); -void sysexCallback(byte, byte, byte*); - -/* utility functions */ -void wireWrite(byte data) -{ -#if ARDUINO >= 100 - Wire.write((byte)data); -#else - Wire.send(data); -#endif -} - -byte wireRead(void) -{ -#if ARDUINO >= 100 - return Wire.read(); -#else - return Wire.receive(); -#endif -} - -/*============================================================================== - * FUNCTIONS - *============================================================================*/ - -void attachServo(byte pin, int minPulse, int maxPulse) -{ - if (servoCount < MAX_SERVOS) { - // reuse indexes of detached servos until all have been reallocated - if (detachedServoCount > 0) { - servoPinMap[pin] = detachedServos[detachedServoCount - 1]; - if (detachedServoCount > 0) detachedServoCount--; - } else { - servoPinMap[pin] = servoCount; - servoCount++; - } - if (minPulse > 0 && maxPulse > 0) { - servos[servoPinMap[pin]].attach(PIN_TO_DIGITAL(pin), minPulse, maxPulse); - } else { - servos[servoPinMap[pin]].attach(PIN_TO_DIGITAL(pin)); - } - } else { - Firmata.sendString("Max servos attached"); - } -} - -void detachServo(byte pin) -{ - servos[servoPinMap[pin]].detach(); - // if we're detaching the last servo, decrement the count - // otherwise store the index of the detached servo - if (servoPinMap[pin] == servoCount && servoCount > 0) { - servoCount--; - } else if (servoCount > 0) { - // keep track of detached servos because we want to reuse their indexes - // before incrementing the count of attached servos - detachedServoCount++; - detachedServos[detachedServoCount - 1] = servoPinMap[pin]; - } - - servoPinMap[pin] = 255; -} - -void enableI2CPins() -{ - byte i; - // is there a faster way to do this? would probaby require importing - // Arduino.h to get SCL and SDA pins - for (i = 0; i < TOTAL_PINS; i++) { - if (IS_PIN_I2C(i)) { - // mark pins as i2c so they are ignore in non i2c data requests - setPinModeCallback(i, PIN_MODE_I2C); - } - } - - isI2CEnabled = true; - - Wire.begin(); -} - -/* disable the i2c pins so they can be used for other functions */ -void disableI2CPins() { - isI2CEnabled = false; - // disable read continuous mode for all devices - queryIndex = -1; -} - -void readAndReportData(byte address, int theRegister, byte numBytes, byte stopTX) { - // allow I2C requests that don't require a register read - // for example, some devices using an interrupt pin to signify new data available - // do not always require the register read so upon interrupt you call Wire.requestFrom() - if (theRegister != I2C_REGISTER_NOT_SPECIFIED) { - Wire.beginTransmission(address); - wireWrite((byte)theRegister); - Wire.endTransmission(stopTX); // default = true - // do not set a value of 0 - if (i2cReadDelayTime > 0) { - // delay is necessary for some devices such as WiiNunchuck - delayMicroseconds(i2cReadDelayTime); - } - } else { - theRegister = 0; // fill the register with a dummy value - } - - Wire.requestFrom(address, numBytes); // all bytes are returned in requestFrom - - // check to be sure correct number of bytes were returned by slave - if (numBytes < Wire.available()) { - Firmata.sendString("I2C: Too many bytes received"); - } else if (numBytes > Wire.available()) { - Firmata.sendString("I2C: Too few bytes received"); - } - - i2cRxData[0] = address; - i2cRxData[1] = theRegister; - - for (int i = 0; i < numBytes && Wire.available(); i++) { - i2cRxData[2 + i] = wireRead(); - } - - // send slave address, register and received bytes - Firmata.sendSysex(SYSEX_I2C_REPLY, numBytes + 2, i2cRxData); -} - -void outputPort(byte portNumber, byte portValue, byte forceSend) -{ - // pins not configured as INPUT are cleared to zeros - portValue = portValue & portConfigInputs[portNumber]; - // only send if the value is different than previously sent - if (forceSend || previousPINs[portNumber] != portValue) { - Firmata.sendDigitalPort(portNumber, portValue); - previousPINs[portNumber] = portValue; - } -} - -/* ----------------------------------------------------------------------------- - * check all the active digital inputs for change of state, then add any events - * to the Serial output queue using Serial.print() */ -void checkDigitalInputs(void) -{ - /* Using non-looping code allows constants to be given to readPort(). - * The compiler will apply substantial optimizations if the inputs - * to readPort() are compile-time constants. */ - if (TOTAL_PORTS > 0 && reportPINs[0]) outputPort(0, readPort(0, portConfigInputs[0]), false); - if (TOTAL_PORTS > 1 && reportPINs[1]) outputPort(1, readPort(1, portConfigInputs[1]), false); - if (TOTAL_PORTS > 2 && reportPINs[2]) outputPort(2, readPort(2, portConfigInputs[2]), false); - if (TOTAL_PORTS > 3 && reportPINs[3]) outputPort(3, readPort(3, portConfigInputs[3]), false); - if (TOTAL_PORTS > 4 && reportPINs[4]) outputPort(4, readPort(4, portConfigInputs[4]), false); - if (TOTAL_PORTS > 5 && reportPINs[5]) outputPort(5, readPort(5, portConfigInputs[5]), false); - if (TOTAL_PORTS > 6 && reportPINs[6]) outputPort(6, readPort(6, portConfigInputs[6]), false); - if (TOTAL_PORTS > 7 && reportPINs[7]) outputPort(7, readPort(7, portConfigInputs[7]), false); - if (TOTAL_PORTS > 8 && reportPINs[8]) outputPort(8, readPort(8, portConfigInputs[8]), false); - if (TOTAL_PORTS > 9 && reportPINs[9]) outputPort(9, readPort(9, portConfigInputs[9]), false); - if (TOTAL_PORTS > 10 && reportPINs[10]) outputPort(10, readPort(10, portConfigInputs[10]), false); - if (TOTAL_PORTS > 11 && reportPINs[11]) outputPort(11, readPort(11, portConfigInputs[11]), false); - if (TOTAL_PORTS > 12 && reportPINs[12]) outputPort(12, readPort(12, portConfigInputs[12]), false); - if (TOTAL_PORTS > 13 && reportPINs[13]) outputPort(13, readPort(13, portConfigInputs[13]), false); - if (TOTAL_PORTS > 14 && reportPINs[14]) outputPort(14, readPort(14, portConfigInputs[14]), false); - if (TOTAL_PORTS > 15 && reportPINs[15]) outputPort(15, readPort(15, portConfigInputs[15]), false); -} - -// ----------------------------------------------------------------------------- -/* sets the pin mode to the correct state and sets the relevant bits in the - * two bit-arrays that track Digital I/O and PWM status - */ -void setPinModeCallback(byte pin, int mode) -{ - if (Firmata.getPinMode(pin) == PIN_MODE_IGNORE) - return; - - if (Firmata.getPinMode(pin) == PIN_MODE_I2C && isI2CEnabled && mode != PIN_MODE_I2C) { - // disable i2c so pins can be used for other functions - // the following if statements should reconfigure the pins properly - disableI2CPins(); - } - if (IS_PIN_DIGITAL(pin) && mode != PIN_MODE_SERVO) { - if (servoPinMap[pin] < MAX_SERVOS && servos[servoPinMap[pin]].attached()) { - detachServo(pin); - } - } - if (IS_PIN_ANALOG(pin)) { - reportAnalogCallback(PIN_TO_ANALOG(pin), mode == PIN_MODE_ANALOG ? 1 : 0); // turn on/off reporting - } - if (IS_PIN_DIGITAL(pin)) { - if (mode == INPUT || mode == PIN_MODE_PULLUP) { - portConfigInputs[pin / 8] |= (1 << (pin & 7)); - } else { - portConfigInputs[pin / 8] &= ~(1 << (pin & 7)); - } - } - Firmata.setPinState(pin, 0); - switch (mode) { - case PIN_MODE_ANALOG: - if (IS_PIN_ANALOG(pin)) { - if (IS_PIN_DIGITAL(pin)) { - pinMode(PIN_TO_DIGITAL(pin), INPUT); // disable output driver -#if ARDUINO <= 100 - // deprecated since Arduino 1.0.1 - TODO: drop support in Firmata 2.6 - digitalWrite(PIN_TO_DIGITAL(pin), LOW); // disable internal pull-ups -#endif - } - Firmata.setPinMode(pin, PIN_MODE_ANALOG); - } - break; - case INPUT: - if (IS_PIN_DIGITAL(pin)) { - pinMode(PIN_TO_DIGITAL(pin), INPUT); // disable output driver -#if ARDUINO <= 100 - // deprecated since Arduino 1.0.1 - TODO: drop support in Firmata 2.6 - digitalWrite(PIN_TO_DIGITAL(pin), LOW); // disable internal pull-ups -#endif - Firmata.setPinMode(pin, INPUT); - } - break; - case PIN_MODE_PULLUP: - if (IS_PIN_DIGITAL(pin)) { - pinMode(PIN_TO_DIGITAL(pin), INPUT_PULLUP); - Firmata.setPinMode(pin, PIN_MODE_PULLUP); - Firmata.setPinState(pin, 1); - } - break; - case OUTPUT: - if (IS_PIN_DIGITAL(pin)) { - if (Firmata.getPinMode(pin) == PIN_MODE_PWM) { - // Disable PWM if pin mode was previously set to PWM. - digitalWrite(PIN_TO_DIGITAL(pin), LOW); - } - pinMode(PIN_TO_DIGITAL(pin), OUTPUT); - Firmata.setPinMode(pin, OUTPUT); - } - break; - case PIN_MODE_PWM: - if (IS_PIN_PWM(pin)) { - pinMode(PIN_TO_PWM(pin), OUTPUT); - analogWrite(PIN_TO_PWM(pin), 0); - Firmata.setPinMode(pin, PIN_MODE_PWM); - } - break; - case PIN_MODE_SERVO: - if (IS_PIN_DIGITAL(pin)) { - Firmata.setPinMode(pin, PIN_MODE_SERVO); - if (servoPinMap[pin] == 255 || !servos[servoPinMap[pin]].attached()) { - // pass -1 for min and max pulse values to use default values set - // by Servo library - attachServo(pin, -1, -1); - } - } - break; - case PIN_MODE_I2C: - if (IS_PIN_I2C(pin)) { - // mark the pin as i2c - // the user must call I2C_CONFIG to enable I2C for a device - Firmata.setPinMode(pin, PIN_MODE_I2C); - } - break; - case PIN_MODE_SERIAL: -#ifdef FIRMATA_SERIAL_FEATURE - serialFeature.handlePinMode(pin, PIN_MODE_SERIAL); -#endif - break; - default: - Firmata.sendString("Unknown pin mode"); // TODO: put error msgs in EEPROM - } - // TODO: save status to EEPROM here, if changed -} - -/* - * Sets the value of an individual pin. Useful if you want to set a pin value but - * are not tracking the digital port state. - * Can only be used on pins configured as OUTPUT. - * Cannot be used to enable pull-ups on Digital INPUT pins. - */ -void setPinValueCallback(byte pin, int value) -{ - if (pin < TOTAL_PINS && IS_PIN_DIGITAL(pin)) { - if (Firmata.getPinMode(pin) == OUTPUT) { - Firmata.setPinState(pin, value); - digitalWrite(PIN_TO_DIGITAL(pin), value); - } - } -} - -void analogWriteCallback(byte pin, int value) -{ - if (pin < TOTAL_PINS) { - switch (Firmata.getPinMode(pin)) { - case PIN_MODE_SERVO: - if (IS_PIN_DIGITAL(pin)) - servos[servoPinMap[pin]].write(value); - Firmata.setPinState(pin, value); - break; - case PIN_MODE_PWM: - if (IS_PIN_PWM(pin)) - analogWrite(PIN_TO_PWM(pin), value); - Firmata.setPinState(pin, value); - break; - } - } -} - -void digitalWriteCallback(byte port, int value) -{ - byte pin, lastPin, pinValue, mask = 1, pinWriteMask = 0; - - if (port < TOTAL_PORTS) { - // create a mask of the pins on this port that are writable. - lastPin = port * 8 + 8; - if (lastPin > TOTAL_PINS) lastPin = TOTAL_PINS; - for (pin = port * 8; pin < lastPin; pin++) { - // do not disturb non-digital pins (eg, Rx & Tx) - if (IS_PIN_DIGITAL(pin)) { - // do not touch pins in PWM, ANALOG, SERVO or other modes - if (Firmata.getPinMode(pin) == OUTPUT || Firmata.getPinMode(pin) == INPUT) { - pinValue = ((byte)value & mask) ? 1 : 0; - if (Firmata.getPinMode(pin) == OUTPUT) { - pinWriteMask |= mask; - } else if (Firmata.getPinMode(pin) == INPUT && pinValue == 1 && Firmata.getPinState(pin) != 1) { - // only handle INPUT here for backwards compatibility -#if ARDUINO > 100 - pinMode(pin, INPUT_PULLUP); -#else - // only write to the INPUT pin to enable pullups if Arduino v1.0.0 or earlier - pinWriteMask |= mask; -#endif - } - Firmata.setPinState(pin, pinValue); - } - } - mask = mask << 1; - } - writePort(port, (byte)value, pinWriteMask); - } -} - - -// ----------------------------------------------------------------------------- -/* sets bits in a bit array (int) to toggle the reporting of the analogIns - */ -//void FirmataClass::setAnalogPinReporting(byte pin, byte state) { -//} -void reportAnalogCallback(byte analogPin, int value) -{ - if (analogPin < TOTAL_ANALOG_PINS) { - if (value == 0) { - analogInputsToReport = analogInputsToReport & ~ (1 << analogPin); - } else { - analogInputsToReport = analogInputsToReport | (1 << analogPin); - // prevent during system reset or all analog pin values will be reported - // which may report noise for unconnected analog pins - if (!isResetting) { - // Send pin value immediately. This is helpful when connected via - // ethernet, wi-fi or bluetooth so pin states can be known upon - // reconnecting. - Firmata.sendAnalog(analogPin, analogRead(analogPin)); - } - } - } - // TODO: save status to EEPROM here, if changed -} - -void reportDigitalCallback(byte port, int value) -{ - if (port < TOTAL_PORTS) { - reportPINs[port] = (byte)value; - // Send port value immediately. This is helpful when connected via - // ethernet, wi-fi or bluetooth so pin states can be known upon - // reconnecting. - if (value) outputPort(port, readPort(port, portConfigInputs[port]), true); - } - // do not disable analog reporting on these 8 pins, to allow some - // pins used for digital, others analog. Instead, allow both types - // of reporting to be enabled, but check if the pin is configured - // as analog when sampling the analog inputs. Likewise, while - // scanning digital pins, portConfigInputs will mask off values from any - // pins configured as analog -} - -/*============================================================================== - * SYSEX-BASED commands - *============================================================================*/ - -void sysexCallback(byte command, byte argc, byte *argv) -{ - byte mode; - byte stopTX; - byte slaveAddress; - byte data; - int slaveRegister; - unsigned int delayTime; - - switch (command) { - case I2C_REQUEST: - mode = argv[1] & I2C_READ_WRITE_MODE_MASK; - if (argv[1] & I2C_10BIT_ADDRESS_MODE_MASK) { - Firmata.sendString("10-bit addressing not supported"); - return; - } - else { - slaveAddress = argv[0]; - } - - // need to invert the logic here since 0 will be default for client - // libraries that have not updated to add support for restart tx - if (argv[1] & I2C_END_TX_MASK) { - stopTX = I2C_RESTART_TX; - } - else { - stopTX = I2C_STOP_TX; // default - } - - switch (mode) { - case I2C_WRITE: - Wire.beginTransmission(slaveAddress); - for (byte i = 2; i < argc; i += 2) { - data = argv[i] + (argv[i + 1] << 7); - wireWrite(data); - } - Wire.endTransmission(); - delayMicroseconds(70); - break; - case I2C_READ: - if (argc == 6) { - // a slave register is specified - slaveRegister = argv[2] + (argv[3] << 7); - data = argv[4] + (argv[5] << 7); // bytes to read - } - else { - // a slave register is NOT specified - slaveRegister = I2C_REGISTER_NOT_SPECIFIED; - data = argv[2] + (argv[3] << 7); // bytes to read - } - readAndReportData(slaveAddress, (int)slaveRegister, data, stopTX); - break; - case I2C_READ_CONTINUOUSLY: - if ((queryIndex + 1) >= I2C_MAX_QUERIES) { - // too many queries, just ignore - Firmata.sendString("too many queries"); - break; - } - if (argc == 6) { - // a slave register is specified - slaveRegister = argv[2] + (argv[3] << 7); - data = argv[4] + (argv[5] << 7); // bytes to read - } - else { - // a slave register is NOT specified - slaveRegister = (int)I2C_REGISTER_NOT_SPECIFIED; - data = argv[2] + (argv[3] << 7); // bytes to read - } - queryIndex++; - query[queryIndex].addr = slaveAddress; - query[queryIndex].reg = slaveRegister; - query[queryIndex].bytes = data; - query[queryIndex].stopTX = stopTX; - break; - case I2C_STOP_READING: - byte queryIndexToSkip; - // if read continuous mode is enabled for only 1 i2c device, disable - // read continuous reporting for that device - if (queryIndex <= 0) { - queryIndex = -1; - } else { - queryIndexToSkip = 0; - // if read continuous mode is enabled for multiple devices, - // determine which device to stop reading and remove it's data from - // the array, shifiting other array data to fill the space - for (byte i = 0; i < queryIndex + 1; i++) { - if (query[i].addr == slaveAddress) { - queryIndexToSkip = i; - break; - } - } - - for (byte i = queryIndexToSkip; i < queryIndex + 1; i++) { - if (i < I2C_MAX_QUERIES) { - query[i].addr = query[i + 1].addr; - query[i].reg = query[i + 1].reg; - query[i].bytes = query[i + 1].bytes; - query[i].stopTX = query[i + 1].stopTX; - } - } - queryIndex--; - } - break; - default: - break; - } - break; - case I2C_CONFIG: - delayTime = (argv[0] + (argv[1] << 7)); - - if (delayTime > 0) { - i2cReadDelayTime = delayTime; - } - - if (!isI2CEnabled) { - enableI2CPins(); - } - - break; - case SERVO_CONFIG: - if (argc > 4) { - // these vars are here for clarity, they'll optimized away by the compiler - byte pin = argv[0]; - int minPulse = argv[1] + (argv[2] << 7); - int maxPulse = argv[3] + (argv[4] << 7); - - if (IS_PIN_DIGITAL(pin)) { - if (servoPinMap[pin] < MAX_SERVOS && servos[servoPinMap[pin]].attached()) { - detachServo(pin); - } - attachServo(pin, minPulse, maxPulse); - setPinModeCallback(pin, PIN_MODE_SERVO); - } - } - break; - case SAMPLING_INTERVAL: - if (argc > 1) { - samplingInterval = argv[0] + (argv[1] << 7); - if (samplingInterval < MINIMUM_SAMPLING_INTERVAL) { - samplingInterval = MINIMUM_SAMPLING_INTERVAL; - } - } else { - //Firmata.sendString("Not enough data"); - } - break; - case EXTENDED_ANALOG: - if (argc > 1) { - int val = argv[1]; - if (argc > 2) val |= (argv[2] << 7); - if (argc > 3) val |= (argv[3] << 14); - analogWriteCallback(argv[0], val); - } - break; - case CAPABILITY_QUERY: - Firmata.write(START_SYSEX); - Firmata.write(CAPABILITY_RESPONSE); - for (byte pin = 0; pin < TOTAL_PINS; pin++) { - if (IS_PIN_DIGITAL(pin)) { - Firmata.write((byte)INPUT); - Firmata.write(1); - Firmata.write((byte)PIN_MODE_PULLUP); - Firmata.write(1); - Firmata.write((byte)OUTPUT); - Firmata.write(1); - } - if (IS_PIN_ANALOG(pin)) { - Firmata.write(PIN_MODE_ANALOG); - Firmata.write(10); // 10 = 10-bit resolution - } - if (IS_PIN_PWM(pin)) { - Firmata.write(PIN_MODE_PWM); - Firmata.write(8); // 8 = 8-bit resolution - } - if (IS_PIN_DIGITAL(pin)) { - Firmata.write(PIN_MODE_SERVO); - Firmata.write(14); - } - if (IS_PIN_I2C(pin)) { - Firmata.write(PIN_MODE_I2C); - Firmata.write(1); // TODO: could assign a number to map to SCL or SDA - } -#ifdef FIRMATA_SERIAL_FEATURE - serialFeature.handleCapability(pin); -#endif - Firmata.write(127); - } - Firmata.write(END_SYSEX); - break; - case PIN_STATE_QUERY: - if (argc > 0) { - byte pin = argv[0]; - Firmata.write(START_SYSEX); - Firmata.write(PIN_STATE_RESPONSE); - Firmata.write(pin); - if (pin < TOTAL_PINS) { - Firmata.write(Firmata.getPinMode(pin)); - Firmata.write((byte)Firmata.getPinState(pin) & 0x7F); - if (Firmata.getPinState(pin) & 0xFF80) Firmata.write((byte)(Firmata.getPinState(pin) >> 7) & 0x7F); - if (Firmata.getPinState(pin) & 0xC000) Firmata.write((byte)(Firmata.getPinState(pin) >> 14) & 0x7F); - } - Firmata.write(END_SYSEX); - } - break; - case ANALOG_MAPPING_QUERY: - Firmata.write(START_SYSEX); - Firmata.write(ANALOG_MAPPING_RESPONSE); - for (byte pin = 0; pin < TOTAL_PINS; pin++) { - Firmata.write(IS_PIN_ANALOG(pin) ? PIN_TO_ANALOG(pin) : 127); - } - Firmata.write(END_SYSEX); - break; - - case SERIAL_MESSAGE: -#ifdef FIRMATA_SERIAL_FEATURE - serialFeature.handleSysex(command, argc, argv); -#endif - break; - } -} - -/*============================================================================== - * SETUP() - *============================================================================*/ - -void systemResetCallback() -{ - isResetting = true; - -#ifdef FIRMATA_SERIAL_FEATURE - serialFeature.reset(); -#endif - - if (isI2CEnabled) { - disableI2CPins(); - } - - for (byte i = 0; i < TOTAL_PORTS; i++) { - reportPINs[i] = false; // by default, reporting off - portConfigInputs[i] = 0; // until activated - previousPINs[i] = 0; - } - - for (byte i = 0; i < TOTAL_PINS; i++) { - // pins with analog capability default to analog input - // otherwise, pins default to digital output - if (IS_PIN_ANALOG(i)) { - // turns off pullup, configures everything - setPinModeCallback(i, PIN_MODE_ANALOG); - } else if (IS_PIN_DIGITAL(i)) { - // sets the output to 0, configures portConfigInputs - setPinModeCallback(i, OUTPUT); - } - - servoPinMap[i] = 255; - } - // by default, do not report any analog inputs - analogInputsToReport = 0; - - detachedServoCount = 0; - servoCount = 0; - - isResetting = false; -} - -void setup() -{ - DEBUG_BEGIN(9600); - - Firmata.setFirmwareVersion(FIRMATA_FIRMWARE_MAJOR_VERSION, FIRMATA_FIRMWARE_MINOR_VERSION); - - Firmata.attach(ANALOG_MESSAGE, analogWriteCallback); - Firmata.attach(DIGITAL_MESSAGE, digitalWriteCallback); - Firmata.attach(REPORT_ANALOG, reportAnalogCallback); - Firmata.attach(REPORT_DIGITAL, reportDigitalCallback); - Firmata.attach(SET_PIN_MODE, setPinModeCallback); - Firmata.attach(SET_DIGITAL_PIN_VALUE, setPinValueCallback); - Firmata.attach(START_SYSEX, sysexCallback); - Firmata.attach(SYSTEM_RESET, systemResetCallback); - - stream.setLocalName(FIRMATA_BLE_LOCAL_NAME); - - // set the BLE connection interval - this is the fastest interval you can read inputs - stream.setConnectionInterval(FIRMATA_BLE_MIN_INTERVAL, FIRMATA_BLE_MAX_INTERVAL); - // set how often the BLE TX buffer is flushed (if not full) - stream.setFlushInterval(FIRMATA_BLE_MAX_INTERVAL); - -#ifdef BLE_REQ - for (byte i = 0; i < TOTAL_PINS; i++) { - if (IS_IGNORE_BLE_PINS(i)) { - Firmata.setPinMode(i, PIN_MODE_IGNORE); - } - } -#endif - - stream.begin(); - Firmata.begin(stream); - - systemResetCallback(); // reset to default config -} - -/*============================================================================== - * LOOP() - *============================================================================*/ -void loop() -{ - byte pin, analogPin; - - // do not process data if no BLE connection is established - // poll will send the TX buffer at the specified flush interval or when the buffer is full - if (!stream.poll()) return; - - /* DIGITALREAD - as fast as possible, check for changes and output them to the - * Stream buffer using Stream.write() */ - checkDigitalInputs(); - - /* STREAMREAD - processing incoming messagse as soon as possible, while still - * checking digital inputs. */ - while (Firmata.available()) - Firmata.processInput(); - - currentMillis = millis(); - if (currentMillis - previousMillis > samplingInterval) { - previousMillis = currentMillis; - /* ANALOGREAD - do all analogReads() at the configured sampling interval */ - for (pin = 0; pin < TOTAL_PINS; pin++) { - if (IS_PIN_ANALOG(pin) && Firmata.getPinMode(pin) == PIN_MODE_ANALOG) { - analogPin = PIN_TO_ANALOG(pin); - if (analogInputsToReport & (1 << analogPin)) { - Firmata.sendAnalog(analogPin, analogRead(analogPin)); - } - } - } - // report i2c data for all device with read continuous mode enabled - if (queryIndex > -1) { - for (byte i = 0; i < queryIndex + 1; i++) { - readAndReportData(query[i].addr, query[i].reg, query[i].bytes, query[i].stopTX); - } - } - } - -#ifdef FIRMATA_SERIAL_FEATURE - serialFeature.update(); -#endif -} - -/* - Firmata is a generic protocol for communicating with microcontrollers - from software on a host computer. It is intended to work with - any host computer software package. - To download a host software package, please click on the following link - to open the list of Firmata client libraries in your default browser. - https://github.com/firmata/arduino#firmata-client-libraries - Copyright (C) 2006-2008 Hans-Christoph Steiner. All rights reserved. - Copyright (C) 2010-2011 Paul Stoffregen. All rights reserved. - Copyright (C) 2009 Shigeru Kobayashi. All rights reserved. - Copyright (C) 2009-2016 Jeff Hoefs. All rights reserved. - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - See file LICENSE.txt for further informations on licensing terms. - Last updated October 16th, 2016 -*/ - - diff --git a/libraries/CurieBLE/examples/test/CommunitySketches/StandardFirmataBLE/bleConfig.h b/libraries/CurieBLE/examples/test/CommunitySketches/StandardFirmataBLE/bleConfig.h deleted file mode 100644 index aeb96a81..00000000 --- a/libraries/CurieBLE/examples/test/CommunitySketches/StandardFirmataBLE/bleConfig.h +++ /dev/null @@ -1,112 +0,0 @@ -/*================================================================================================== - * BLE CONFIGURATION - * - * If you are using an Arduino 101, you do not need to make any changes to this file (unless you - * need a unique ble local name (see below). If you are using another supported BLE board or shield, - * follow the instructions for the specific board or shield below. - * - * Make sure you have the Intel Curie Boards package v1.0.6 or higher installed via the Arduino - * Boards Manager. - * - * Supported boards and shields: - * - Arduino 101 (recommended) - * - RedBearLab BLE Shield (v2) ** to be verified ** - * - RedBearLab BLE Nano ** works with modifications ** - * - *================================================================================================*/ - -// change this to a unique name per board if running StandardFirmataBLE on multiple boards -// within the same physical space -#define FIRMATA_BLE_LOCAL_NAME "FIRMATA" - -/* - * RedBearLab BLE Shield - * - * If you are using a RedBearLab BLE shield, uncomment the define below. - * Also, change the define for BLE_RST if you have the jumper set to pin 7 rather than pin 4. - * - * You will need to use the shield with an Arduino Zero, Due, Mega, or other board with sufficient - * Flash and RAM. Arduino Uno, Leonardo and other ATmega328p and Atmega32u4 boards to not have - * enough memory to run StandardFirmataBLE. - * - * TODO: verify if this works and with which boards it works. - * - * Test script: https://gist.github.com/soundanalogous/927360b797574ed50e27 - */ -//#define REDBEAR_BLE_SHIELD - -#ifdef REDBEAR_BLE_SHIELD -#include -#include -#include "utility/BLEStream.h" - -#define BLE_REQ 9 -#define BLE_RDY 8 -#define BLE_RST 4 // 4 or 7 via jumper on shield - -BLEStream stream(BLE_REQ, BLE_RDY, BLE_RST); -#endif - - -/*================================================================================================== - * END BLE CONFIGURATION - you should not need to change anything below this line - *================================================================================================*/ - -/* - * Arduino 101 - * - * Make sure you have the Intel Curie Boards package v1.0.6 or higher installed via the Arduino - * Boards Manager. - * - * Test script: https://gist.github.com/soundanalogous/927360b797574ed50e27 - */ -#ifdef _VARIANT_ARDUINO_101_X_ -#include -#include "BLEStream.h" -BLEStream stream; -#endif - - -/* - * RedBearLab BLE Nano (with default switch settings) - * - * Blocked on this issue: https://github.com/RedBearLab/nRF51822-Arduino/issues/46 - * Works with modifications. See comments at top of the test script referenced below. - * When the RBL nRF51822-Arduino library issue is resolved, this should work witout - * any modifications. - * - * Test script: https://gist.github.com/soundanalogous/d39bb3eb36333a0906df - * - * Note: If you have changed the solder jumpers on the Nano you may encounter issues since - * the pins are currently mapped in Firmata only for the default (factory) jumper settings. - */ -// #ifdef BLE_NANO -// #include -// #include "utility/BLEStream.h" -// BLEStream stream; -// #endif - - -/* - * RedBearLab Blend and Blend Micro - * - * StandardFirmataBLE requires too much Flash and RAM to run on the ATmega32u4-based Blend - * and Blend Micro boards. It may work with ConfigurableFirmata selecting only analog and/or - * digital I/O. - */ -// #if defined(BLEND_MICRO) || defined(BLEND) -// #include -// #include -// #include "utility/BLEStream.h" - -// #define BLE_REQ 6 -// #define BLE_RDY 7 -// #define BLE_RST 4 - -// BLEStream stream(BLE_REQ, BLE_RDY, BLE_RST); -// #endif - - -#if defined(BLE_REQ) && defined(BLE_RDY) && defined(BLE_RST) -#define IS_IGNORE_BLE_PINS(p) ((p) == BLE_REQ || (p) == BLE_RDY || (p) == BLE_RST) -#endif diff --git a/libraries/CurieBLE/examples/test/discoveratperipheral/discoveratperipheral.ino b/libraries/CurieBLE/examples/test/discoveratperipheral/discoveratperipheral.ino deleted file mode 100644 index 8de71767..00000000 --- a/libraries/CurieBLE/examples/test/discoveratperipheral/discoveratperipheral.ino +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright (c) 2016 Intel Corporation. All rights reserved. - * See the bottom of this file for the license terms. - */ - -/* - * Sketch: discoveratperipheral.ino. - * - * Description: - * This is a BLE Central sketch that looks for a particular - * Characteristic in a connected Peripheral to write to. The - * Peripheral with the special Characteristic will blink its - * LED. - * - * Notes: - * - This sketch is Arduino BLE Peripheral LED example. - * Please see licensing at the bottom of this file. - * - Expected Peripheral Characteristic: 19b10000e8f2537e4f6cd104768a1214 - */ - -#include - -// LED pin -#define LED_PIN 13 - -// create service -BLEService ledService("19b10000e8f2537e4f6cd104768a1214"); - -void setup() { - Serial.begin(9600); - - // set LED pin to output mode - pinMode(LED_PIN, OUTPUT); - - // begin initialization - BLE.begin(); - Serial.println(BLE.address()); - - // set advertised local name and service UUID - BLE.setLocalName("LED"); - - BLE.advertise(); - - Serial.println(F("BLE LED Peripheral")); -} - -void loop() { - BLEDevice central = BLE.central(); - - if (central) { - // central connected to peripheral - Serial.print(F("Connected to central: ")); - Serial.println(central.address()); - - controlLed(central); - // central disconnected - Serial.print(F("Disconnected from central: ")); - Serial.println(central.address()); - } -} - -void controlLed(BLEDevice ¢ral) -{ - if (central.discoverAttributes() == false) - { - Serial.println("Discover failed, Disconnecting..."); - central.disconnect(); - return; - } - - BLECharacteristic ledCharacteristic = central.characteristic("19b10101-e8f2-537e-4f6c-d104768a1214"); - - if (!ledCharacteristic) - { - central.disconnect(); - //while(1) - { - Serial.println("Central does not have LED characteristic!"); - delay(5000); - } - return; - } - - ledCharacteristic.subscribe(); - - unsigned char ledstate = 0; - - while (central.connected()) - { - if (ledstate == 1) - { - ledstate = 0; - } - else - { - ledstate = 1; - } - ledCharacteristic.write(&ledstate, sizeof(ledstate)); - delay(5000); - } - Serial.print("Disconnected"); - Serial.println(central.address()); -} - - -/* - Arduino BLE Peripheral LED example - Copyright (c) 2016 Arduino LLC. All right reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ - diff --git a/libraries/CurieBLE/examples/test/profileatcentral/profileatcentral.ino b/libraries/CurieBLE/examples/test/profileatcentral/profileatcentral.ino deleted file mode 100644 index 2fe20520..00000000 --- a/libraries/CurieBLE/examples/test/profileatcentral/profileatcentral.ino +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (c) 2017 Intel Corporation. All rights reserved. - * See the bottom of this file for the license terms. - */ - -/* - * Sketch: profileatcentral.ino - * - * Description: - * This is a BLE Central sketch that demostrates the setting of the - * BLE descriptor. - * - * Notes: - * - This sketch is based on the Arduino BLE Peripheral LED example. - * Please refer to licensing agreement at the bottom of this file. - */ - -#include "CurieBLE.h" -#include -// LED pin -#define LED_PIN 13 -BLEService ledService("19b10100e8f2537e4f6cd104768a1214"); - -BLECharacteristic switchCharacteristic("19b10101e8f2537e4f6cd104768a1214", BLERead | BLEWrite | BLENotify, 1); - -BLEDescriptor switchDescriptor("2901", "switch"); - -void setup() { - Serial.begin(115200); - - // set LED pin to output mode - pinMode(LED_PIN, OUTPUT); - - // begin initialization - BLE.begin(); - Serial.println(BLE.address()); - ledService.addCharacteristic(switchCharacteristic); - switchCharacteristic.addDescriptor(switchDescriptor); - BLE.addService(ledService); - - BLE.scanForName("LED"); -} - - -void loop() { - BLEDevice peripheral = BLE.available(); - if (peripheral) - { - Serial.println(peripheral.address()); - - BLE.stopScan(); - - if (peripheral.connect()) - { - Serial.print("Connected: "); - Serial.println(peripheral.address()); - while (peripheral.connected()) - { - delay (1000); - } - } - else - { - Serial.println("Failed to connect!"); - } - delay (4000); - BLE.scanForName("LED"); - } -} - - -/* - Arduino BLE Peripheral LED example - Copyright (c) 2016 Arduino LLC. All right reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ - - From 752d8726009ef02ce59728c51e946ef6babc0c71 Mon Sep 17 00:00:00 2001 From: Yashaswini Hanji Date: Fri, 10 Mar 2017 14:19:21 -0800 Subject: [PATCH 40/91] Add test directory for CurieBLE examples --- .../examples/test/CallbackLED/CallbackLED.ino | 90 ++ .../Genuino101CurieBLEHeartRateMonitor.ino | 112 +++ .../StandardFirmataBLE/BLEStream.h | 243 +++++ .../StandardFirmataBLE/StandardFirmataBLE.ino | 853 ++++++++++++++++++ .../StandardFirmataBLE/bleConfig.h | 112 +++ .../discoveratperipheral.ino | 124 +++ .../profileatcentral/profileatcentral.ino | 91 ++ 7 files changed, 1625 insertions(+) create mode 100644 libraries/CurieBLE/examples/test/CallbackLED/CallbackLED.ino create mode 100644 libraries/CurieBLE/examples/test/CommunitySketches/Genuino101CurieBLEHeartRateMonitor/Genuino101CurieBLEHeartRateMonitor.ino create mode 100644 libraries/CurieBLE/examples/test/CommunitySketches/StandardFirmataBLE/BLEStream.h create mode 100644 libraries/CurieBLE/examples/test/CommunitySketches/StandardFirmataBLE/StandardFirmataBLE.ino create mode 100644 libraries/CurieBLE/examples/test/CommunitySketches/StandardFirmataBLE/bleConfig.h create mode 100644 libraries/CurieBLE/examples/test/discoveratperipheral/discoveratperipheral.ino create mode 100644 libraries/CurieBLE/examples/test/profileatcentral/profileatcentral.ino diff --git a/libraries/CurieBLE/examples/test/CallbackLED/CallbackLED.ino b/libraries/CurieBLE/examples/test/CallbackLED/CallbackLED.ino new file mode 100644 index 00000000..7cbcd21b --- /dev/null +++ b/libraries/CurieBLE/examples/test/CallbackLED/CallbackLED.ino @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2016 Intel Corporation. All rights reserved. + * See the bottom of this file for the license terms. + */ + +#include "CurieBLE.h" + +const int ledPin = 13; // set ledPin to use on-board LED +BLEPeripheral blePeripheral; // create peripheral instance + +BLEService ledService("19B10000-E8F2-537E-4F6C-D104768A1214"); // create service + +// create switch characteristic and allow remote device to read and write +BLECharCharacteristic switchChar("19B10001-E8F2-537E-4F6C-D104768A1214", BLERead | BLEWrite); + +void setup() { + Serial.begin(9600); + pinMode(ledPin, OUTPUT); // use the LED on pin 13 as an output + + // set the local name peripheral advertises + blePeripheral.setLocalName("LEDCB"); + // set the UUID for the service this peripheral advertises + blePeripheral.setAdvertisedServiceUuid(ledService.uuid()); + + // add service and characteristic + blePeripheral.addAttribute(ledService); + blePeripheral.addAttribute(switchChar); + + // assign event handlers for connected, disconnected to peripheral + blePeripheral.setEventHandler(BLEConnected, blePeripheralConnectHandler); + blePeripheral.setEventHandler(BLEDisconnected, blePeripheralDisconnectHandler); + + // assign event handlers for characteristic + switchChar.setEventHandler(BLEWritten, switchCharacteristicWritten); +// set an initial value for the characteristic + switchChar.setValue(0); + + // advertise the service + blePeripheral.begin(); + Serial.println(("Bluetooth device active, waiting for connections...")); +} + +void loop() { + // poll peripheral + blePeripheral.poll(); +} + +void blePeripheralConnectHandler(BLECentral& central) { + // central connected event handler + Serial.print("Connected event, central: "); + Serial.println(central.address()); +} + +void blePeripheralDisconnectHandler(BLECentral& central) { + // central disconnected event handler + Serial.print("Disconnected event, central: "); + Serial.println(central.address()); +} + +void switchCharacteristicWritten(BLEDevice central, BLECharacteristic characteristic) { + // central wrote new value to characteristic, update LED + Serial.print("Characteristic event, written: "); + + if (switchChar.value()) { + Serial.println("LED on"); + digitalWrite(ledPin, HIGH); + } else { + Serial.println("LED off"); + digitalWrite(ledPin, LOW); + } +} + +/* + Copyright (c) 2016 Intel Corporation. All rights reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110- + 1301 USA +*/ diff --git a/libraries/CurieBLE/examples/test/CommunitySketches/Genuino101CurieBLEHeartRateMonitor/Genuino101CurieBLEHeartRateMonitor.ino b/libraries/CurieBLE/examples/test/CommunitySketches/Genuino101CurieBLEHeartRateMonitor/Genuino101CurieBLEHeartRateMonitor.ino new file mode 100644 index 00000000..5428572f --- /dev/null +++ b/libraries/CurieBLE/examples/test/CommunitySketches/Genuino101CurieBLEHeartRateMonitor/Genuino101CurieBLEHeartRateMonitor.ino @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2016 Intel Corporation. All rights reserved. + * See the bottom of this file for the license terms. + */ + +/* + * Sketch: Genuino101CurieBLEHeartRateMonitor.ino. + * + * Description: + * This sketch example partially implements the standard Bluetooth Low-Energy + * Heart Rate service. For more information: + * https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx + * + */ + +#include + +BLEPeripheral blePeripheral; // BLE Peripheral Device (the board you're programming) +BLEService heartRateService("180D"); // BLE Heart Rate Service + +// BLE Heart Rate Measurement Characteristic" +BLECharacteristic heartRateChar("2A37", // standard 16-bit characteristic UUID + BLERead | BLENotify, 2); // remote clients will be able to get notifications if this characteristic changes + // the characteristic is 2 bytes long as the first field needs to be "Flags" as per BLE specifications + // https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.heart_rate_measurement.xml + +int oldHeartRate = 0; // last heart rate reading from analog input +long previousMillis = 0; // last time the heart rate was checked, in ms + +void setup() { + Serial.begin(9600); // initialize serial communication + pinMode(13, OUTPUT); // initialize the LED on pin 13 to indicate when a central is connected + + /* Set a local name for the BLE device + This name will appear in advertising packets + and can be used by remote devices to identify this BLE device + The name can be changed but maybe be truncated based on space left in advertisement packet */ + blePeripheral.setLocalName("HeartRateSketch"); + blePeripheral.setAdvertisedServiceUuid(heartRateService.uuid()); // add the service UUID + blePeripheral.addAttribute(heartRateService); // Add the BLE Heart Rate service + blePeripheral.addAttribute(heartRateChar); // add the Heart Rate Measurement characteristic + + /* Now activate the BLE device. It will start continuously transmitting BLE + advertising packets and will be visible to remote BLE central devices + until it receives a new connection */ + blePeripheral.begin(); + Serial.println("Bluetooth device active, waiting for connections..."); +} + +void loop() { + // listen for BLE peripherals to connect: + BLECentral central = blePeripheral.central(); + + // if a central is connected to peripheral: + if (central) { + Serial.print("Connected to central: "); + // print the central's MAC address: + Serial.println(central.address()); + // turn on the LED to indicate the connection: + digitalWrite(13, HIGH); + + // check the heart rate measurement every 200ms + // as long as the central is still connected: + while (central.connected()) { + long currentMillis = millis(); + // if 200ms have passed, check the heart rate measurement: + if (currentMillis - previousMillis >= 200) { + previousMillis = currentMillis; + updateHeartRate(); + } + } + // when the central disconnects, turn off the LED: + digitalWrite(13, LOW); + Serial.print("Disconnected from central: "); + Serial.println(central.address()); + } +} + +void updateHeartRate() { + /* Read the current voltage level on the A0 analog input pin. + This is used here to simulate the heart rate's measurement. + */ + int heartRateMeasurement = analogRead(A0); + int heartRate = map(heartRateMeasurement, 0, 1023, 0, 100); + if (heartRate != oldHeartRate) { // if the heart rate has changed + Serial.print("Heart Rate is now: "); // print it + Serial.println(heartRate); + const unsigned char heartRateCharArray[2] = { 0, (char)heartRate }; + heartRateChar.setValue(heartRateCharArray, 2); // and update the heart rate measurement characteristic + oldHeartRate = heartRate; // save the level for next comparison + } +} + +/* + Copyright (c) 2015 Intel Corporation. All rights reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + + diff --git a/libraries/CurieBLE/examples/test/CommunitySketches/StandardFirmataBLE/BLEStream.h b/libraries/CurieBLE/examples/test/CommunitySketches/StandardFirmataBLE/BLEStream.h new file mode 100644 index 00000000..87256762 --- /dev/null +++ b/libraries/CurieBLE/examples/test/CommunitySketches/StandardFirmataBLE/BLEStream.h @@ -0,0 +1,243 @@ +/* + BLEStream.h + + Based on BLESerial.cpp by Voita Molda + https://github.com/sandeepmistry/arduino-BLEPeripheral/blob/master/examples/serial/BLESerial.h + + Last updated April 4th, 2016 + */ + +#ifndef _BLE_STREAM_H_ +#define _BLE_STREAM_H_ + +#include +#if defined(_VARIANT_ARDUINO_101_X_) +#include +#define _MAX_ATTR_DATA_LEN_ BLE_MAX_ATTR_DATA_LEN +#else +//#include +#define _MAX_ATTR_DATA_LEN_ BLE_ATTRIBUTE_MAX_VALUE_LENGTH +#endif + +#define BLESTREAM_TXBUFFER_FLUSH_INTERVAL 80 +#define BLESTREAM_MIN_FLUSH_INTERVAL 8 // minimum interval for flushing the TX buffer + +// #define BLE_SERIAL_DEBUG + +class BLEStream : public BLEPeripheral, public Stream +{ + public: + BLEStream(unsigned char req = 0, unsigned char rdy = 0, unsigned char rst = 0); + + void begin(...); + bool poll(); + void end(); + void setFlushInterval(int); + + virtual int available(void); + virtual int peek(void); + virtual int read(void); + virtual void flush(void); + virtual size_t write(uint8_t byte); + using Print::write; + virtual operator bool(); + + private: + bool _connected; + unsigned long _flushed; + int _flushInterval; + static BLEStream* _instance; + + size_t _rxHead; + size_t _rxTail; + size_t _rxCount() const; + unsigned char _rxBuffer[256]; + size_t _txCount; + unsigned char _txBuffer[_MAX_ATTR_DATA_LEN_]; + + BLEService _uartService = BLEService("6E400001-B5A3-F393-E0A9-E50E24DCCA9E"); + BLEDescriptor _uartNameDescriptor = BLEDescriptor("2901", "UART"); + BLECharacteristic _rxCharacteristic = BLECharacteristic("6E400002-B5A3-F393-E0A9-E50E24DCCA9E", BLEWriteWithoutResponse, _MAX_ATTR_DATA_LEN_); + BLEDescriptor _rxNameDescriptor = BLEDescriptor("2901", "RX - Receive Data (Write)"); + BLECharacteristic _txCharacteristic = BLECharacteristic("6E400003-B5A3-F393-E0A9-E50E24DCCA9E", BLENotify, _MAX_ATTR_DATA_LEN_); + BLEDescriptor _txNameDescriptor = BLEDescriptor("2901", "TX - Transfer Data (Notify)"); + + void _received(const unsigned char* data, size_t size); + static void _received(BLECentral& /*central*/, BLECharacteristic& rxCharacteristic); +}; + + +/* + * BLEStream.cpp + * Copied here as a hack to avoid having to install the BLEPeripheral libarary even if it's + * not needed. + */ + +BLEStream* BLEStream::_instance = NULL; + +BLEStream::BLEStream(unsigned char req, unsigned char rdy, unsigned char rst) : +#if defined(_VARIANT_ARDUINO_101_X_) + BLEPeripheral() +#else + BLEPeripheral(req, rdy, rst) +#endif +{ + this->_txCount = 0; + this->_rxHead = this->_rxTail = 0; + this->_flushed = 0; + this->_flushInterval = BLESTREAM_TXBUFFER_FLUSH_INTERVAL; + BLEStream::_instance = this; + + addAttribute(this->_uartService); + addAttribute(this->_uartNameDescriptor); + setAdvertisedServiceUuid(this->_uartService.uuid()); + addAttribute(this->_rxCharacteristic); + addAttribute(this->_rxNameDescriptor); + this->_rxCharacteristic.setEventHandler(BLEWritten, BLEStream::_received); + addAttribute(this->_txCharacteristic); + addAttribute(this->_txNameDescriptor); +} + +void BLEStream::begin(...) +{ + BLEPeripheral::begin(); +#ifdef BLE_SERIAL_DEBUG + Serial.println(F("BLEStream::begin()")); +#endif +} + +bool BLEStream::poll() +{ + // BLEPeripheral::poll is called each time connected() is called + this->_connected = BLEPeripheral::connected(); + if (millis() > this->_flushed + this->_flushInterval) { + flush(); + } + return this->_connected; +} + +void BLEStream::end() +{ + this->_rxCharacteristic.setEventHandler(BLEWritten, (void(*)(BLECentral&, BLECharacteristic&))NULL); + this->_rxHead = this->_rxTail = 0; + flush(); + BLEPeripheral::disconnect(); +} + +int BLEStream::available(void) +{ +// BLEPeripheral::poll only calls delay(1) in CurieBLE so skipping it here to avoid the delay +#ifndef _VARIANT_ARDUINO_101_X_ + // TODO Need to do more testing to determine if all of these calls to BLEPeripheral::poll are + // actually necessary. Seems to run fine without them, but only minimal testing so far. + BLEPeripheral::poll(); +#endif + int retval = (this->_rxHead - this->_rxTail + sizeof(this->_rxBuffer)) % sizeof(this->_rxBuffer); +#ifdef BLE_SERIAL_DEBUG + if (retval > 0) { + Serial.print(F("BLEStream::available() = ")); + Serial.println(retval); + } +#endif + return retval; +} + +int BLEStream::peek(void) +{ +#ifndef _VARIANT_ARDUINO_101_X_ + BLEPeripheral::poll(); +#endif + if (this->_rxTail == this->_rxHead) return -1; + uint8_t byte = this->_rxBuffer[this->_rxTail]; +#ifdef BLE_SERIAL_DEBUG + Serial.print(F("BLEStream::peek() = 0x")); + Serial.println(byte, HEX); +#endif + return byte; +} + +int BLEStream::read(void) +{ +#ifndef _VARIANT_ARDUINO_101_X_ + BLEPeripheral::poll(); +#endif + if (this->_rxTail == this->_rxHead) return -1; + this->_rxTail = (this->_rxTail + 1) % sizeof(this->_rxBuffer); + uint8_t byte = this->_rxBuffer[this->_rxTail]; +#ifdef BLE_SERIAL_DEBUG + Serial.print(F("BLEStream::read() = 0x")); + Serial.println(byte, HEX); +#endif + return byte; +} + +void BLEStream::flush(void) +{ + if (this->_txCount == 0) return; +#ifndef _VARIANT_ARDUINO_101_X_ + // ensure there are available packets before sending + while(!this->_txCharacteristic.canNotify()) { + BLEPeripheral::poll(); + } +#endif + this->_txCharacteristic.setValue(this->_txBuffer, this->_txCount); + this->_flushed = millis(); + this->_txCount = 0; +#ifdef BLE_SERIAL_DEBUG + Serial.println(F("BLEStream::flush()")); +#endif +} + +size_t BLEStream::write(uint8_t byte) +{ +#ifndef _VARIANT_ARDUINO_101_X_ + BLEPeripheral::poll(); +#endif + if (this->_txCharacteristic.subscribed() == false) return 0; + this->_txBuffer[this->_txCount++] = byte; + if (this->_txCount == sizeof(this->_txBuffer)) flush(); +#ifdef BLE_SERIAL_DEBUG + Serial.print(F("BLEStream::write( 0x")); + Serial.print(byte, HEX); + Serial.println(F(") = 1")); +#endif + return 1; +} + +BLEStream::operator bool() +{ + bool retval = this->_connected = BLEPeripheral::connected(); +#ifdef BLE_SERIAL_DEBUG + Serial.print(F("BLEStream::operator bool() = ")); + Serial.println(retval); +#endif + return retval; +} + +void BLEStream::setFlushInterval(int interval) +{ + if (interval > BLESTREAM_MIN_FLUSH_INTERVAL) { + this->_flushInterval = interval; + } +} + +void BLEStream::_received(const unsigned char* data, size_t size) +{ + for (size_t i = 0; i < size; i++) { + this->_rxHead = (this->_rxHead + 1) % sizeof(this->_rxBuffer); + this->_rxBuffer[this->_rxHead] = data[i]; + } +#ifdef BLE_SERIAL_DEBUG + Serial.print(F("BLEStream::received(")); + for (int i = 0; i < size; i++) Serial.print(data[i], HEX); + Serial.println(F(")")); +#endif +} + +void BLEStream::_received(BLECentral& /*central*/, BLECharacteristic& rxCharacteristic) +{ + BLEStream::_instance->_received(rxCharacteristic.value(), rxCharacteristic.valueLength()); +} + + +#endif // _BLE_STREAM_H_ diff --git a/libraries/CurieBLE/examples/test/CommunitySketches/StandardFirmataBLE/StandardFirmataBLE.ino b/libraries/CurieBLE/examples/test/CommunitySketches/StandardFirmataBLE/StandardFirmataBLE.ino new file mode 100644 index 00000000..398993f9 --- /dev/null +++ b/libraries/CurieBLE/examples/test/CommunitySketches/StandardFirmataBLE/StandardFirmataBLE.ino @@ -0,0 +1,853 @@ +/* + * Copyright (c) 2016 Intel Corporation. All rights reserved. + * See the bottom of this file for the license terms. + */ + +/* + * Sketch: StandardFirmataBLE.ino. + * + * Description: + * Firmata is a generic protocol for communicating with microcontrollers + * from software on a host computer. It is intended to work with + * any host computer software package. + * + * Notes: + * - Please use the link stated at the end of this file to + * download a host s/w package. + */ + +#include +#include +#include + +//#define SERIAL_DEBUG +#include "utility/firmataDebug.h" + +/* + * Uncomment the following include to enable interfacing + * with Serial devices via hardware or software serial. + */ +// In order to use software serial, you will need to compile this sketch with +// Arduino IDE v1.6.6 or higher. Hardware serial should work back to Arduino 1.0. +//#include "utility/SerialFirmata.h" + +// follow the instructions in bleConfig.h to configure your BLE hardware +#include "bleConfig.h" + +#define I2C_WRITE 0x00 //B00000000 +#define I2C_READ 0x08 //B00001000 +#define I2C_READ_CONTINUOUSLY 0x10 //B00010000 +#define I2C_STOP_READING 0x18 //B00011000 +#define I2C_READ_WRITE_MODE_MASK 0x18 //B00011000 +#define I2C_10BIT_ADDRESS_MODE_MASK 0x20 //B00100000 +#define I2C_END_TX_MASK 0x40 //B01000000 +#define I2C_STOP_TX 1 +#define I2C_RESTART_TX 0 +#define I2C_MAX_QUERIES 8 +#define I2C_REGISTER_NOT_SPECIFIED -1 + +// the minimum interval for sampling analog input +#define MINIMUM_SAMPLING_INTERVAL 1 + +// min cannot be < 0x0006. Adjust max if necessary +#define FIRMATA_BLE_MIN_INTERVAL 0x0006 // 7.5ms (7.5 / 1.25) +#define FIRMATA_BLE_MAX_INTERVAL 0x0018 // 30ms (30 / 1.25) + +/*============================================================================== + * GLOBAL VARIABLES + *============================================================================*/ + +#ifdef FIRMATA_SERIAL_FEATURE +SerialFirmata serialFeature; +#endif + +/* analog inputs */ +int analogInputsToReport = 0; // bitwise array to store pin reporting + +/* digital input ports */ +byte reportPINs[TOTAL_PORTS]; // 1 = report this port, 0 = silence +byte previousPINs[TOTAL_PORTS]; // previous 8 bits sent + +/* pins configuration */ +byte portConfigInputs[TOTAL_PORTS]; // each bit: 1 = pin in INPUT, 0 = anything else + +/* timer variables */ +unsigned long currentMillis; // store the current value from millis() +unsigned long previousMillis; // for comparison with currentMillis +unsigned int samplingInterval = 19; // how often to run the main loop (in ms) + +/* i2c data */ +struct i2c_device_info { + byte addr; + int reg; + byte bytes; + byte stopTX; +}; + +/* for i2c read continuous more */ +i2c_device_info query[I2C_MAX_QUERIES]; + +byte i2cRxData[64]; +boolean isI2CEnabled = false; +signed char queryIndex = -1; +// default delay time between i2c read request and Wire.requestFrom() +unsigned int i2cReadDelayTime = 0; + +Servo servos[MAX_SERVOS]; +byte servoPinMap[TOTAL_PINS]; +byte detachedServos[MAX_SERVOS]; +byte detachedServoCount = 0; +byte servoCount = 0; + +boolean isResetting = false; + +// Forward declare a few functions to avoid compiler errors with older versions +// of the Arduino IDE. +void setPinModeCallback(byte, int); +void reportAnalogCallback(byte analogPin, int value); +void sysexCallback(byte, byte, byte*); + +/* utility functions */ +void wireWrite(byte data) +{ +#if ARDUINO >= 100 + Wire.write((byte)data); +#else + Wire.send(data); +#endif +} + +byte wireRead(void) +{ +#if ARDUINO >= 100 + return Wire.read(); +#else + return Wire.receive(); +#endif +} + +/*============================================================================== + * FUNCTIONS + *============================================================================*/ + +void attachServo(byte pin, int minPulse, int maxPulse) +{ + if (servoCount < MAX_SERVOS) { + // reuse indexes of detached servos until all have been reallocated + if (detachedServoCount > 0) { + servoPinMap[pin] = detachedServos[detachedServoCount - 1]; + if (detachedServoCount > 0) detachedServoCount--; + } else { + servoPinMap[pin] = servoCount; + servoCount++; + } + if (minPulse > 0 && maxPulse > 0) { + servos[servoPinMap[pin]].attach(PIN_TO_DIGITAL(pin), minPulse, maxPulse); + } else { + servos[servoPinMap[pin]].attach(PIN_TO_DIGITAL(pin)); + } + } else { + Firmata.sendString("Max servos attached"); + } +} + +void detachServo(byte pin) +{ + servos[servoPinMap[pin]].detach(); + // if we're detaching the last servo, decrement the count + // otherwise store the index of the detached servo + if (servoPinMap[pin] == servoCount && servoCount > 0) { + servoCount--; + } else if (servoCount > 0) { + // keep track of detached servos because we want to reuse their indexes + // before incrementing the count of attached servos + detachedServoCount++; + detachedServos[detachedServoCount - 1] = servoPinMap[pin]; + } + + servoPinMap[pin] = 255; +} + +void enableI2CPins() +{ + byte i; + // is there a faster way to do this? would probaby require importing + // Arduino.h to get SCL and SDA pins + for (i = 0; i < TOTAL_PINS; i++) { + if (IS_PIN_I2C(i)) { + // mark pins as i2c so they are ignore in non i2c data requests + setPinModeCallback(i, PIN_MODE_I2C); + } + } + + isI2CEnabled = true; + + Wire.begin(); +} + +/* disable the i2c pins so they can be used for other functions */ +void disableI2CPins() { + isI2CEnabled = false; + // disable read continuous mode for all devices + queryIndex = -1; +} + +void readAndReportData(byte address, int theRegister, byte numBytes, byte stopTX) { + // allow I2C requests that don't require a register read + // for example, some devices using an interrupt pin to signify new data available + // do not always require the register read so upon interrupt you call Wire.requestFrom() + if (theRegister != I2C_REGISTER_NOT_SPECIFIED) { + Wire.beginTransmission(address); + wireWrite((byte)theRegister); + Wire.endTransmission(stopTX); // default = true + // do not set a value of 0 + if (i2cReadDelayTime > 0) { + // delay is necessary for some devices such as WiiNunchuck + delayMicroseconds(i2cReadDelayTime); + } + } else { + theRegister = 0; // fill the register with a dummy value + } + + Wire.requestFrom(address, numBytes); // all bytes are returned in requestFrom + + // check to be sure correct number of bytes were returned by slave + if (numBytes < Wire.available()) { + Firmata.sendString("I2C: Too many bytes received"); + } else if (numBytes > Wire.available()) { + Firmata.sendString("I2C: Too few bytes received"); + } + + i2cRxData[0] = address; + i2cRxData[1] = theRegister; + + for (int i = 0; i < numBytes && Wire.available(); i++) { + i2cRxData[2 + i] = wireRead(); + } + + // send slave address, register and received bytes + Firmata.sendSysex(SYSEX_I2C_REPLY, numBytes + 2, i2cRxData); +} + +void outputPort(byte portNumber, byte portValue, byte forceSend) +{ + // pins not configured as INPUT are cleared to zeros + portValue = portValue & portConfigInputs[portNumber]; + // only send if the value is different than previously sent + if (forceSend || previousPINs[portNumber] != portValue) { + Firmata.sendDigitalPort(portNumber, portValue); + previousPINs[portNumber] = portValue; + } +} + +/* ----------------------------------------------------------------------------- + * check all the active digital inputs for change of state, then add any events + * to the Serial output queue using Serial.print() */ +void checkDigitalInputs(void) +{ + /* Using non-looping code allows constants to be given to readPort(). + * The compiler will apply substantial optimizations if the inputs + * to readPort() are compile-time constants. */ + if (TOTAL_PORTS > 0 && reportPINs[0]) outputPort(0, readPort(0, portConfigInputs[0]), false); + if (TOTAL_PORTS > 1 && reportPINs[1]) outputPort(1, readPort(1, portConfigInputs[1]), false); + if (TOTAL_PORTS > 2 && reportPINs[2]) outputPort(2, readPort(2, portConfigInputs[2]), false); + if (TOTAL_PORTS > 3 && reportPINs[3]) outputPort(3, readPort(3, portConfigInputs[3]), false); + if (TOTAL_PORTS > 4 && reportPINs[4]) outputPort(4, readPort(4, portConfigInputs[4]), false); + if (TOTAL_PORTS > 5 && reportPINs[5]) outputPort(5, readPort(5, portConfigInputs[5]), false); + if (TOTAL_PORTS > 6 && reportPINs[6]) outputPort(6, readPort(6, portConfigInputs[6]), false); + if (TOTAL_PORTS > 7 && reportPINs[7]) outputPort(7, readPort(7, portConfigInputs[7]), false); + if (TOTAL_PORTS > 8 && reportPINs[8]) outputPort(8, readPort(8, portConfigInputs[8]), false); + if (TOTAL_PORTS > 9 && reportPINs[9]) outputPort(9, readPort(9, portConfigInputs[9]), false); + if (TOTAL_PORTS > 10 && reportPINs[10]) outputPort(10, readPort(10, portConfigInputs[10]), false); + if (TOTAL_PORTS > 11 && reportPINs[11]) outputPort(11, readPort(11, portConfigInputs[11]), false); + if (TOTAL_PORTS > 12 && reportPINs[12]) outputPort(12, readPort(12, portConfigInputs[12]), false); + if (TOTAL_PORTS > 13 && reportPINs[13]) outputPort(13, readPort(13, portConfigInputs[13]), false); + if (TOTAL_PORTS > 14 && reportPINs[14]) outputPort(14, readPort(14, portConfigInputs[14]), false); + if (TOTAL_PORTS > 15 && reportPINs[15]) outputPort(15, readPort(15, portConfigInputs[15]), false); +} + +// ----------------------------------------------------------------------------- +/* sets the pin mode to the correct state and sets the relevant bits in the + * two bit-arrays that track Digital I/O and PWM status + */ +void setPinModeCallback(byte pin, int mode) +{ + if (Firmata.getPinMode(pin) == PIN_MODE_IGNORE) + return; + + if (Firmata.getPinMode(pin) == PIN_MODE_I2C && isI2CEnabled && mode != PIN_MODE_I2C) { + // disable i2c so pins can be used for other functions + // the following if statements should reconfigure the pins properly + disableI2CPins(); + } + if (IS_PIN_DIGITAL(pin) && mode != PIN_MODE_SERVO) { + if (servoPinMap[pin] < MAX_SERVOS && servos[servoPinMap[pin]].attached()) { + detachServo(pin); + } + } + if (IS_PIN_ANALOG(pin)) { + reportAnalogCallback(PIN_TO_ANALOG(pin), mode == PIN_MODE_ANALOG ? 1 : 0); // turn on/off reporting + } + if (IS_PIN_DIGITAL(pin)) { + if (mode == INPUT || mode == PIN_MODE_PULLUP) { + portConfigInputs[pin / 8] |= (1 << (pin & 7)); + } else { + portConfigInputs[pin / 8] &= ~(1 << (pin & 7)); + } + } + Firmata.setPinState(pin, 0); + switch (mode) { + case PIN_MODE_ANALOG: + if (IS_PIN_ANALOG(pin)) { + if (IS_PIN_DIGITAL(pin)) { + pinMode(PIN_TO_DIGITAL(pin), INPUT); // disable output driver +#if ARDUINO <= 100 + // deprecated since Arduino 1.0.1 - TODO: drop support in Firmata 2.6 + digitalWrite(PIN_TO_DIGITAL(pin), LOW); // disable internal pull-ups +#endif + } + Firmata.setPinMode(pin, PIN_MODE_ANALOG); + } + break; + case INPUT: + if (IS_PIN_DIGITAL(pin)) { + pinMode(PIN_TO_DIGITAL(pin), INPUT); // disable output driver +#if ARDUINO <= 100 + // deprecated since Arduino 1.0.1 - TODO: drop support in Firmata 2.6 + digitalWrite(PIN_TO_DIGITAL(pin), LOW); // disable internal pull-ups +#endif + Firmata.setPinMode(pin, INPUT); + } + break; + case PIN_MODE_PULLUP: + if (IS_PIN_DIGITAL(pin)) { + pinMode(PIN_TO_DIGITAL(pin), INPUT_PULLUP); + Firmata.setPinMode(pin, PIN_MODE_PULLUP); + Firmata.setPinState(pin, 1); + } + break; + case OUTPUT: + if (IS_PIN_DIGITAL(pin)) { + if (Firmata.getPinMode(pin) == PIN_MODE_PWM) { + // Disable PWM if pin mode was previously set to PWM. + digitalWrite(PIN_TO_DIGITAL(pin), LOW); + } + pinMode(PIN_TO_DIGITAL(pin), OUTPUT); + Firmata.setPinMode(pin, OUTPUT); + } + break; + case PIN_MODE_PWM: + if (IS_PIN_PWM(pin)) { + pinMode(PIN_TO_PWM(pin), OUTPUT); + analogWrite(PIN_TO_PWM(pin), 0); + Firmata.setPinMode(pin, PIN_MODE_PWM); + } + break; + case PIN_MODE_SERVO: + if (IS_PIN_DIGITAL(pin)) { + Firmata.setPinMode(pin, PIN_MODE_SERVO); + if (servoPinMap[pin] == 255 || !servos[servoPinMap[pin]].attached()) { + // pass -1 for min and max pulse values to use default values set + // by Servo library + attachServo(pin, -1, -1); + } + } + break; + case PIN_MODE_I2C: + if (IS_PIN_I2C(pin)) { + // mark the pin as i2c + // the user must call I2C_CONFIG to enable I2C for a device + Firmata.setPinMode(pin, PIN_MODE_I2C); + } + break; + case PIN_MODE_SERIAL: +#ifdef FIRMATA_SERIAL_FEATURE + serialFeature.handlePinMode(pin, PIN_MODE_SERIAL); +#endif + break; + default: + Firmata.sendString("Unknown pin mode"); // TODO: put error msgs in EEPROM + } + // TODO: save status to EEPROM here, if changed +} + +/* + * Sets the value of an individual pin. Useful if you want to set a pin value but + * are not tracking the digital port state. + * Can only be used on pins configured as OUTPUT. + * Cannot be used to enable pull-ups on Digital INPUT pins. + */ +void setPinValueCallback(byte pin, int value) +{ + if (pin < TOTAL_PINS && IS_PIN_DIGITAL(pin)) { + if (Firmata.getPinMode(pin) == OUTPUT) { + Firmata.setPinState(pin, value); + digitalWrite(PIN_TO_DIGITAL(pin), value); + } + } +} + +void analogWriteCallback(byte pin, int value) +{ + if (pin < TOTAL_PINS) { + switch (Firmata.getPinMode(pin)) { + case PIN_MODE_SERVO: + if (IS_PIN_DIGITAL(pin)) + servos[servoPinMap[pin]].write(value); + Firmata.setPinState(pin, value); + break; + case PIN_MODE_PWM: + if (IS_PIN_PWM(pin)) + analogWrite(PIN_TO_PWM(pin), value); + Firmata.setPinState(pin, value); + break; + } + } +} + +void digitalWriteCallback(byte port, int value) +{ + byte pin, lastPin, pinValue, mask = 1, pinWriteMask = 0; + + if (port < TOTAL_PORTS) { + // create a mask of the pins on this port that are writable. + lastPin = port * 8 + 8; + if (lastPin > TOTAL_PINS) lastPin = TOTAL_PINS; + for (pin = port * 8; pin < lastPin; pin++) { + // do not disturb non-digital pins (eg, Rx & Tx) + if (IS_PIN_DIGITAL(pin)) { + // do not touch pins in PWM, ANALOG, SERVO or other modes + if (Firmata.getPinMode(pin) == OUTPUT || Firmata.getPinMode(pin) == INPUT) { + pinValue = ((byte)value & mask) ? 1 : 0; + if (Firmata.getPinMode(pin) == OUTPUT) { + pinWriteMask |= mask; + } else if (Firmata.getPinMode(pin) == INPUT && pinValue == 1 && Firmata.getPinState(pin) != 1) { + // only handle INPUT here for backwards compatibility +#if ARDUINO > 100 + pinMode(pin, INPUT_PULLUP); +#else + // only write to the INPUT pin to enable pullups if Arduino v1.0.0 or earlier + pinWriteMask |= mask; +#endif + } + Firmata.setPinState(pin, pinValue); + } + } + mask = mask << 1; + } + writePort(port, (byte)value, pinWriteMask); + } +} + + +// ----------------------------------------------------------------------------- +/* sets bits in a bit array (int) to toggle the reporting of the analogIns + */ +//void FirmataClass::setAnalogPinReporting(byte pin, byte state) { +//} +void reportAnalogCallback(byte analogPin, int value) +{ + if (analogPin < TOTAL_ANALOG_PINS) { + if (value == 0) { + analogInputsToReport = analogInputsToReport & ~ (1 << analogPin); + } else { + analogInputsToReport = analogInputsToReport | (1 << analogPin); + // prevent during system reset or all analog pin values will be reported + // which may report noise for unconnected analog pins + if (!isResetting) { + // Send pin value immediately. This is helpful when connected via + // ethernet, wi-fi or bluetooth so pin states can be known upon + // reconnecting. + Firmata.sendAnalog(analogPin, analogRead(analogPin)); + } + } + } + // TODO: save status to EEPROM here, if changed +} + +void reportDigitalCallback(byte port, int value) +{ + if (port < TOTAL_PORTS) { + reportPINs[port] = (byte)value; + // Send port value immediately. This is helpful when connected via + // ethernet, wi-fi or bluetooth so pin states can be known upon + // reconnecting. + if (value) outputPort(port, readPort(port, portConfigInputs[port]), true); + } + // do not disable analog reporting on these 8 pins, to allow some + // pins used for digital, others analog. Instead, allow both types + // of reporting to be enabled, but check if the pin is configured + // as analog when sampling the analog inputs. Likewise, while + // scanning digital pins, portConfigInputs will mask off values from any + // pins configured as analog +} + +/*============================================================================== + * SYSEX-BASED commands + *============================================================================*/ + +void sysexCallback(byte command, byte argc, byte *argv) +{ + byte mode; + byte stopTX; + byte slaveAddress; + byte data; + int slaveRegister; + unsigned int delayTime; + + switch (command) { + case I2C_REQUEST: + mode = argv[1] & I2C_READ_WRITE_MODE_MASK; + if (argv[1] & I2C_10BIT_ADDRESS_MODE_MASK) { + Firmata.sendString("10-bit addressing not supported"); + return; + } + else { + slaveAddress = argv[0]; + } + + // need to invert the logic here since 0 will be default for client + // libraries that have not updated to add support for restart tx + if (argv[1] & I2C_END_TX_MASK) { + stopTX = I2C_RESTART_TX; + } + else { + stopTX = I2C_STOP_TX; // default + } + + switch (mode) { + case I2C_WRITE: + Wire.beginTransmission(slaveAddress); + for (byte i = 2; i < argc; i += 2) { + data = argv[i] + (argv[i + 1] << 7); + wireWrite(data); + } + Wire.endTransmission(); + delayMicroseconds(70); + break; + case I2C_READ: + if (argc == 6) { + // a slave register is specified + slaveRegister = argv[2] + (argv[3] << 7); + data = argv[4] + (argv[5] << 7); // bytes to read + } + else { + // a slave register is NOT specified + slaveRegister = I2C_REGISTER_NOT_SPECIFIED; + data = argv[2] + (argv[3] << 7); // bytes to read + } + readAndReportData(slaveAddress, (int)slaveRegister, data, stopTX); + break; + case I2C_READ_CONTINUOUSLY: + if ((queryIndex + 1) >= I2C_MAX_QUERIES) { + // too many queries, just ignore + Firmata.sendString("too many queries"); + break; + } + if (argc == 6) { + // a slave register is specified + slaveRegister = argv[2] + (argv[3] << 7); + data = argv[4] + (argv[5] << 7); // bytes to read + } + else { + // a slave register is NOT specified + slaveRegister = (int)I2C_REGISTER_NOT_SPECIFIED; + data = argv[2] + (argv[3] << 7); // bytes to read + } + queryIndex++; + query[queryIndex].addr = slaveAddress; + query[queryIndex].reg = slaveRegister; + query[queryIndex].bytes = data; + query[queryIndex].stopTX = stopTX; + break; + case I2C_STOP_READING: + byte queryIndexToSkip; + // if read continuous mode is enabled for only 1 i2c device, disable + // read continuous reporting for that device + if (queryIndex <= 0) { + queryIndex = -1; + } else { + queryIndexToSkip = 0; + // if read continuous mode is enabled for multiple devices, + // determine which device to stop reading and remove it's data from + // the array, shifiting other array data to fill the space + for (byte i = 0; i < queryIndex + 1; i++) { + if (query[i].addr == slaveAddress) { + queryIndexToSkip = i; + break; + } + } + + for (byte i = queryIndexToSkip; i < queryIndex + 1; i++) { + if (i < I2C_MAX_QUERIES) { + query[i].addr = query[i + 1].addr; + query[i].reg = query[i + 1].reg; + query[i].bytes = query[i + 1].bytes; + query[i].stopTX = query[i + 1].stopTX; + } + } + queryIndex--; + } + break; + default: + break; + } + break; + case I2C_CONFIG: + delayTime = (argv[0] + (argv[1] << 7)); + + if (delayTime > 0) { + i2cReadDelayTime = delayTime; + } + + if (!isI2CEnabled) { + enableI2CPins(); + } + + break; + case SERVO_CONFIG: + if (argc > 4) { + // these vars are here for clarity, they'll optimized away by the compiler + byte pin = argv[0]; + int minPulse = argv[1] + (argv[2] << 7); + int maxPulse = argv[3] + (argv[4] << 7); + + if (IS_PIN_DIGITAL(pin)) { + if (servoPinMap[pin] < MAX_SERVOS && servos[servoPinMap[pin]].attached()) { + detachServo(pin); + } + attachServo(pin, minPulse, maxPulse); + setPinModeCallback(pin, PIN_MODE_SERVO); + } + } + break; + case SAMPLING_INTERVAL: + if (argc > 1) { + samplingInterval = argv[0] + (argv[1] << 7); + if (samplingInterval < MINIMUM_SAMPLING_INTERVAL) { + samplingInterval = MINIMUM_SAMPLING_INTERVAL; + } + } else { + //Firmata.sendString("Not enough data"); + } + break; + case EXTENDED_ANALOG: + if (argc > 1) { + int val = argv[1]; + if (argc > 2) val |= (argv[2] << 7); + if (argc > 3) val |= (argv[3] << 14); + analogWriteCallback(argv[0], val); + } + break; + case CAPABILITY_QUERY: + Firmata.write(START_SYSEX); + Firmata.write(CAPABILITY_RESPONSE); + for (byte pin = 0; pin < TOTAL_PINS; pin++) { + if (IS_PIN_DIGITAL(pin)) { + Firmata.write((byte)INPUT); + Firmata.write(1); + Firmata.write((byte)PIN_MODE_PULLUP); + Firmata.write(1); + Firmata.write((byte)OUTPUT); + Firmata.write(1); + } + if (IS_PIN_ANALOG(pin)) { + Firmata.write(PIN_MODE_ANALOG); + Firmata.write(10); // 10 = 10-bit resolution + } + if (IS_PIN_PWM(pin)) { + Firmata.write(PIN_MODE_PWM); + Firmata.write(8); // 8 = 8-bit resolution + } + if (IS_PIN_DIGITAL(pin)) { + Firmata.write(PIN_MODE_SERVO); + Firmata.write(14); + } + if (IS_PIN_I2C(pin)) { + Firmata.write(PIN_MODE_I2C); + Firmata.write(1); // TODO: could assign a number to map to SCL or SDA + } +#ifdef FIRMATA_SERIAL_FEATURE + serialFeature.handleCapability(pin); +#endif + Firmata.write(127); + } + Firmata.write(END_SYSEX); + break; + case PIN_STATE_QUERY: + if (argc > 0) { + byte pin = argv[0]; + Firmata.write(START_SYSEX); + Firmata.write(PIN_STATE_RESPONSE); + Firmata.write(pin); + if (pin < TOTAL_PINS) { + Firmata.write(Firmata.getPinMode(pin)); + Firmata.write((byte)Firmata.getPinState(pin) & 0x7F); + if (Firmata.getPinState(pin) & 0xFF80) Firmata.write((byte)(Firmata.getPinState(pin) >> 7) & 0x7F); + if (Firmata.getPinState(pin) & 0xC000) Firmata.write((byte)(Firmata.getPinState(pin) >> 14) & 0x7F); + } + Firmata.write(END_SYSEX); + } + break; + case ANALOG_MAPPING_QUERY: + Firmata.write(START_SYSEX); + Firmata.write(ANALOG_MAPPING_RESPONSE); + for (byte pin = 0; pin < TOTAL_PINS; pin++) { + Firmata.write(IS_PIN_ANALOG(pin) ? PIN_TO_ANALOG(pin) : 127); + } + Firmata.write(END_SYSEX); + break; + + case SERIAL_MESSAGE: +#ifdef FIRMATA_SERIAL_FEATURE + serialFeature.handleSysex(command, argc, argv); +#endif + break; + } +} + +/*============================================================================== + * SETUP() + *============================================================================*/ + +void systemResetCallback() +{ + isResetting = true; + +#ifdef FIRMATA_SERIAL_FEATURE + serialFeature.reset(); +#endif + + if (isI2CEnabled) { + disableI2CPins(); + } + + for (byte i = 0; i < TOTAL_PORTS; i++) { + reportPINs[i] = false; // by default, reporting off + portConfigInputs[i] = 0; // until activated + previousPINs[i] = 0; + } + + for (byte i = 0; i < TOTAL_PINS; i++) { + // pins with analog capability default to analog input + // otherwise, pins default to digital output + if (IS_PIN_ANALOG(i)) { + // turns off pullup, configures everything + setPinModeCallback(i, PIN_MODE_ANALOG); + } else if (IS_PIN_DIGITAL(i)) { + // sets the output to 0, configures portConfigInputs + setPinModeCallback(i, OUTPUT); + } + + servoPinMap[i] = 255; + } + // by default, do not report any analog inputs + analogInputsToReport = 0; + + detachedServoCount = 0; + servoCount = 0; + + isResetting = false; +} + +void setup() +{ + DEBUG_BEGIN(9600); + + Firmata.setFirmwareVersion(FIRMATA_FIRMWARE_MAJOR_VERSION, FIRMATA_FIRMWARE_MINOR_VERSION); + + Firmata.attach(ANALOG_MESSAGE, analogWriteCallback); + Firmata.attach(DIGITAL_MESSAGE, digitalWriteCallback); + Firmata.attach(REPORT_ANALOG, reportAnalogCallback); + Firmata.attach(REPORT_DIGITAL, reportDigitalCallback); + Firmata.attach(SET_PIN_MODE, setPinModeCallback); + Firmata.attach(SET_DIGITAL_PIN_VALUE, setPinValueCallback); + Firmata.attach(START_SYSEX, sysexCallback); + Firmata.attach(SYSTEM_RESET, systemResetCallback); + + stream.setLocalName(FIRMATA_BLE_LOCAL_NAME); + + // set the BLE connection interval - this is the fastest interval you can read inputs + stream.setConnectionInterval(FIRMATA_BLE_MIN_INTERVAL, FIRMATA_BLE_MAX_INTERVAL); + // set how often the BLE TX buffer is flushed (if not full) + stream.setFlushInterval(FIRMATA_BLE_MAX_INTERVAL); + +#ifdef BLE_REQ + for (byte i = 0; i < TOTAL_PINS; i++) { + if (IS_IGNORE_BLE_PINS(i)) { + Firmata.setPinMode(i, PIN_MODE_IGNORE); + } + } +#endif + + stream.begin(); + Firmata.begin(stream); + + systemResetCallback(); // reset to default config +} + +/*============================================================================== + * LOOP() + *============================================================================*/ +void loop() +{ + byte pin, analogPin; + + // do not process data if no BLE connection is established + // poll will send the TX buffer at the specified flush interval or when the buffer is full + if (!stream.poll()) return; + + /* DIGITALREAD - as fast as possible, check for changes and output them to the + * Stream buffer using Stream.write() */ + checkDigitalInputs(); + + /* STREAMREAD - processing incoming messagse as soon as possible, while still + * checking digital inputs. */ + while (Firmata.available()) + Firmata.processInput(); + + currentMillis = millis(); + if (currentMillis - previousMillis > samplingInterval) { + previousMillis = currentMillis; + /* ANALOGREAD - do all analogReads() at the configured sampling interval */ + for (pin = 0; pin < TOTAL_PINS; pin++) { + if (IS_PIN_ANALOG(pin) && Firmata.getPinMode(pin) == PIN_MODE_ANALOG) { + analogPin = PIN_TO_ANALOG(pin); + if (analogInputsToReport & (1 << analogPin)) { + Firmata.sendAnalog(analogPin, analogRead(analogPin)); + } + } + } + // report i2c data for all device with read continuous mode enabled + if (queryIndex > -1) { + for (byte i = 0; i < queryIndex + 1; i++) { + readAndReportData(query[i].addr, query[i].reg, query[i].bytes, query[i].stopTX); + } + } + } + +#ifdef FIRMATA_SERIAL_FEATURE + serialFeature.update(); +#endif +} + +/* + Firmata is a generic protocol for communicating with microcontrollers + from software on a host computer. It is intended to work with + any host computer software package. + To download a host software package, please click on the following link + to open the list of Firmata client libraries in your default browser. + https://github.com/firmata/arduino#firmata-client-libraries + Copyright (C) 2006-2008 Hans-Christoph Steiner. All rights reserved. + Copyright (C) 2010-2011 Paul Stoffregen. All rights reserved. + Copyright (C) 2009 Shigeru Kobayashi. All rights reserved. + Copyright (C) 2009-2016 Jeff Hoefs. All rights reserved. + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + See file LICENSE.txt for further informations on licensing terms. + Last updated October 16th, 2016 +*/ + + diff --git a/libraries/CurieBLE/examples/test/CommunitySketches/StandardFirmataBLE/bleConfig.h b/libraries/CurieBLE/examples/test/CommunitySketches/StandardFirmataBLE/bleConfig.h new file mode 100644 index 00000000..aeb96a81 --- /dev/null +++ b/libraries/CurieBLE/examples/test/CommunitySketches/StandardFirmataBLE/bleConfig.h @@ -0,0 +1,112 @@ +/*================================================================================================== + * BLE CONFIGURATION + * + * If you are using an Arduino 101, you do not need to make any changes to this file (unless you + * need a unique ble local name (see below). If you are using another supported BLE board or shield, + * follow the instructions for the specific board or shield below. + * + * Make sure you have the Intel Curie Boards package v1.0.6 or higher installed via the Arduino + * Boards Manager. + * + * Supported boards and shields: + * - Arduino 101 (recommended) + * - RedBearLab BLE Shield (v2) ** to be verified ** + * - RedBearLab BLE Nano ** works with modifications ** + * + *================================================================================================*/ + +// change this to a unique name per board if running StandardFirmataBLE on multiple boards +// within the same physical space +#define FIRMATA_BLE_LOCAL_NAME "FIRMATA" + +/* + * RedBearLab BLE Shield + * + * If you are using a RedBearLab BLE shield, uncomment the define below. + * Also, change the define for BLE_RST if you have the jumper set to pin 7 rather than pin 4. + * + * You will need to use the shield with an Arduino Zero, Due, Mega, or other board with sufficient + * Flash and RAM. Arduino Uno, Leonardo and other ATmega328p and Atmega32u4 boards to not have + * enough memory to run StandardFirmataBLE. + * + * TODO: verify if this works and with which boards it works. + * + * Test script: https://gist.github.com/soundanalogous/927360b797574ed50e27 + */ +//#define REDBEAR_BLE_SHIELD + +#ifdef REDBEAR_BLE_SHIELD +#include +#include +#include "utility/BLEStream.h" + +#define BLE_REQ 9 +#define BLE_RDY 8 +#define BLE_RST 4 // 4 or 7 via jumper on shield + +BLEStream stream(BLE_REQ, BLE_RDY, BLE_RST); +#endif + + +/*================================================================================================== + * END BLE CONFIGURATION - you should not need to change anything below this line + *================================================================================================*/ + +/* + * Arduino 101 + * + * Make sure you have the Intel Curie Boards package v1.0.6 or higher installed via the Arduino + * Boards Manager. + * + * Test script: https://gist.github.com/soundanalogous/927360b797574ed50e27 + */ +#ifdef _VARIANT_ARDUINO_101_X_ +#include +#include "BLEStream.h" +BLEStream stream; +#endif + + +/* + * RedBearLab BLE Nano (with default switch settings) + * + * Blocked on this issue: https://github.com/RedBearLab/nRF51822-Arduino/issues/46 + * Works with modifications. See comments at top of the test script referenced below. + * When the RBL nRF51822-Arduino library issue is resolved, this should work witout + * any modifications. + * + * Test script: https://gist.github.com/soundanalogous/d39bb3eb36333a0906df + * + * Note: If you have changed the solder jumpers on the Nano you may encounter issues since + * the pins are currently mapped in Firmata only for the default (factory) jumper settings. + */ +// #ifdef BLE_NANO +// #include +// #include "utility/BLEStream.h" +// BLEStream stream; +// #endif + + +/* + * RedBearLab Blend and Blend Micro + * + * StandardFirmataBLE requires too much Flash and RAM to run on the ATmega32u4-based Blend + * and Blend Micro boards. It may work with ConfigurableFirmata selecting only analog and/or + * digital I/O. + */ +// #if defined(BLEND_MICRO) || defined(BLEND) +// #include +// #include +// #include "utility/BLEStream.h" + +// #define BLE_REQ 6 +// #define BLE_RDY 7 +// #define BLE_RST 4 + +// BLEStream stream(BLE_REQ, BLE_RDY, BLE_RST); +// #endif + + +#if defined(BLE_REQ) && defined(BLE_RDY) && defined(BLE_RST) +#define IS_IGNORE_BLE_PINS(p) ((p) == BLE_REQ || (p) == BLE_RDY || (p) == BLE_RST) +#endif diff --git a/libraries/CurieBLE/examples/test/discoveratperipheral/discoveratperipheral.ino b/libraries/CurieBLE/examples/test/discoveratperipheral/discoveratperipheral.ino new file mode 100644 index 00000000..8de71767 --- /dev/null +++ b/libraries/CurieBLE/examples/test/discoveratperipheral/discoveratperipheral.ino @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2016 Intel Corporation. All rights reserved. + * See the bottom of this file for the license terms. + */ + +/* + * Sketch: discoveratperipheral.ino. + * + * Description: + * This is a BLE Central sketch that looks for a particular + * Characteristic in a connected Peripheral to write to. The + * Peripheral with the special Characteristic will blink its + * LED. + * + * Notes: + * - This sketch is Arduino BLE Peripheral LED example. + * Please see licensing at the bottom of this file. + * - Expected Peripheral Characteristic: 19b10000e8f2537e4f6cd104768a1214 + */ + +#include + +// LED pin +#define LED_PIN 13 + +// create service +BLEService ledService("19b10000e8f2537e4f6cd104768a1214"); + +void setup() { + Serial.begin(9600); + + // set LED pin to output mode + pinMode(LED_PIN, OUTPUT); + + // begin initialization + BLE.begin(); + Serial.println(BLE.address()); + + // set advertised local name and service UUID + BLE.setLocalName("LED"); + + BLE.advertise(); + + Serial.println(F("BLE LED Peripheral")); +} + +void loop() { + BLEDevice central = BLE.central(); + + if (central) { + // central connected to peripheral + Serial.print(F("Connected to central: ")); + Serial.println(central.address()); + + controlLed(central); + // central disconnected + Serial.print(F("Disconnected from central: ")); + Serial.println(central.address()); + } +} + +void controlLed(BLEDevice ¢ral) +{ + if (central.discoverAttributes() == false) + { + Serial.println("Discover failed, Disconnecting..."); + central.disconnect(); + return; + } + + BLECharacteristic ledCharacteristic = central.characteristic("19b10101-e8f2-537e-4f6c-d104768a1214"); + + if (!ledCharacteristic) + { + central.disconnect(); + //while(1) + { + Serial.println("Central does not have LED characteristic!"); + delay(5000); + } + return; + } + + ledCharacteristic.subscribe(); + + unsigned char ledstate = 0; + + while (central.connected()) + { + if (ledstate == 1) + { + ledstate = 0; + } + else + { + ledstate = 1; + } + ledCharacteristic.write(&ledstate, sizeof(ledstate)); + delay(5000); + } + Serial.print("Disconnected"); + Serial.println(central.address()); +} + + +/* + Arduino BLE Peripheral LED example + Copyright (c) 2016 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + diff --git a/libraries/CurieBLE/examples/test/profileatcentral/profileatcentral.ino b/libraries/CurieBLE/examples/test/profileatcentral/profileatcentral.ino new file mode 100644 index 00000000..2fe20520 --- /dev/null +++ b/libraries/CurieBLE/examples/test/profileatcentral/profileatcentral.ino @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2017 Intel Corporation. All rights reserved. + * See the bottom of this file for the license terms. + */ + +/* + * Sketch: profileatcentral.ino + * + * Description: + * This is a BLE Central sketch that demostrates the setting of the + * BLE descriptor. + * + * Notes: + * - This sketch is based on the Arduino BLE Peripheral LED example. + * Please refer to licensing agreement at the bottom of this file. + */ + +#include "CurieBLE.h" +#include +// LED pin +#define LED_PIN 13 +BLEService ledService("19b10100e8f2537e4f6cd104768a1214"); + +BLECharacteristic switchCharacteristic("19b10101e8f2537e4f6cd104768a1214", BLERead | BLEWrite | BLENotify, 1); + +BLEDescriptor switchDescriptor("2901", "switch"); + +void setup() { + Serial.begin(115200); + + // set LED pin to output mode + pinMode(LED_PIN, OUTPUT); + + // begin initialization + BLE.begin(); + Serial.println(BLE.address()); + ledService.addCharacteristic(switchCharacteristic); + switchCharacteristic.addDescriptor(switchDescriptor); + BLE.addService(ledService); + + BLE.scanForName("LED"); +} + + +void loop() { + BLEDevice peripheral = BLE.available(); + if (peripheral) + { + Serial.println(peripheral.address()); + + BLE.stopScan(); + + if (peripheral.connect()) + { + Serial.print("Connected: "); + Serial.println(peripheral.address()); + while (peripheral.connected()) + { + delay (1000); + } + } + else + { + Serial.println("Failed to connect!"); + } + delay (4000); + BLE.scanForName("LED"); + } +} + + +/* + Arduino BLE Peripheral LED example + Copyright (c) 2016 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + + From 312278182c64d015f00fa5cba9a6e39788e3cd44 Mon Sep 17 00:00:00 2001 From: Dino Tinitigan Date: Tue, 7 Mar 2017 15:01:31 -0800 Subject: [PATCH 41/91] -add error functions -add error functions that sets an error_code variable in shared memory and halt the ARC core -this will be used by CODK-M based firmware to toggle the fault led on the Arduino 101 --- cores/arduino/Arduino.h | 1 + cores/arduino/error.cpp | 49 +++++++++++++++++++ cores/arduino/error.h | 37 ++++++++++++++ .../framework/include/platform.h | 2 + 4 files changed, 89 insertions(+) create mode 100644 cores/arduino/error.cpp create mode 100644 cores/arduino/error.h diff --git a/cores/arduino/Arduino.h b/cores/arduino/Arduino.h index e656d4ee..a4cce47d 100644 --- a/cores/arduino/Arduino.h +++ b/cores/arduino/Arduino.h @@ -110,6 +110,7 @@ extern uint8_t pinmuxMode[NUM_DIGITAL_PINS]; #include "WMath.h" #include "HardwareSerial.h" #include "wiring_pulse.h" +#include "error.h" #endif // __cplusplus diff --git a/cores/arduino/error.cpp b/cores/arduino/error.cpp new file mode 100644 index 00000000..7371415e --- /dev/null +++ b/cores/arduino/error.cpp @@ -0,0 +1,49 @@ +/* +Copyright (c) 2017 Intel Corporation. All right reserved. + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +*/ + +#include "error.h" + +void error_continue() +{ + error_continue(1); +} + +void error_continue(uint8_t error_code) +{ + uint32_t exc_addr = aux_reg_read(ARC_V2_EFA); + uint32_t ecr = aux_reg_read(ARC_V2_ECR); + + pr_error(0, "Exception vector: 0x%x, cause code: 0x%x, parameter 0x%x\n", + ARC_V2_ECR_VECTOR(ecr), + ARC_V2_ECR_CODE(ecr), + ARC_V2_ECR_PARAMETER(ecr)); + pr_error(0, "Address 0x%x\n", exc_addr); + shared_data->error_code = error_code; +} + +void error_halt() +{ + error_halt(1); +} + +void error_halt(uint8_t error_code) +{ + error_continue(error_code); + __asm__("flag 0x01") ; /* Halt the CPU */ +} diff --git a/cores/arduino/error.h b/cores/arduino/error.h new file mode 100644 index 00000000..9ca0be1b --- /dev/null +++ b/cores/arduino/error.h @@ -0,0 +1,37 @@ +/* +Copyright (c) 2017 Intel Corporation. All right reserved. + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +*/ + +#ifndef _Error_h +#define _Error_h + +#include +#include "os/os.h" +#include "infra/log.h" +#include "aux_regs.h" +#include "platform.h" + +extern void error_halt(); + +extern void error_halt(uint8_t error_code); + +extern void error_continue(); + +extern void error_continue(uint8_t error_code); + +#endif diff --git a/system/libarc32_arduino101/framework/include/platform.h b/system/libarc32_arduino101/framework/include/platform.h index 71c7e7f2..801f87f5 100644 --- a/system/libarc32_arduino101/framework/include/platform.h +++ b/system/libarc32_arduino101/framework/include/platform.h @@ -156,6 +156,8 @@ struct platform_shared_block_ { void* quark_restore_addr; uint32_t pm_int_status; + + uint8_t error_code; }; #define RAM_START 0xA8000000 From dea61b83818d92c6d11cd80d03368f5886f3f4f1 Mon Sep 17 00:00:00 2001 From: Dino Tinitigan Date: Wed, 22 Feb 2017 14:08:30 -0800 Subject: [PATCH 42/91] CDC-ACM CODK-M firmware compatibility changes -compatibility changes for CDC-ACM usb serial to work with upcoming CODK-M based firmware -use a fixed delay between writes instead of trying to mimick UART throttling --- cores/arduino/CDCSerialClass.cpp | 8 +- tatus | 4812 ++++++++++++++++++++++++++++++ 2 files changed, 4816 insertions(+), 4 deletions(-) create mode 100644 tatus diff --git a/cores/arduino/CDCSerialClass.cpp b/cores/arduino/CDCSerialClass.cpp index 5cd0083d..878cbac6 100644 --- a/cores/arduino/CDCSerialClass.cpp +++ b/cores/arduino/CDCSerialClass.cpp @@ -30,6 +30,7 @@ #include "wiring_digital.h" #include "variant.h" +#define CDCACM_FIXED_DELAY 64 extern void CDCSerial_Handler(void); extern void serialEventRun1(void) __attribute__((weak)); @@ -132,7 +133,7 @@ void CDCSerialClass::flush( void ) size_t CDCSerialClass::write( const uint8_t uc_data ) { - uint32_t retries = 1; + uint32_t retries = 2; if (!_shared_data->device_open || !_shared_data->host_open) return(0); @@ -147,9 +148,8 @@ size_t CDCSerialClass::write( const uint8_t uc_data ) _tx_buffer->data[_tx_buffer->head] = uc_data; _tx_buffer->head = i; - // Mimick the throughput of a typical UART by throttling the data - // flow according to the configured baud rate - delayMicroseconds(_writeDelayUsec); + // Just use a fixed delay to make it compatible with the CODK-M based firmware + delayMicroseconds(CDCACM_FIXED_DELAY); break; } } while (retries--); diff --git a/tatus b/tatus new file mode 100644 index 00000000..0bf5a18c --- /dev/null +++ b/tatus @@ -0,0 +1,4812 @@ +commit 178bb5f58570f9e71b7423940c11e4d6d97e8f1a +Author: Dino Tinitigan +Date: Wed Feb 22 14:08:30 2017 -0800 + + CDC-ACM CODK-M firmware compatibility changes + + -compatibility changes for CDC-ACM usb serial to work with upcoming + CODK-M based firmware + -use a fixed delay between writes instead of trying to mimick UART + throttling + +commit ee08a03b21d5c141020b328974c2392a8484dfa9 +Author: Erik Nyquist +Date: Fri Jan 27 16:28:38 2017 -0800 + + Use single dataReady() method, instead of accelDataReady/gyroDataReady + + This method is a bit more flexible. There is a version with no + parameters, which will return true if all enabled sensors have new + data. There is one overload, that takes a single 'flags' parameter, + which returns true if all enabled *and* selected sensors have new data. + Sensors are selectable through bit flags. For example; + + CurieIMU.dataReady() : this will return true if both the accel and gyro + are enabled, and both have new data ready. + + CurieIMU.dataReady(ACCEL | GYRO) : this will return true if both the + accel and gyro are enabled, and both have new data ready. + + CurieIMU.dataReady(GYRO) : this will return true if the gyro is + enabled and has new data ready. + + CurieIMU.dataReady(ACCEL) : this will return true if the accel is + enabled and has new data ready. + + This also involved changing the 'begin' method to allow selective + enabling of sensors, e.g. + + CurieIMU.begin() : same as it always has, initializes IMU, enabling + both accel and gyro + + CurieIMU.begin(ACCEL | GYRO) : initializes IMU, enabling both accel + and gyro + + CurieIMU.begin(ACCEL) : initializes IMU, enabling accel only + +commit fb578000afad9bc5cdf74358e8c3acbc7a04f9e8 +Author: Sidney Leung +Date: Wed Feb 15 22:28:08 2017 -0800 + + Jira 792, Support addition UUID types, git PR 386. + + Features added: + + 1. Add the support for two addition UUID types, + UUID16_SOME and UUID128_SOME. These types, + practically, behaves the same as their related + ALL types. Sandeep found that the Apple devices + made use of these additional types and requested + for their support. + + File mods: + + 1. BLEDeviceManager.cpp: + - Add UUID16_SOME and UUID128_SOME at places + checking for UUID types. + +commit f61091473e5888337098a103daccf321e3fe328c +Author: lianggao +Date: Wed Feb 8 10:59:09 2017 +0800 + + Jira 804 BLE Characteristic initialization issue, git 366 + + Issue: + - Created Characteristic failed to reflect the initialized + value. + + Root cause: + - During initialization, the length field was incorrectly + skipped over. + +commit ff32c97b547b42e8afa3e423c7ad9ddf4057b4dd +Author: lianggao +Date: Tue Dec 20 18:21:23 2016 +0800 + + BLE Peripheral cannot discover Central attributes + + 1. Add test sketches discoveratperipheral.ino and profileatcentral.ino + 2. Modify BLEDeviceManager.cpp to add central to profile buffer in peripheral + role. + +commit d6c68f26914bf9508e8b76081d383a5cd432c7b6 +Author: Erik Nyquist +Date: Tue Feb 14 12:40:25 2017 -0800 + + flash.ld: fix mis-aligned .data section + + The end of the .data section in flash must be explicitly word-aligned, + otherwise corruption can occur in a .data section that happens to contain + non-word aligned data. + +commit 0285190f5d94dd2228a33ec5ef91d0e3cecfed56 +Author: Erik Nyquist +Date: Thu Feb 9 10:18:37 2017 -0800 + + EEPROM.cpp: Use double quotes for include file + + works in the Arduino IDE, but it's not actually in a system + include location so it makes non-IDE (i.e. Klocwork) builds fail + +commit 547ecd723e39da4044cb636d6bdbb8956cb2f2f2 +Author: lianggao +Date: Fri Jan 13 09:04:29 2017 +0800 + + Sketch crash using both Firmata and BLE library, gitHub issue #377 + + 1. The BLEStream object adds profile when boot but the HW doesn't be + initialized and makes APP crash. + 2. Change the BLE initial process not depend on HW. Buffer the + attributes if HW not initialized. + 3. Changed files + libraries/CurieBLE/src/BLEDevice.h - expose constructor + libraries/CurieBLE/src/BLEPeripheral.cpp - not call HW init function + libraries/CurieBLE/src/internal/BLEDeviceManager.cpp - change init order + libraries/CurieBLE/src/internal/BLEProfileManager.cpp - change constructor + +commit fe14b8bd2600544330e95ccf22f7f91c114467c0 +Author: lianggao +Date: Mon Feb 6 14:13:37 2017 +0800 + + Fix #380 characteristic written returns incorrect value after first connect + + 1. Not set the flage when local device try to set the value. + 2. Changed file + libraries/CurieBLE/src/internal/BLECharacteristicImp.cpp + +commit 0eac6a00a766e424b87aecbbb734eb76bcb71694 +Author: lianggao +Date: Fri Jan 13 22:07:08 2017 +0800 + + Jira 794 Inconsistent writeInt() result with different Peripherals, git 385 + + Root cause: + - As a Central, the write() operation can produce two different + commands to a Peripheral depending on the Characteristic. + - One command is a simple write without aknowledgement from + Peripheral and the other requires a complete handshake for + each write operation. + - Root cause of the issue was that the function, + BLECharacteristicImp::write(), did not check the + characteristic property to determine if the caller requires + a response. It just treats all calls do not require a + response. + + Feature added: + - For write with respond from Peripheral, it is now a + blocking call (it also satisfied Arduino's request). + + Modifications: + 1. libraries/CurieBLE/src/internal/BLECallbacks.cpp: + - ble_on_write_no_rsp_complete: CB to process Peripheral + Response to complete a write operation. + 2. libraries/CurieBLE/src/internal/BLECallbacks.h: + - Function definition added. + 3. libraries/CurieBLE/src/internal/BLECharacteristicImp.cpp: + - In function write(), check the characteristic property to + determine whether the call requires a response. + - Added a flag to signal the waiting on Peripheral + Response for a write operation. + - Write with response is now a blocking call. + 4. BLECharacteristicImp.h: + - Prototyping. + +commit 40b0c43967187137c9bde6bf88f57732a8a30aa4 +Author: lianggao +Date: Mon Jan 9 10:50:13 2017 +0800 + + Jira 797, Central can scan with MAC address, git 376 + + New feature: + - Add the capability for a Central to scan for a + Peripheral using its MAC address. + + Code Modifications: + - Added the API for MAC address scanning. + - For Device Manager, added provision for holding the + MAC address of a Peripheral. + - For scan discovery handler, added the checking + for MAC address comparison, if MAC address scanning + is requested. + + File changes: + + 1. libraries/CurieBLE/src/BLEDevice.cpp: + - Added API for MAC address scanning. + 2. libraries/CurieBLE/src/BLEDevice.h: + - API definition. + 3. libraries/CurieBLE/src/internal/BLEDeviceManager.cpp: + - Added provision for storing the MAC address. + - Added MAC address comparison in the scan discovery + handle if MAC address scanning is selected. + 4. libraries/CurieBLE/src/internal/BLEDeviceManager.h: + - Prototyping. + +commit 78c3d0ad0a5475f7809d31dfd1c2d75cbcf4a58c +Author: Erik Nyquist +Date: Thu Feb 2 13:49:50 2017 -0800 + + EEPROM library: move function definitions into separate .cpp files + +commit 001cab44592510cf9ea799d7a6f34d237d5b149c +Author: Erik Nyquist +Date: Wed Feb 1 11:36:59 2017 -0800 + + freeMemory.ino: add introductory comment + +commit b60860237540cde903b81615c3324f47f03cd756 +Author: Erik Nyquist +Date: Tue Jan 10 15:18:27 2017 -0800 + + Add new library MemoryFree + + This is the MemoryFree libary from + http://playground.arduino.cc/code/AvailableMemory, rewritten specifically + for Arduino 101 and tinyTILE. It provides some functions for querying + available stack & heap space. + +commit 29daefb64ae643a0cb2bcb15b586e90a206bf7e8 +Author: Dino Tinitigan +Date: Tue Jan 10 10:24:15 2017 -0800 + + add support for Power Management library + +commit cd3215bd5929dd83004cdf3b94e32726ff2eba2e +Author: Dino Tinitigan +Date: Tue Jan 10 10:17:13 2017 -0800 + + expose all AON-GPIOs + + -expose AON-GPIOs since they are available on the TinyTILE + +commit 90e8bc65828a7e65f5a59d9a64c3db7df185e0a3 +Author: Dino Tinitigan +Date: Tue Jan 10 09:55:59 2017 -0800 + + shared memory structure changes for CODK-M + + -added struct for ipm using shared memory + -added cdc-acm buffer space on shared memory which is used by the new firmware + +commit 7c97231c087929a90ae880486b3c0ce539a9b326 +Author: Erik Nyquist +Date: Tue Jan 10 10:31:56 2017 -0800 + + CurieIMU.cpp: initialize saved accel/gyro ranges in begin() + + This ensures that "read[Accelerometer/Gyro]Scaled()" will work as + expected even if a range has not been explicitly set using the API + +commit 17d2e2fb22ba0cd239c46973cca0006704534195 +Author: Erik Nyquist +Date: Mon Jan 9 10:55:34 2017 -0800 + + Rebuild libarc32drv_arduino101.a + +commit 5d91dc66fe0f49ab5cb9d5dc7459a9abba5ea7de +Author: Erik Nyquist +Date: Thu Dec 29 17:57:17 2016 -0800 + + libarc32_arduino101/Makefile: Add 'strip' target + + The file libarc32drv_arduino101.a is built with debugging symbols by + default, however the version we ship needs to be stripped. The new + "strip" target makes it easy for us to strip when committing, and + the default target still behaves the same way, so the library can be + re-compiled for debugging purposes + +commit 4ae5af7f8a63dfaa9d44b35c0c820d93a4a6980e +Author: Noel Paz +Date: Thu Dec 22 13:24:24 2016 -0800 + + Corrected the MIDIBLE example so it advertises correctly + +commit 621949108d0c3def12722b626b57176d10425863 +Author: noelpaz +Date: Wed Dec 21 17:10:09 2016 -0800 + + Modified SensorTag example and added examples derived from 1.0.7 + +commit 2391f48210995aa34fc20e62745811aeaaa0bd7d +Author: Sidney Leung +Date: Wed Dec 21 00:48:55 2016 -0800 + + Moving balloc static memory buffer to DCCM memory + + balloc() is used by interrupt context code for memory allocation. The memory space is statically allocated at + initialization. In order not to take up SRAM memory, this buffer is moved to the DCCM memory space. + +commit 34d0e50135f9e0baff349fe116f92d049e9f97c9 +Author: Sidney Leung +Date: Tue Dec 20 13:11:21 2016 -0800 + + I2S example sketches failed compliation, Jira 786. + + The latest BLE library consumes more heap space that causes these sketches ran out of heap space for their temporary + buffers. For now, the size of the tempporary is reduced. For the near future, there are 3 improvements to address + this issue. The BLE library will be making use of the DCCM memory instead of heap. The I2S library buffering space + is going to the DCCM memory too. The heap space will be increased to maximize the usage of the entire SRAM sapce. + +commit 4c89a183f8e509c3f7c08a589a291ebb91ee171e +Author: lianggao +Date: Mon Dec 19 14:59:55 2016 +0800 + + Add test sketches + +commit ade23f0c2c064b733a1c3d264eb29e1a608f8745 +Author: lianggao +Date: Mon Oct 17 16:11:18 2016 +0800 + + Arduino BLE new library + + 1. Add new library + + 2. Add BLEPeripheral library back compatible features + + 3. Fix IMU build issue + + 4. Fix the memset crash issue + i. The FIRQ doesn't save the LP_COUNTER register. + ii. Update the code to save LP related register + + 5. Fix the central crash issue when peripheral disconnect + + 6. Revert the UART changes + -This change will break the BLE's communication + + 7. Implement the balloc to replace old one + -Create memory pool + -Port V3's balloc + -Fix the local name display unexpected chars + + 8. Fix ScanCallback, LED related issue + -The Serial.print called in interrupt and interrupt block the Serial interrupt. + -The resource not released when call disconnect API. + + 9. Fix the discover blocked when connect/disconnect the link successively + + Block the disconnect if not receive the disconnect event + + 10. Return error when discover attributes if error happened + + 11. Update the back compatible comments + + 12. Fix the discover attribute failed issue + -Add the -fcheck-new build option + -Increase the IRQ stack size + + 13. Add discoverAttributesByService API + - The sensorTag has many services and RAM is not enough for discover all services + -This crash caused by bt_uuid_16 and bt_uuid_128 has different space and makes an address exception + + 14. Add keywords and fix read issue + + 15. Update the CurieBLE and delete BLE + +commit 431c7812e71c904b0e8212a0234d520ffbbe2b0d +Author: Dino Tinitigan +Date: Tue Dec 13 16:16:17 2016 -0800 + + check mux mode when using digitalWrite (#335) + + -check and make sure that the pin is in GPIO_MUX_MODE when doing a + digitalWrite() + -this has a slight performance impact of digitalWrite + -it also comsumes an extra byte in SRAM per pin + -it does however give us the ability to track the muxing state of each + pin + +commit 16227f53f2591eaa47e551b8000878855294eb35 +Author: Dino Tinitigan +Date: Tue Dec 13 16:15:51 2016 -0800 + + Ensure RTC clock scaling is set to 1Hz (#350) + + -needed to make sure that the RTC scaling is consitent with the factory + firmware and CODK-M based firmware + +commit 0d321db5cc619dc9a4451a6710dabd38fee492bf +Author: Erik Nyquist +Date: Tue Nov 29 11:32:50 2016 -0800 + + CurieIMU.cpp: Don't lock interrupts for SPI transfers + + This is unnecessary- nothing else is contending for access to this + particular SPI controller + +commit e870ba255646afa47debfc0b1cb493cc055520dd +Author: Dino Tinitigan +Date: Tue Nov 29 13:27:38 2016 -0800 + + Ensure RTC clock scaling is set to 1Hz + + -needed to make sure that the RTC scaling is consitent with the factory + firmware and CODK-M based firmware + +commit de208be5c42a305624468d9a1a5208f60d0b5bdb +Author: Erik Nyquist +Date: Tue Nov 29 10:35:10 2016 -0800 + + README.md: add steps for updating intel-arduino-tools + +commit 2bb7d4b58e4152fde9b87153f71618475f54c42a +Author: Erik Nyquist +Date: Fri Oct 21 16:20:37 2016 -0700 + + README.md: remove Serial1 debug information + +commit 205c1e40852f356a4819a16260086e8f3c719592 +Author: Adrien Descamps +Date: Thu Aug 11 23:13:02 2016 +0200 + + Enable interrupt mode of UART tx + + Previous version of write will never use the interrupt mode + transmission, because it fails to check if holding register is + empty. This commit fix that, and several bugs related to + interrupt mode serial transmission. + When possible, it uses the tx FIFO, in order to reduce + the number of interrupts called and the overhead. + +commit 5279509cc2f6d161e1607245f15024e5d578c10e +Author: Erik Nyquist +Date: Mon Nov 14 10:12:39 2016 -0800 + + CurieTime.cpp: check gmtime() return pointer for NULL-ness + +commit 249fb3b7b6a7ebf85a202688c960de9f256a8018 +Author: Erik Nyquist +Date: Mon Nov 14 16:20:09 2016 -0800 + + README.md: add link to ICS for product support + +commit c353f4caa7e5d9a4287410f2826f8e75683ab13c +Author: Calvin Park +Date: Thu Oct 27 15:57:39 2016 -0700 + + Use our own version of copy.exe so that we can copy without cmd.exe + +commit 6ee828b737b4bd08dda78b0769bb9043c64d2c4c +Author: Dino Tinitigan +Date: Thu Oct 20 15:53:53 2016 -0700 + + Move SoftwareSerial buffers into DCCM area + +commit 41f98f9c459a0ed7175b34c9c334c03c352c0706 +Author: Dino Tinitigan +Date: Thu Oct 20 15:14:47 2016 -0700 + + Allocate RingBuffer buffer into DCCM area + + -this buffer is used by the uart. Moving it into the DCCM area would + save us 128 bytes of SRAM + +commit 8619f2b3e088c28c389550a19ecf2e2e3029543e +Author: Dino Tinitigan +Date: Thu Oct 20 11:35:08 2016 -0700 + + Move buffers for Wire library to DCCM area + +commit 4e2232e3e55ab68da0e125f59da2817f45b7e06d +Author: Dino Tinitigan +Date: Wed Oct 19 15:26:19 2016 -0700 + + Expose dccm area + + -expose dccm area giving the user an extra 8k of memory + -simple implementation of a malloc like function for dccm memory area + +commit 1c8de0d7cc0ecf93abeb539bd97b0fee2b09eb97 +Author: Erik Nyquist +Date: Tue Oct 11 10:11:29 2016 -0700 + + Add functions to check if new IMU data is available + + accelDataReady() and gyroDataReady() read the drdy_acc and drdy_gyr + bits, respectively, of the BMI160's sensor status register. This removes + the burden of syncronising sensor reads from the user. + + (adapted from descampsa/corelibs-arduino101@773a800) + +commit 3d3c1f92c2c15724725f71542bc564754ba5d6e3 +Author: Erik Nyquist +Date: Wed Oct 12 15:42:50 2016 -0700 + + I2SDMA: Do not modify g_APinDescription + + The g_APinDesctiption is now 'const', so cannot be modified. + +commit d6b2ecaa47bd543dbb35a33b36dfa2fb9037de86 +Author: Dino Tinitigan +Date: Wed Sep 28 12:54:37 2016 -0700 + + pwm improvements + + -add capability to change pwm signal frequency with analogWriteFrequency + -improve pwm signal frequency accuracy + +commit 27a68decb8e450f52b7c4c9dc254a1b0cb045b17 +Author: Biagio Montaruli +Date: Wed Sep 7 13:15:41 2016 +0200 + + Update sketches that use serial communication of different libraries + + Improve sketches of CurieTime, CurieTimerOne, CurieSoftwareSerial, SPI and + SerialFlash libraries that use Serial communication. + Since Arduino/Genuino 101 uses USB native port, wait for the Serial port + to open to not lose serial data already sent to the Serial monitor. + + Signed-off-by: Biagio Montaruli + +commit 39ef9ef12c50366c4b77f494ae53361bbaf2118c +Author: Calvin Park +Date: Fri Oct 7 11:07:44 2016 -0700 + + Don't save unstripped elf for debugging (#314) + + The current save mechanism breaks when a user has deleted system32 from PATH environment variable. Comment out the copying so that it won't break for such users, but do not delete so that advanced users can use the unstripped elfs to debug. + +commit c396a3ad4f0ffb9163b0a2b270aa4584848764f3 +Author: Erik Nyquist +Date: Tue Oct 4 16:59:36 2016 -0700 + + Shrink oversized objects in SRAM + + 824 bytes is gained for use by sketches. Two new defines are added; + CDCACM_BUFFER_SIZE and UART_BUFFER_SIZE. The CDC-ACM Serial class and + the UART driver had been using the same #define for buffer size-- + SERIAL_BUFFER_SIZE-- and separating them means that the CDC-ACM buffer + can stay the same size, while the UART buffer is shrunk. + +commit 1a5e3f7b2d65cf2b81417f85bd24ca455bdaa1fc +Author: Erik Nyquist +Date: Thu Sep 29 15:17:07 2016 -0700 + + Make g_APinDescription const + + This has the effect of moving g_APinDescription out of .data (SRAM), + and into .rodata (flash). + + Pros: + sketches now have an additional 1160 bytes of SRAM available + + Cons: + state of pins is no longer tracked; e.g. when calling digitalWrite, + the full configuration is done each time. See changes in wiring_digital.c + and wiring_analog.c for details. There is inevitably a performance impact + for digitalRead/Write & analogRead/Write, though it is unlikely to be a + noticable one. + +commit 2e56b81a264c8760f095a12f650381b8ea8de831 +Author: Erik Nyquist +Date: Wed Sep 28 12:02:32 2016 -0700 + + stdlib_noniso.cpp: Handle rounding corner case for dtostrf + + Rounding must be done before separating the integral and decimal portions. + +commit f2a001f4fa557c4374493242c67ecee617a59866 +Merge: 77d9086 d2b7d1d +Author: Calvin Park +Date: Thu Sep 22 11:57:28 2016 -0700 + + Add BLE Central feature + +commit d2b7d1d732ca2ace5eb3f3da2e5cf3371e104f54 +Author: unknown +Date: Mon Sep 12 10:33:51 2016 -0600 + + JIRA-685, Peripheral sketches shall state associated Central sketch. + +commit 9581cf18a0a904e096f1dcab30624871c22714c4 +Author: Brian Baltz +Date: Mon Aug 29 14:01:05 2016 -0700 + + Update expected BLE version for V3 + + Signed-off-by: Brian Baltz + +commit 0304de781d54d0158c070d2d9cc750ab295c0712 +Author: Calvin Sangbin Park +Date: Fri Sep 9 10:55:17 2016 -0700 + + Rebuilt libarc32drv + +commit 84fc3dbbfb900d0d5cf5b8b2a9c7e734accb5771 +Author: lianggao +Date: Fri Sep 9 08:28:50 2016 +0800 + + Create BLE Example sketches + + 1. Fix Jira 664 demonstrates changing the ADV data + 2. Fix Jira 671 Support update connection interval in central/peripheral + +commit e7238f02c945faf6a05eca38ae590d520ec2af62 +Author: lianggao +Date: Fri Sep 9 08:25:31 2016 +0800 + + Jira Tickets and Bug fix + + 1. Jira 541 Peripheral Start fails on X Number of Attributes + -Change the interface and add return value + + 2. Fix BLE Peripheral is not advertising + -Add a delay after register the profile. + + 3. Modify some comments based on code review + + 4. Jira 544 BLE peripheral disconnect and end functions + -The state not aligned and make disconnect failed. Update when connect and disconnect event received + + 5. Delete the duplicated code that base class has implemented + + 6. Fix Jira 665 BLECentral Preview -- compile issue when instantiating BLE descriptor + -Fix the build error. + Note: + i . The current code only support one descriptor on characteristic. + ii . The central discover logic need more twist. + iii. Now is so long and can't process CCCD and another characteristic. + iv . The library will support one other descriptor except CCCD. + + 7. Improve the discover logic and support another descriptor + i. Improve the discover logic + ii. Support another the descriptor and CCCD at same time. + + 8. Modify the comments and delete the unused API + + 9. Fix Jira 670 A compile error occurs with two BLE methods with the same name + i. Add method uuid_cstr in BLEAttribute class. + ii. Remove the duplicate file. + + 10. Fix Jira 672 BLE documentation in code needs to specify units + i. Change the scan and connection interval's unit to ms. + ii. Unify the advertising interval unit as millisecond + iii. Delete some unused code. + + 11. Fix Jria 671 Support update connection interval in central/peripheral + i. Central can update the connection interval. + ii. Unify the interval unit to ms at user API. + + 12. Adjust the example comments and functions + i. Fix Jira 675 - BLE callbacks should use passed arguments instead of global variables + ii. Adjust the code struture to align with Arduino's requirement + + 13. Fix Jira 680 LED and LED Central sketches need some work + -Add a delay to make sure profile register process success. + -The UART send too fast may makes the profile registration failed. + + 14. Fix Jira 673 BLE Api should pass arguments that are typedef + + 15. Fix Jira 671 Support update connection interval in central/peripheral + i. Add peripheral update the connection interval feature. + ii. Update the library. + + 16. Fix Jira 687 Edit the keyword.txt of CurieBLE to reflect Library changes + + 17. Make example function ready. But need to resolve Jira 675 + + 18. Fix Jira 676 Review Edit Update BLE User Manual with China Flex + + 19. Fix Jira 685 BLE Peripheral sketches shall state which associated Central sketch to use + + 20. Fix Jira 588 - BLE Corrupted Long Write + i. Modify the BLECharacteristic to implement the Long write feature. + + 21. Fix Jira 683 Typecasting and Pointers should be avoided in sketch + i. Add write in Characteristic template + ii. Add method in BLE Role class to avoid typecaste + iii. Modify the advertise address parameter and related example sketches + + 22. Fix Jira 704 Type Characteristic should be documented + 23. Fix Jira 684 Documentation about the central/peripheral + +commit ae78b1626ef682331af055075fbddb672cb19552 +Author: lianggao +Date: Fri Jul 29 22:19:36 2016 +0800 + + Add BLE central function, debug interface and refactor peripheral + + -Add debug interface on Serial1 + -Update BLE stack and need update BLE's FW + -Reconstruct the BLE peripheral base on V3 + -Implement the BLE Central Role base on V3 + -Implement some sketches for new BLE library + -Add central read/write example + -Add set advertising parameter interface + -Add API to allow set up advertising after setup + -Add interface to set the device name + + File description + Porting from V3 + system/libarc32_arduino101/common/atomic.h + system/libarc32_arduino101/common/misc/byteorder.h + system/libarc32_arduino101/drivers/atomic_native.c + system/libarc32_arduino101/drivers/bluetooth/att.h + system/libarc32_arduino101/drivers/bluetooth/bluetooth.h + system/libarc32_arduino101/drivers/bluetooth/conn.h + system/libarc32_arduino101/drivers/bluetooth/conn_internal.h + system/libarc32_arduino101/drivers/bluetooth/gatt.h + system/libarc32_arduino101/drivers/bluetooth/hci.h + system/libarc32_arduino101/drivers/bluetooth/uuid.h + system/libarc32_arduino101/drivers/rpc/rpc.h + system/libarc32_arduino101/drivers/rpc/rpc_deserialize.c + system/libarc32_arduino101/drivers/rpc/rpc_functions_to_ble_core.h + system/libarc32_arduino101/drivers/rpc/rpc_functions_to_quark.h + system/libarc32_arduino101/drivers/rpc/rpc_serialize.c + system/libarc32_arduino101/framework/include/util/misc.h + system/libarc32_arduino101/framework/src/os/panic.c + system/libarc32_arduino101/framework/src/services/ble/conn.c + system/libarc32_arduino101/framework/src/services/ble/conn_internal.h + system/libarc32_arduino101/framework/src/services/ble/dtm_tcmd.c + system/libarc32_arduino101/framework/src/services/ble/gap.c + system/libarc32_arduino101/framework/src/services/ble/gatt.c + system/libarc32_arduino101/framework/src/services/ble/hci_core.h + system/libarc32_arduino101/framework/src/services/ble/l2cap.c + system/libarc32_arduino101/framework/src/services/ble/l2cap_internal.h + system/libarc32_arduino101/framework/src/services/ble/smp.h + system/libarc32_arduino101/framework/src/services/ble/smp_null.c + system/libarc32_arduino101/framework/src/services/ble/uuid.c + system/libarc32_arduino101/framework/src/services/ble_service/ble_service.c + system/libarc32_arduino101/framework/src/services/ble_service/ble_service_api.c + system/libarc32_arduino101/framework/src/services/ble_service/ble_service_int.h + system/libarc32_arduino101/framework/src/services/ble_service/ble_service_internal.h + system/libarc32_arduino101/framework/src/services/ble_service/ble_service_utils.c + system/libarc32_arduino101/framework/src/services/ble_service/gap_internal.h + system/libarc32_arduino101/framework/src/services/ble_service/gatt_internal.h + system/libarc32_arduino101/framework/src/services/ble_service/nble_driver.c + +commit 77d908688e799557fa6e582fbd885c825aaa07c6 +Author: Calvin Sangbin Park +Date: Mon Sep 19 16:48:28 2016 -0700 + + Rebuilt libarc + +commit 5340b0c9c1fa02257b7f363339594944f4c6be9e +Author: Martino Facchin +Date: Mon Sep 5 15:41:42 2016 +0200 + + CurieEEPROM refactor + + This PR refactors CurieEEPROM library, syncing it with AVR version. + Since EEPROM on Curie chip is based on OTP flash storage, the minimum write + size is 4 bytes. The current implementation brings some problems like + http://forum.arduino.cc/index.php?topic=421348.0 , and the examples are + quite broken. + + The refactor also changes the name, from CurieEEPROM to EEPROM, so code for + AVR sketches compiles out of the box. The new library resolution engine + (from IDE 1.6.8 onward) handles this perfectly but we can stick to older name + if we need compatibility with older IDEs. + +commit 4c69f724b9e253c014e118ca87d031929deea7ca +Author: Sidney Leung +Date: Thu Sep 1 15:20:32 2016 -0700 + + Added support for Quark I2C interfaces: I2C0 and I2C1. + + Additions: + 1. Ported Quark I2C driver to ARC/CoreLibs, located at system/libarc32_arduino101/drivers. + 2. Created the I2C Adapters, located at cores/arduino. + + Modifications: + 1. Platform.h - added number of I2C interface definition. + +commit 7dcc0742ef43174547efec5497359d6d80cc6387 +Author: Biagio Montaruli +Date: Sat Sep 17 13:45:03 2016 +0200 + + Update bus_scan.ino sketch of Wire library + + Improve documentation, code formatting and use LED_BUILTIN instead of 13 + to control the on-board led connected to digital pin 13 of + Arduino/Genuino 101 + + Signed-off-by: Biagio Montaruli + +commit 23ca972371c3bf9db488e948d35b870a1fa52b2c +Author: Sandeep Mistry +Date: Thu Sep 15 15:22:35 2016 -0400 + + WString: add `toDouble` (#293) + + Port of https://github.com/arduino/Arduino/pull/5362 + +commit f818d7cd360e109c31bc65ed11f0df3b133bc826 +Author: Sandeep Mistry +Date: Tue Sep 6 14:06:34 2016 -0400 + + Make String::move of an invalidated String result in an invalidated String + +commit 2751995ab29738c708b5b7d109d98cbfc34a09e4 +Author: Biagio Montaruli +Date: Wed Sep 7 13:01:32 2016 +0200 + + Fix for USB virtual serial port in sketches of CurieIMU library + + Since Arduino/Genuino 101 uses USB native port, wait for the Serial port + to open before executing the sketch to not lose serial data already sent + to the Serial monitor + + Signed-off-by: Biagio Montaruli + +commit d8d2c495b531fda1ffe98cb59f7e35fd948c5bad +Author: Biagio Montaruli +Date: Wed Sep 7 13:05:01 2016 +0200 + + Fix for USB virtual serial port in sketches of CurieI2S library + + Since Arduino/Genuino 101 uses USB native port, wait for the Serial port + to open before executing the next lines of code to not lose serial data + already sent to the Serial monitor + + Signed-off-by: Biagio Montaruli + +commit e084140957ebe2aa0d891c496ced456538c9a1b9 +Author: Erik Nyquist +Date: Wed Sep 7 16:02:31 2016 -0700 + + stdlib_noniso.cpp: fix dtostrf() handling of integral portion + + Checking only for > 10 here (rather than >= 10) means that numbers with a + leading '10' in the integral portion generate incorrect strings. + +commit b329d080469778b7e9c8e0868ab6edba4a7fdf97 +Author: russmcinnis +Date: Tue Aug 30 15:56:08 2016 -0700 + + add comment to pulseIn() in the header file to warn programmer about trying to detect high frequencies. + +commit 10d1056503099431cda97deacabbb2a68f43121e +Author: Brian Baltz +Date: Thu Aug 25 12:47:00 2016 -0700 + + Verify BLE FW version on every sketch upload + + Signed-off-by: Brian Baltz + +commit 431fb6fd27bdfbd6aaa97e690f1b162a1e02cb62 +Author: sys_maker +Date: Mon Aug 22 12:35:27 2016 -0700 + + Rebuilding libarc32 library + + Signed-off-by: sys_maker + +commit 0d86ead0d4ae870c32c679fca3ef087c83a758fc +Author: Calvin Park +Date: Thu Dec 3 11:34:56 2015 -0800 + + Add flashpack to IDE + +commit 71cf8e44b3d9c28918084c0e5a6c2d1e239b1c98 +Author: Brian Baltz +Date: Wed Aug 10 13:53:03 2016 -0600 + + JIRA-668: Removing Intel version of Adafruit_NeoPixel + + Signed-off-by: Brian Baltz + +commit e4a5b14c51e70933ff3f85603a08c3b6970ec264 +Author: Adrien Descamps +Date: Sat Aug 6 16:27:35 2016 +0200 + + Fix UART receiver corruption + + When the UART receiver is disconnected for a time shorter than a line break + and longer than a start bit, it interpret that as a received packet, and if + data are transmitted immediatly after, they are corrupted. + This commit is a workarround for that bug, that enable the loopback feature + of the UART when UART is disconnected, so the UART module does not notice + it is disconnected. + A previous workarround for this bug (a forced delay after disconnection) is + not needed anymore and is removed. + +commit 7366ed0a4fd26faec64e11b530557c313069b4f7 +Author: Adrien Descamps +Date: Wed Aug 3 01:40:57 2016 +0200 + + Flush wait for transmission to be complete + + In previous version, flush wait for the transmission to be complete + by checking if the transmission holding register (or fifo) is empty. + When this happen, the last byte is still in the shift register, + and has still to be transmitted. + This mean we can't know when the transmission is actually complete, + which is crucial to implement RS485 communication, for example. + + This commit change this behaviour and wait for the shift register to be empty, + which means the transmission is really complete. + +commit 48b0e58306d227b289316fcb4143edb08570042c +Author: Calvin Sangbin Park +Date: Wed Aug 3 14:16:23 2016 -0700 + + Update libarc to the latest + +commit 9ae91d3e9d55d81358681dd1595880de1176d640 +Author: unknown +Date: Tue Aug 2 09:49:30 2016 -0600 + + Jira-556: Add comments to I2S examples + +commit b317284ec9312288dea4e2b5db5696821fa6237f +Author: Calvin Sangbin Park +Date: Thu Jul 28 10:44:44 2016 -0700 + + Update libarc to the latest + +commit 9a871b671ceec5f625c63c9a9e58f044cef2e70c +Author: Erik Nyquist +Date: Wed Jul 27 14:20:29 2016 -0700 + + Add delay to Serial1.end() allow GPIO lines to settle + + Through testing, it was discovered that if Serial1.begin() is called again + immediately after Serial1.end(), then any attempt to write data immediately + following the begin() call could result in corrupted frames. + + After calling Serial1.end(), it will be at least 300us before those pins can + be used as UART again. + +commit e3d90c19d96bbab006f59151b73179ab0c7d9097 +Author: Caihong Ma +Date: Tue Jul 26 01:34:39 2016 +0800 + + CurieI2SDMA: Fix typo and add explanatory notes + CurieI2SDMA.h: Fix typo at line 23 and 24; I2SDMA_RXCallBack.ino: add + explanatory notes to explain how to check the verification of data + +commit fbb7b02a89da37ac9408710ff5ed1a936d00cd8b +Author: Xie,Qi +Date: Tue Jul 19 09:13:39 2016 +0800 + + JIRA-640 I2C operations are sometimes timing out causing a long delay in between i2C operations + + fix this issue by call complete callback if no stop command issue at the end + of transfer. + +commit 160751a8c47f1d4cdd647ad1bf0d8eb6312d5791 +Author: Erik Nyquist +Date: Fri Jul 22 18:21:27 2016 -0700 + + README.md: add "commit message how-to" wiki link + +commit 197434001a973ad7a8df18b823f8365988140b43 +Author: Erik Nyquist +Date: Sun Jul 17 00:33:17 2016 -0700 + + Issue #149: Provide scaled IMU data + + Add implementations of readAccelerometer and readGyro which + return values that are scaled according to the range set with + setAccelerometerRange and setGyroRange + +commit 5671917298c35e6164784da6929cf006daf9d51d +Author: caihongm +Date: Fri May 27 02:17:19 2016 +0800 + + Jira509:add IMU examples:FreeFallDetection, MotionDetection,ZeroMotionDetection; change CurieIMU.cpp line490 from 'setZeroMotionDetectionThreshold' to 'setZeroMtionDetectionDuration' + +commit 12b2376ea58c79ef00ea47af2aea8796bb652d69 +Author: Erik Nyquist +Date: Wed Jul 20 15:23:23 2016 -0700 + + ATLEDGE-643: Add chip ID to SerialFlash example sketch + + RawHardwareTest reports the 101's on-board SPI flash chip as an unknown + device. Fix this by adding the device's JEDEC ID to the example sketch. + +commit b8162e993cccbe4065c1bd55d1f4466669f01f75 +Author: Caihong Ma +Date: Mon Jul 4 15:15:54 2016 +0800 + + Jira566: I2S DMA implement: supplement library and example + +commit c59e2808e1bf27e8adc7c3aff0d0ed1a8344e04f +Author: Erik Nyquist +Date: Fri Jul 15 15:39:16 2016 -0700 + + Issue #241: make Serial1 release GPIO pins on end() + + UARTClass::init() muxes out the UART pins to Arduino header pins 0/1. + Reset the mux on UARTClass::end() so that pins 0/1 can be used as GPIOs + again. + +commit bdaec192070ab196a55282fa57512748c6f1edd9 +Author: Erik Nyquist +Date: Mon Jul 11 11:21:34 2016 -0700 + + Add CurieIMUClass::end() + + Add end() method to IMU class, to disable clocking to the SPI + controller. This is unlikely to have noticeable power-saving effects, + however it is a good habit to get into. + +commit 2ec9b94f941d34ee1419311b194707aad3b0ee67 +Author: Dino Tinitigan +Date: Mon Jul 11 14:47:59 2016 -0700 + + Update Wire examples to use Serial instead of Serial1 + + -change Serial to Serial1 in the master_writer and master_reader + examples + +commit 5f3ee5bb36dc5e69ce26f7d2a64220ebc927ad83 +Author: Martino Facchin +Date: Tue Jul 12 10:22:12 2016 +0200 + + define digitalPinToInterrupt for backwards compatibility + + see http://forum.arduino.cc/index.php?topic=370167.0 + +commit ecee2e9483e39af71df873174df070fdf952c431 +Author: Caihong Ma +Date: Mon Jul 4 15:15:54 2016 +0800 + + I2S DMA - supplement library and examples + +commit 3168ede2cbd3df99121944d46a5b24e9557d2b4b +Author: erik.nyquist +Date: Fri Jun 24 13:08:25 2016 -0700 + + ATLEDGE-619: fix dtostrf + + Use a different method for float->string conversion, and + fix the width calculation so that extra spaces are only + printed if the width parameter exceeds the output string + length (ie. a mininum width, as specified by dtostrf + reference from avr-libc). + +commit 019bb8fcecc1c79d78bd58f18f1b4521e73fad35 +Author: Dino Tinitigan +Date: Fri Jun 24 14:58:48 2016 -0700 + + update libarc32 + + -update libarc32 binary + +commit 9be7604bec5f080683a236cbabfe0d70b174ac13 +Author: Dino Tinitigan +Date: Wed Apr 20 14:52:22 2016 -0700 + + I2C - add functionality to change i2c clock speed + + -adds functionality to change clock speed + -clock speed is set/changed when Wire.begin() is called + -default is standard mode + -use Wire.begin() for standard speed (100k) + -use Wire.begin(I2C_SPEED_FAST) for full speed (400k) + -use Wire.setClock(I2C_SPEED_FAST) for full speed (400k) + +commit 8682149177559757a57ae0b2ad6639dcf97e31b1 +Author: Dino Tinitigan +Date: Fri Jun 24 14:33:45 2016 -0700 + + reduce i2c delays + + -reduce i2c delays to increase performace without changing the timeout + threshold + +commit de0650c15a0d44284440e4c4ba1943639b73da4f +Author: erik.nyquist +Date: Tue Jun 28 15:21:32 2016 -0700 + + Add -std=gnu11 to compiler.c.flags in platform.txt + + Related to issue #221 + +commit 4d9642871ae0bfb28783b1d6fa00b364ea201cf1 +Author: Oren Levy +Date: Mon Jun 20 14:59:09 2016 -0700 + + Added MIDI examples + +commit 2cd33f43a1b84c3f23194b27290114c4cec5d9df +Author: Martino Facchin +Date: Thu Jun 16 11:29:06 2016 +0200 + + Correct core version in platform.txt + +commit 20844ff46b455055f86641c785fb580ae1214222 +Author: Mike Duong +Date: Wed May 25 18:32:05 2016 -0700 + + ATLEDGE-586: String.compareTo() does not compute the same as Uno for POS values + +commit 2f5ae85f235bc1e5a0e5b50d63961f4348f237a0 +Author: erik.nyquist +Date: Mon Jun 13 10:35:53 2016 -0700 + + ATLEDGE-572: Fix getStepDetectionMode() + + This function is reading all 8 bits of RA_STEP_CONF_1 (0x7A-0x7B) + to obtain a value for min_step_buf, though this value is only + represented by the lower 3 bits; bit 4 is used as the 'enable' bit. + As a consequence, this function will read the step detection mode + incorrectly when step counting is enabled. Fix this by only reading + the lower 3 bits of RA_STEP_CONF_1. + +commit de30a61b909802f2dbb3380c4adc9316ee1f64f7 +Author: erik.nyquist +Date: Mon Jun 13 11:57:21 2016 -0700 + + ATLEDGE-553 Modify library examples header info + +commit a694d09698db8d0f77ac19d58d1db34eef3d1b4d +Author: Sidney Leung +Date: Tue Jun 7 16:57:12 2016 -0700 + + Jira-617: String Object constructor hangs up when handling large floating point number + +commit df3b675c1ba4113fa560078ae60f610f4d8b3ae0 +Author: Erik Nyquist +Date: Fri Jun 3 15:02:00 2016 -0700 + + SerialFlash: enlarge chip ID buffer + + SerialFlashChip::readID() writes up to 5 bytes into + the buffer provided, but the caller only allocates + 3 bytes. Increase buffer size to 5 bytes. + +commit c27462cbc168257c2c928d435dcaf3b43a535fe1 +Author: Xie,Qi +Date: Wed May 25 07:30:23 2016 +0800 + + JIRA-560 I2C Bus Scan + using read instead of write to avoid sending the extra byte when scaning I2C bus + +commit e792ba2bd6480a556e50259e0e836ae4cf5ec371 +Author: Dino Tinitigan +Date: Tue May 31 17:03:06 2016 -0700 + + Fix bug when using StringConstructor with doubles + + -Fixes issue of StringContructor instability with doubles + +commit acc4b38ba43d654992b72fa9d4afa68b834a098c +Author: Dino Tinitigan +Date: Tue May 31 16:12:32 2016 -0700 + + Revert "Fix some issues with printing float and double" + + This reverts commit b8ea343bb237762de6ee3a60ba0b1e8d5af12ff0. + +commit 409e4b07f477e6345c972a40376085c89ecdb46e +Author: erik.nyquist +Date: Fri May 27 14:38:05 2016 -0700 + + Remove unsupported SerialFlash example + + CopyFromSD.ino requires SDfatlib (for AVR boards) which + is unsupported. + +commit 4294ca5ad86c2f7f5cfb354ac193ff1ecbfc9fa9 +Author: erik.nyquist +Date: Fri May 27 14:36:36 2016 -0700 + + Remove SPI.set* calls from SerialFlash example + + These functions are not implemented for A101's SPI library. + Remove these calls from examples/CopyFromSerial.ino + +commit f33e362db41f7871a63bc8f0294ce9aa43be3f0d +Author: erik.nyquist +Date: Fri May 27 14:26:46 2016 -0700 + + Add category to Wire/library.properties + +commit 348e36ee6e6eb2c5f5687b642f978aabcace5be2 +Author: Sidney Leung +Date: Thu May 26 15:54:08 2016 -0700 + + Jira-602: Convert float and double to strings. Output string is padded with spaces. + +commit ce7825883b79bd6849cc1fba4bbaa6416e43229d +Author: caihongm +Date: Fri May 27 02:17:19 2016 +0800 + + Jira509:add IMU examples:FreeFallDetection, MotionDetection,ZeroMotionDetection; change CurieIMU.cpp line490 from 'setZeroMotionDetectionThreshold' to 'setZeroMtionDetectionDuration' + +commit b8ea343bb237762de6ee3a60ba0b1e8d5af12ff0 +Author: Dino Tinitigan +Date: Thu May 26 13:51:06 2016 -0700 + + Fix some issues with printing float and double + + -fixes some issues with printing float and double + -limits the number of decimal places printable to 16 + +commit 9472c9aa9427030f3e24968d4915fdf69881ea66 +Author: Dino Tinitigan +Date: Wed May 25 15:43:28 2016 -0700 + + Remove unnecessary #undefs + + -Remove #undefs from CurieSoftwareSerial Library + -Because it was braking some functionality such abs() + +commit 048800b47b8edcbe0cbf9401163ace1f4c15bb3e +Author: Sidney Leung +Date: Thu May 19 11:36:38 2016 -0700 + + Jira-599. Routine, dtostrf, did not work with the latest toolchain. The call to sprintf in the routine crashed the system. Issue corrected by replacing the call. The routine, printfloat, in Print.cpp, is now usint dtostrf to print out double and float values. + +commit 874c3ef08bf7031a06248abbb59274da740444f2 +Author: erik.nyquist +Date: Fri May 20 10:38:55 2016 -0700 + + SPI: add SPI1 to keywords.txt + +commit 92818058e83302e478e7cdddd60d1d5568ce9bc5 +Author: erik.nyquist +Date: Thu May 19 10:34:30 2016 -0700 + + Add Paul Stoffregen's SerialFlash library + +commit 8dea7b4a1430dce33870a97fcf0330e0cda4fef3 +Author: erik.nyquist +Date: Mon May 16 10:41:02 2016 -0700 + + Fix SPI clock divider calculation + + If a clock value greater than the maximum supported + is passed (i.e. > 16MHz), the resulting value written + to the BAUDR register will be 0 which will disable + the serial output clock. Check for this and ensure + the value calculated for BAUDR register is never < 2. + +commit 331b2f0152bb90f1c96ee1726e8017db56e51789 +Author: erik.nyquist +Date: Thu May 12 11:18:35 2016 -0700 + + Clean up the SPI files + + Be consistent about commenting style, and + stay below 80 chars where appropriate. + +commit 2bb742afd2e8cf0a3708b3b50a94089b5b39a3a8 +Author: erik.nyquist +Date: Thu May 12 11:15:04 2016 -0700 + + Add support for SPI1 device to SPIClass + + SPI1 can now be used (SPI1.begin()) to access + the SPI device connected to the Arduino 101's + on-board SPI flash device + +commit 2bea587379b0e78d4006db13e4c9bdf4482637c0 +Author: Brian Baltz +Date: Mon Apr 25 15:36:38 2016 -0600 + + JIRA-550 Retain unstripped ELF file for debugging + + Signed-off-by: Brian Baltz + +commit ea7a804cefdf17a7518ba8c3fec95bb744273d0c +Merge: 2b5a040 9f88024 +Author: Brian Baltz +Date: Wed May 11 14:09:23 2016 -0600 + + Merge pull request #172 from bbaltz505/new_toolchain + + Updating compile command and driver lib for new toolchain + +commit 2b5a0402af9486f527805124a5ef937cbfb89ee1 +Author: Sidney Leung +Date: Fri May 6 16:39:36 2016 -0700 + + Bug fixed: CurieBle library, class BLECharacteristic allocates memory using an incorrect variable which may result in memory corruption if the memory size is bigger than 16 bytes. + +commit cdd2989b4297c10c8759de408ccb021f0874763a +Author: jysholar +Date: Mon May 9 12:48:48 2016 -0600 + + CurieIMU tap/double example, JIRA-508 + +commit 434fcd49ddcae18726b8196153baf0a68882b55e +Author: erik.nyquist +Date: Tue May 10 11:41:19 2016 -0700 + + README.md: clean up and add "support" section + + Break long lines to be <= 80 chars, where possible, and + add a new section to guide users to the appropriate place + for support (Arduino forum for product support, issue + tracker for bugs & features). + +commit eb0cf4f1ceaa0fc4220adcc726063e17934eee3e +Author: Martino Facchin +Date: Wed May 4 10:28:22 2016 +0200 + + Add SERIAL_PORT_USBVIRTUAL and SerialUSB macros + + This is needed to ensure compatibility with YunShield sketches + + asas + +commit 9f880240e6cb1deba4c8bd3f296dff4eb5a54929 +Author: Brian Baltz +Date: Thu Apr 28 15:33:58 2016 -0700 + + Updating compile command and driver lib for new toolchain + + Signed-off-by: Brian Baltz + +commit 2bac6d3432033197ffc23c6da96ddd99054271f9 +Author: Calvin Park +Date: Mon May 2 15:59:10 2016 -0700 + + Fixed the license file to LGPLv2.1 + +commit 443916f2621a808540997f36caa9bcd2c9d7fb5f +Merge: f43789e c1be134 +Author: Calvin Park +Date: Mon May 2 14:54:12 2016 -0700 + + Merge pull request #156 from bigdinotech/i2slib + + CurieI2S library + +commit f43789e71bcc9c7d8181aec61c48eed3a9683cba +Author: jysholar +Date: Tue Apr 26 12:25:01 2016 -0600 + + Jira-560, getInterruptStatus(...) should return type of bool + +commit 212dae55ea664d1bd92ad175615a49bec7d1bc4f +Author: Sandeep Mistry +Date: Tue Apr 5 09:50:36 2016 -0400 + + Sync avr/pgmspace.h entries with SAMD core + +commit 7bd93b3baf802481282e32240fcfc1f941e36561 +Author: Sidney Leung +Date: Thu Apr 14 15:46:58 2016 -0700 + + Jira-584: String constructor create floating point string with incorrect number of decimal places. + +commit 4d1014ff2b89a88f9605e2cb7f75bbe7bd0691e4 +Author: russmcinnis +Date: Wed Apr 13 11:10:56 2016 -0600 + + check pin range first thing in pinMode(), digitalWrite() and digitalRead() + + Signed-off-by: russmcinnis + +commit 285ec1770d831f584ca943f2e4d214ad59e35ffe +Author: Brian Baltz +Date: Tue Apr 12 10:56:38 2016 -0600 + + Removing obsolete TFT library + + Signed-off-by: Brian Baltz + +commit e9aaea9b39eb1496ebccdef422ae2d441f9086f4 +Author: Brian Baltz +Date: Fri Apr 8 15:11:42 2016 -0600 + + Fix CurieTimerOne example filename + + Signed-off-by: Brian Baltz + +commit 4cad8b8e31d7e8f13b394e90ffa2253ffb0d5f9b +Author: russmcinnis +Date: Wed Apr 6 13:30:42 2016 -0600 + + pwmStop() leaves pin HIGH + + pwmStop() was doing a digitalWrite(pwmPin, LOW) after the kill() so unless the pin happened to be 0 the pwmPin might be left in the HIGH state causing motors or other devices to run HIGH after pwmStop(). Just removed the pwmPin = 0 from kill() and it passes all our loopback tests. + +commit 0e4a0d439341781ef6709b73d45a77c79cdf0de7 +Merge: 669fb9b 0ad15b5 +Author: Brian Baltz +Date: Tue Apr 5 09:23:41 2016 -0600 + + Merge pull request #146 from bneedhamia/support-eddystone-url + + Added Eddystone-URL support + +commit 669fb9bcf6e80d774a8a9d836b3354c5ddd04a99 +Author: Brian Baltz +Date: Mon Apr 4 15:55:55 2016 -0600 + + JIRA-558 Remove Intel Ethernet and SD libraries + + Signed-off-by: Brian Baltz + +commit c1be134976c7afa8fd3af95907e0f043efc6bc8d +Author: Dino Tinitigan +Date: Mon Apr 4 10:17:29 2016 -0700 + + CurieI2S - minor fixes/improvements + + -prevent buffer overflow in I2S_RxCallback example + -calculate delay for any sample rate + +commit 0ad15b5a46969ddda239cf764caebb32a81e56ae +Author: Bradford H. Needham +Date: Sun Apr 3 11:07:14 2016 -0700 + + Fixed spaces in keywords.txt; keywords now highlight properly + +commit 89dd2287dfd41a12db0a34eed7d94b8593b2e5da +Author: Dino Tinitigan +Date: Fri Apr 1 12:06:36 2016 -0700 + + CurieI2S add examples + + -add basic examples using callback functions/interrupts + -add callback function to fill tx buffer + +commit 2bca6fc912b51200ad12b833e52321e65ccf553b +Author: Dino Tinitigan +Date: Wed Mar 30 12:18:36 2016 -0700 + + Interrupt based I2S library + + -CurieI2S using interrupts + +commit a54f5132630fb2825e27d84cf4ddf3d8ee22192a +Author: Sidney Leung +Date: Thu Mar 31 11:50:12 2016 -0700 + + Jira-575, Jira-506: Bug fixes to print float and double correctly, in a string or std output. + +commit ccc02128ad2371d3ed35ebb3a01d4146df930e97 +Author: Dino Tinitigan +Date: Wed Mar 23 18:07:38 2016 -0700 + + CurieI2S use interrupts for Tx + + -Use interrupts to fill FIFO buffer from TX buffer + +commit 4fae4ddb4cc9bb14c6c4ccc6147253944c778bb9 +Author: Dino Tinitigan +Date: Tue Mar 8 15:01:49 2016 -0800 + + CurieI2S initial commit + + - Minimal functional version + +commit 2eb99d10a116a092a2ade78a79d96d164847f9b2 +Author: agdl +Date: Fri Mar 11 13:58:24 2016 +0100 + + Removed delay from examples as requested by Tom + +commit 38a508e4552f88649cdd664babd0165673b7caa6 +Author: Sidney Leung +Date: Tue Mar 8 13:31:14 2016 -0800 + + Jira-528. Make CurieTimerOne library to be compatible with the TimerOne library originated from Paul. Created methods that have the same name and functionalities as in the TimerOne library. + +commit 98ee736fa2bb12e99d80bad866a9a298e0bc1c2e +Author: SimonePDA +Date: Mon Mar 14 18:01:40 2016 +0100 + + Update CurieTimer1Interrupt.ino + + Changed the style of the code according to Arduino's Tutorials guidelines. + +commit 40d3fb07d98db264dc1f2b0c2b5a3057359a721d +Author: Bradford H. Needham +Date: Tue Mar 8 20:35:51 2016 -0800 + + Added Eddystone-URL support: added setAdvertisedServiceData() to support BLE Service Data; changed Incomplete to Complete Service UUID list code in Advertising initialization, required by Eddystone-URL protocol; added (for debugging) getAdvertisingLength() and getAdvertising() to enable a Sketch viewing the Advertizing packet. + +commit 17eac79d76b721eb116179aa87f0e3627add4927 +Author: Dino Tinitigan +Date: Tue Mar 8 10:54:11 2016 -0800 + + Fix Klockwork issues in CurieEEPROM #142 + + -Also fixes issue of not being able to rewrite the last 3/4 of the + EEPROM area + +commit e50ef904347f9d4da0a7c4e0e5523b4ff5d040bb +Merge: 1f3899a c7b30f4 +Author: Brian Baltz +Date: Tue Mar 8 11:51:38 2016 -0700 + + Merge pull request #141 from bbaltz505/memory_size + + Fixing sketch size calculation (text + ctors + rodata + datas + +commit c7b30f4c627ad20b5cdbc621803afa76fba61bfd +Author: Brian Baltz +Date: Tue Mar 8 07:07:43 2016 -0800 + + Decrease max sketch size to 155,648 bytes + + Signed-off-by: Brian Baltz + +commit f02410e9bf138f48243b62853b44c9b797ea01e9 +Author: Brian Baltz +Date: Wed Feb 24 20:04:14 2016 -0800 + + Fixing sketch size calculation (text + ctors + rodata) + + Signed-off-by: Brian Baltz + +commit 1f3899a7cabd71ae9fbda7f721a117614587adaa +Author: SimonePDA +Date: Thu Mar 3 22:29:38 2016 +0100 + + Update library.properties + +commit c4a20140569016649b4333ef6c349c8041827164 +Author: SimonePDA +Date: Thu Mar 3 21:55:23 2016 +0100 + + Update library.properties + +commit 72b85b2bdb884a995620e3aeb66d518844b0746a +Author: SimonePDA +Date: Thu Mar 3 21:39:55 2016 +0100 + + Update library.properties + +commit 3d019ed2cebf9034e37cda961d16b08042d8f731 +Author: SimonePDA +Date: Thu Mar 3 21:34:23 2016 +0100 + + Update library.properties + +commit 5bb196cdd961a0fb54129d1fcf2fc99778ab0914 +Author: SimonePDA +Date: Thu Mar 3 19:58:12 2016 +0100 + + Update library.properties + +commit fda58303cb959000bb8d04855f5b11838423d15d +Author: SimonePDA +Date: Thu Mar 3 19:35:08 2016 +0100 + + Update library.properties + +commit 7905133b686bf5dcc0112b828a9d8128ddf6ee8e +Author: SimonePDA +Date: Thu Mar 3 19:24:32 2016 +0100 + + Update library.properties + +commit bc9c387332dc16290f1c1c180eabae0d33eec8fe +Author: SimonePDA +Date: Thu Mar 3 19:12:32 2016 +0100 + + Update library.properties + +commit 953479ae0f37961fb8f4040fbdcd8848f59cae33 +Merge: 3bd268c eacb1bd +Author: Brian Baltz +Date: Wed Mar 2 15:06:03 2016 -0700 + + Merge pull request #129 from 00alis/src_folders + + Moved .h and .cpp file in src folder + +commit 3bd268c3992f095233bb16a18dac8541b86b0bf2 +Author: Brian Baltz +Date: Wed Mar 2 10:40:59 2016 -0800 + + Updating install steps in README + + Signed-off-by: Brian Baltz + +commit eacb1bd114ec57cbecab357dfab8a396b5e7b09d +Author: Alice Pintus +Date: Wed Mar 2 12:49:10 2016 +0100 + + Rename library.properties + +commit 1cbd80b226b237ddb5a2cd5705f63975ed6f9596 +Author: Alice Pintus +Date: Wed Mar 2 11:56:24 2016 +0100 + + Moved .h and .cpp file in src folder + +commit e8b8a5db546696735d5de38e58253b75cb411e7a +Author: Sandeep Mistry +Date: Fri Feb 26 15:05:54 2016 -0500 + + Change set/get accelerometer and gyro offsets to use floats values + + This makes it consistent with other API changes to convert the register + values to floats and vice versa. + +commit ffc51eff1581f38c977798114f94affc5393d0e2 +Author: Sandeep Mistry +Date: Tue Feb 2 10:08:35 2016 -0500 + + Add setConnectionInterval API to CurieBle + +commit f11de80d789e9071a05387cfa96d80e08db563cc +Author: Martino Facchin +Date: Tue Feb 23 15:06:09 2016 +0100 + + use sprintf-based implementation for dtostrf + + altough the current implementation passed all the unit tests, an user reported problems with the actual code (http://forum.arduino.cc/index.php?topic=380422.0). + If libc has float support there is no need to do strange things like on AVR, so we can use the sprintf implementation + +commit ad1586ef179fa0920edb29d4e3a05307a267a3cd +Author: Calvin Park +Date: Mon Feb 29 15:14:32 2016 -0800 + + Updated README.md with instructions to manually install corelibs + +commit 582d03353b5111b8030ec5a6954ec480acaaa6d3 +Author: Dino Tinitigan +Date: Fri Feb 26 11:04:59 2016 -0800 + + i2c bus scan workaround + + -sends a byte of value 0 when doing an i2c bus scan + +commit f6d8aa81847643f1102805e9b1f6ef32c3fbc0a9 +Author: Dino Tinitigan +Date: Mon Feb 22 14:08:34 2016 -0800 + + CurieEEPROM - ensure 32-bit allignment + + -ensure 32-bit address allignment for put(), get(), read(), and write() + +commit 64ee87970db858c1e4caed63e41f21158f6653b7 +Author: Brian Baltz +Date: Wed Feb 24 17:45:23 2016 -0800 + + Remove custom Adafruit_Motor_Shield_V2 library + + Signed-off-by: Brian Baltz + +commit 6f9739fac258c812f74139c16017817aa4045ace +Author: Brian Baltz +Date: Thu Feb 18 17:16:09 2016 -0700 + + Use Go-based upload script + + Signed-off-by: Brian Baltz + +commit 83bb5f5d818a3ed2db05a0b784c6888822d3e2e7 +Author: jysholar +Date: Tue Feb 23 10:33:17 2016 -0700 + + Rename CurieTimer to CurieTimerOne for JIRA-532 + +commit 3448d230240682d1579b26e6f095afe479d68a09 +Author: Sandeep Mistry +Date: Wed Feb 17 08:37:19 2016 -0500 + + Remove enums for ranges and duration, auto calibrate/set offset now enables offset, rename interrupt routines to interrupts/noInterrupts + + keywords.txt updates + +commit 63a01dd918a1fd16d7a914dfd312c763699abdde +Author: Sandeep Mistry +Date: Tue Feb 2 11:40:38 2016 -0500 + + Rename CurieBle to CurieBLE + +commit e82fe904dba101da79bbd7dd63060f223d8716cc +Author: Sidney Leung +Date: Fri Feb 5 11:55:00 2016 -0800 + + Jira-507 and 514: 1. Bug corrected in timer ISR where the clearing of the pending interrupt was at the entrance instead of exit. When interrupts could happen fast enough to put the ISR in a loop. 2. The overhead for the s/w pwm code is 4-5 usec. Thus, limited the shortest pwm pulse to 10 usec (high and low). + +commit 2299da2693c0fe867c7b90d998b43c15d666e763 +Author: Brian Baltz +Date: Wed Feb 10 07:47:38 2016 -0800 + + Stop interrupt when switching to 100% duty cycle + + Signed-off-by: Brian Baltz + +commit da68b6fcd5363a5b771e02ec7fa4ab1774286ebe +Author: Brian Baltz +Date: Wed Feb 3 12:10:41 2016 -0800 + + ATLEDGE-516 Stop callback when setting duty cycle to 0 + + Signed-off-by: Brian Baltz + +commit ef62ce6bff2c6059e1f0750c8fa2ec9af424f712 +Author: Brian Baltz +Date: Wed Feb 3 12:09:33 2016 -0800 + + Fix pwmStop typo in keywords.txt + + Signed-off-by: Brian Baltz + +commit 6059a142b0bed4bd3b1a2e2c45a298bc72ee6754 +Author: agdl +Date: Tue Feb 2 15:13:42 2016 +0100 + + Fixed define + + To be compliant with all the others + +commit 65f3b2887bfc3dfe228a3216a4c8b4a4e51dcfac +Author: Dino Tinitigan +Date: Tue Feb 2 11:32:00 2016 -0800 + + CurieEEPROM eeprom_write example + + -increment eeprom address at the correct location so it matches the read + example + +commit 6885cded61c1dac1e45d4a33436da6c840994cc4 +Author: Dino Tinitigan +Date: Wed Jan 27 14:39:40 2016 -0800 + + CurieEEPROM reimplement put and get to not use STL + + -reimplement put() and get() to not use STL due + to incompatibility with max() and min() macros + +commit 0a382340a0487691627ad3af48bce01572029b4b +Author: Krzysztof Sywula +Date: Wed Jan 27 15:06:53 2016 -0800 + + Green pixel fix + + JIRA: ATLEDGE-470 + +commit a6381cb123d77d3da630eda19c5d2947c1e129c6 +Merge: 07a53ab 555c23b +Author: Brian Baltz +Date: Tue Jan 26 17:05:08 2016 -0700 + + Merge pull request #109 from SidLeung/master + + Jira-501: CurieTimer.resume() did not re-enable interrupt at the controller. + +commit 555c23bc7cabc7217818b18a267a490d01fa63ad +Author: Sidney Leung +Date: Tue Jan 26 15:46:33 2016 -0800 + + Jira-501: CurieTimer.resume() did not re-enable interrupt at the controller. + +commit 07a53ab9f5174153967e1ebdac7527b680ec6232 +Author: Dino Tinitigan +Date: Tue Jan 26 14:13:15 2016 -0800 + + CurieSoftwareSerial remove non-working example + + -Remove non-working TwoPortReceive.ino example + +commit 0eca3b32f09a30c0d146f5730d29f91527836108 +Author: Sidney Leung +Date: Fri Jan 22 15:07:03 2016 -0800 + + Jira-500. Corrected typo error. Routine, pwdStop, is now named as, pwmStop. + +commit 02c960487caaaea5e77ca2370af73b59064f442a +Merge: 8a517b6 1be5b6c +Author: Calvin Park +Date: Thu Jan 21 14:03:13 2016 -0800 + + Merge pull request #103 from pricopb/master + + Remove OneWire and Adafruit_DotStar libraries. + +commit 8a517b656072e22b9394ec58b6ee22e179a39789 +Author: Dino Tinitigan +Date: Wed Jan 20 15:08:42 2016 -0800 + + CurieSoftwareSerial timing issue fixes + + -fix some timing issues with slower baud rates + +commit aaa453d00cf6e06f36dbe5c9012b252ebbcc9170 +Author: Brian Baltz +Date: Tue Jan 19 14:17:18 2016 -0800 + + ATLEDGE-491 - rename sketchUploader tool to arduino101load + + Signed-off-by: Brian Baltz + +commit 4932616c873d7b06af99698214a718f572a404f6 +Author: Dino Tinitigan +Date: Tue Jan 19 15:53:12 2016 -0800 + + CurieEEPROM fixes + + -remove leftover debug prints + -put() and get() should only support 32-bit alligned addresses + +commit effd880b1cae45f923fabcd8582e86544288ed26 +Author: Dino Tinitigan +Date: Thu Jan 7 15:17:40 2016 -0800 + + CurieSoftwareSerial Improvements + + -changed global variables into static + -allow different baud rates for different instances of a SoftwareSerial object + -minor code cleanup of unused code + -moved source code into src directory + +commit 1be5b6cb91fa5f6de5749fa1268f03606f6a83f9 +Author: Bogdan Pricop +Date: Fri Jan 15 08:32:32 2016 +0000 + + Remove OneWire library. + + Remove the OneWire library because the code changes for porting it to + Arduino101 were pushed to Paul Stroffegen's repository: + https://github.com/PaulStoffregen/OneWire/commit/e21914433ec588a23922099fa4435fbe0493e5ab + + Signed-off-by: Bogdan Pricop + +commit 1253ea89e0d81b943a1e22aad79559913ea2e297 +Author: Bogdan Pricop +Date: Fri Jan 15 07:38:11 2016 +0000 + + Remove Adafruit_DotStar library. + + Arduino101 specific changes moved to Adafruit github repository: + https://github.com/adafruit/Adafruit_DotStar/commit/0fce0fe52956a7eaf8f29ecfbaecc4138e958ed5 + + Signed-off-by: Bogdan Pricop + +commit ef9d032bf468a09a6921ce4334aa50c1ac227e9c +Author: sys_maker +Date: Fri Jan 8 15:56:10 2016 -0800 + + Rebuilding libarc32 library and hard-coding tools version + + Signed-off-by: sys_maker + +commit cc7cccc85afe0fe9c558913305c0ffe86b213caf +Author: Kevin Moloney +Date: Fri Jan 8 13:27:59 2016 +0000 + + find() missing overload in Stream.h + + Signed-off-by: Kevin Moloney + +commit b0531afe05cb8e5f301f04e9a207b7fcbb00c93b +Author: Alice Pintus +Date: Fri Jan 8 11:41:36 2016 +0100 + + Update boards.txt + + Change name Arduino 101 into Arduino/Genuino 101 to be consistent with the rest of the ecosystem + +commit 3ca20d94b362264b0e9ddac74c3731c1ab26a467 +Author: Dino Tinitigan +Date: Tue Jan 5 14:06:21 2016 -0800 + + ATLEDGE-487 CurieEEPROM library + + -Initial commit for CurieEEPROM library + -Implements EEPROM functionality using an available area of the ROM + -supports both BYTE and DWORD reading/writing + +commit b19562438ca48b50a4e505d786d522900d9300fd +Merge: 23e6f16 6fc749d +Author: Calvin Park +Date: Wed Jan 6 15:45:42 2016 -0800 + + Merge pull request #90 from sandeepmistry/imu-api + + Add new API's and examples to CurieIMU + +commit 23e6f16a539bfc4b3fef5b76e1787a66d3966a76 +Author: Sidney Leung +Date: Mon Dec 21 12:12:18 2015 -0800 + + Jira-462: Call Available() after calling end() indicated data available. + + Code Modifications: + + 1. Added checking of device open in these routines: available, read, peek. + Will return 0 or -1 if device is not opened to indicate invalid operation. + +commit 46519997e46f5088d627e537086cab14e8e14e6d +Author: Krzysztof Sywula +Date: Tue Dec 22 16:55:54 2015 -0800 + + dtostrf: fix overflow problem + + JIRA: ATLEDGE-315 + +commit 6fc749d08dfe770992fe3f50d3073260960c98d9 +Author: Sandeep Mistry +Date: Mon Dec 21 13:46:04 2015 -0500 + + Remove calibration steps from accelerometer and gyro examples + +commit af28e53e5b3280f4188cc2c379bacf24cd454bb7 +Author: Sandeep Mistry +Date: Mon Dec 21 13:43:50 2015 -0500 + + Use int for accelerometer and gyro API's instead of short + +commit c84af94b39a1efbf3afee132ac49469935b0aa7e +Author: Sandeep Mistry +Date: Mon Dec 21 13:32:14 2015 -0500 + + Remove call to setIntEnabled, attachInterrupt enables interrupts + +commit 44fe3307074cb4f5648dbba5718f893b7a4098f4 +Author: Sandeep Mistry +Date: Mon Dec 21 12:10:45 2015 -0500 + + Rename CurieImu to CurieIMU + +commit 6557caf258f6d4cef6048036a6cdf15c4fa2a882 +Author: Sandeep Mistry +Date: Mon Dec 21 11:37:59 2015 -0500 + + Add accelerometer orientation example + +commit a50c6b649f093f6d5dbb19e9e376f700976b833e +Author: Sandeep Mistry +Date: Mon Dec 21 11:12:32 2015 -0500 + + Update example header + +commit 7e628f15227d24c81c4f42bfe1f3cb351bdb8f78 +Author: Sandeep Mistry +Date: Mon Dec 21 11:12:16 2015 -0500 + + Initial gyroscope example + +commit cfd445144984d9aaaf3995f257cc5db0e14f04af +Author: Sandeep Mistry +Date: Mon Dec 21 10:57:14 2015 -0500 + + Correct typo in example, az was printed instead of ax + +commit e8a13f7c205de09fa50e90946e9634ef0d6e1562 +Author: Sandeep Mistry +Date: Mon Dec 21 10:52:38 2015 -0500 + + Add accelerometer only example + +commit c45ece5a1392b6f0cc7cfdd202b11cc1f87e9d30 +Author: Sandeep Mistry +Date: Mon Dec 21 10:50:17 2015 -0500 + + Rename readAcceleration and readRotation API's to readAccelerometer and readGyro + +commit 162e0cfbbde7b3e7b8c63daa9444507c02917cbe +Author: Sidney Leung +Date: Tue Dec 15 11:12:47 2015 -0800 + + Jira-32 and Jira-386. CurieTimerOne lib + +commit 1e30828bac4a73ef240f1bf8df8aa5e1a2ff1ff3 +Author: Sandeep Mistry +Date: Fri Dec 18 17:46:47 2015 -0500 + + Use if statements instead of switch for a few API's + +commit f6d1516068c33085766dfa042fe843f69511277c +Author: Sandeep Mistry +Date: Fri Dec 18 17:26:19 2015 -0500 + + Sketch auto format + +commit 5e3605e67ef21d1b59fc5d3d7e7f034c674d6477 +Author: Sandeep Mistry +Date: Fri Dec 18 17:15:06 2015 -0500 + + Keyword updates from Helena + +commit ef3ccb5aebee42c2497631b8e7b77ecd5b5c2359 +Author: Sandeep Mistry +Date: Fri Dec 18 17:10:10 2015 -0500 + + Update example to use enums + +commit 0faeb636cda253ad2768af7db12df42b3c689aa0 +Author: Sandeep Mistry +Date: Fri Dec 18 17:09:13 2015 -0500 + + Add set/get gyro/accelerometer rate API's, and map more BMI160 enums + +commit 38f928fff483abfba10927610f889e022779f52a +Author: Sandeep Mistry +Date: Fri Dec 18 16:33:34 2015 -0500 + + Use enums for accelerometer and gyro ranges + +commit e5a1c21005d0f6049008e8856481c4642b5227ef +Author: Sandeep Mistry +Date: Fri Dec 18 15:34:39 2015 -0500 + + Example updates from Helena + +commit 0b57d5eea31457d9bef2bf4df76a8c1dcc0b92da +Author: Sandeep Mistry +Date: Fri Dec 18 15:34:02 2015 -0500 + + Add Arduino style API's for IMU, rename CurieImu to CurieIMU + +commit b5c27aef2d78d264733f1056a070ca49de407f2e +Author: Dino Tinitigan +Date: Tue Dec 15 16:11:48 2015 -0800 + + ATLEDGE-429 CurieSoftwareSerial fixes + + -Creating a new CurieSoftwareSerial object no longer break functionality + of previous ones. + -Minor Cleanup + +commit f9d1d5c5c26d615f08775d9bffd8bd58b5fd75a1 +Author: Martino Facchin +Date: Thu Dec 17 15:58:56 2015 +0100 + + hardcode sketchUploader version + + while we solve the bug IDE-side, it is safe to revert using the hardcoded version number to handle the sketchUploader installation; + This solves a clash with outdeted Galileo/Edison core which tools are picked randomly (depending on json download order and java filesystem library internal ordering). + +commit 520f922f28c53d22be751dc0e8fe60e9466fb548 +Author: Kevin Moloney +Date: Tue Dec 15 14:59:42 2015 +0000 + + ATLEDGE-426/ATLEDGE-445 CurieImu missing functions + + * Removed CurieImu.getZeroShockDetected() & CurieImu.getZeroMotionDetected(). + * Functions replaced with CurieImu.getIntShockStatus() & CurieImu.getIntZeroMotionStatus(). + + * Implemented getStepDetectionMode(). + * There was no means of verifying setStepDetectionMode(). + + Signed-off-by: Kevin Moloney + +commit 4422bce4466f9350baeed33a2b36b97fdde5694b +Author: Dino Tinitigan +Date: Wed Dec 9 15:09:55 2015 -0800 + + AGM-157 Add support for _BV() macro + + Add support for _BV() macro + +commit 0c1ba8baef33e74383c0be797955baf386d5c4aa +Merge: 44bc8db b3273bd +Author: Calvin Park +Date: Mon Dec 14 16:55:28 2015 -0800 + + Merge pull request #84 from sandeepmistry/rtc-api + + Rename CurieRTC to CurieTime and integrate some Processing/Time lib API's + +commit b3273bd9cec3f721e9958a768456965c3a7fe5b2 +Author: Sandeep Mistry +Date: Mon Dec 14 19:26:13 2015 -0500 + + Update name in keywords.txt + +commit d0c2800286ecf575fa900d9210d7473c9e68ba04 +Author: Sandeep Mistry +Date: Mon Dec 14 14:30:26 2015 -0500 + + Simplify SetTime example, use hard coded time + +commit e5072e27a530a68acda9fe84fb96abaf1f31faac +Author: Sandeep Mistry +Date: Mon Dec 14 14:27:15 2015 -0500 + + Add API's to convert epoch time to date/time component + +commit 304c733e07f4306c89533d5a36bc714cb43683ba +Author: Sandeep Mistry +Date: Mon Dec 14 14:03:13 2015 -0500 + + Rename CurieRTC to CurieTime + +commit 4d9c07eb44178b0afb185f247de561da87d8aa3d +Author: Sandeep Mistry +Date: Mon Dec 14 12:06:45 2015 -0500 + + Make current count value and counter load registers volatile + +commit b872431e1df13cebb07cef8b2d85bc0906202462 +Author: Sandeep Mistry +Date: Mon Dec 14 11:48:01 2015 -0500 + + Parse date and time strings using Arduino string class instead of sscanf + +commit ed69e4f8c0f57db4c910b84d65d93d67e716766b +Author: Sandeep Mistry +Date: Mon Dec 14 11:27:42 2015 -0500 + + Auto format + +commit 7bb2c23d0db4503d59cfeab00b7f12be8c8ff32c +Author: Sandeep Mistry +Date: Mon Dec 14 11:06:09 2015 -0500 + + Change CurieRTC lib to have Processing style time API's based on the RTC value + +commit 23a1c3b18c45abf82fd9b13393497d83c4496056 +Author: Sandeep Mistry +Date: Mon Dec 14 10:34:41 2015 -0500 + + Remove bundled time library + +commit 44bc8db8808ede092e85dcdb67c3f03b9f24c59f +Author: Krzysztof Sywula +Date: Fri Dec 11 15:32:34 2015 -0800 + + Fixed comparison between uint32 and int32 + + JIRA: ATLEDGE-457 + + Servo.cpp warning + +commit 51c7f7d9145e11f834a4fae290c6693cb871e3fb +Merge: e093df3 956aac4 +Author: Calvin Park +Date: Mon Dec 7 14:17:16 2015 -0800 + + Merge pull request #81 from sandeepmistry/arduino-ble-peripheral-api + + Initial port of BLEPeripheral style API to CurieBle library + +commit e093df3e60fca0338fe23c46ed3e34bb078ef5df +Merge: 39881ec f6c59c1 +Author: Calvin Park +Date: Mon Dec 7 13:16:24 2015 -0800 + + Merge pull request #80 from sandeepmistry/imu + + CurieImu examples updates and keywords.txt + +commit 956aac4612d5b81da30de7c5621596fa3c8d2be1 +Author: tigoe +Date: Thu Dec 3 23:33:37 2015 -0500 + + Style changes to IMU examples + + Note: IMU Library API still needs to be standardized. + +commit 744e66ebb2de90cfbe48d9d3f3497c18f74efddc +Author: Sandeep Mistry +Date: Fri Dec 4 12:43:53 2015 -0500 + + Shorten local name in examples + +commit 44cd7e505e59644a3fca7303b316293372580f9f +Author: Sandeep Mistry +Date: Fri Dec 4 10:45:47 2015 -0500 + + Update note on local name + +commit b272315dfe91418c79ee6ce445144ca3178a2571 +Author: Sandeep Mistry +Date: Fri Dec 4 10:37:13 2015 -0500 + + Misc example updates + +commit 93ce2bb743a166a88e1cd9e52bfe1d24be005f83 +Author: Sandeep Mistry +Date: Fri Dec 4 10:23:43 2015 -0500 + + Correct case of include + +commit ccfaa837fd5810424474bf4a045ae17837fe4b1f +Author: Sandeep Mistry +Date: Fri Dec 4 10:12:52 2015 -0500 + + Correct setDeviceName + +commit 3c848247e8be8dd1b9c9622ebb4cb09fc2e6379e +Author: Sandeep Mistry +Date: Fri Dec 4 09:27:17 2015 -0500 + + Remove AutomationIO example + +commit 3b8efcc191ecbea77096f116195667fde19d85e4 +Author: tigoe +Date: Thu Dec 3 22:24:01 2015 -0500 + + Style changes to BLE library examples + +commit a5c7f84f29a4f3c14594d50695f372702abec940 +Author: Sandeep Mistry +Date: Thu Dec 3 17:01:21 2015 -0500 + + Correct incorrect read permissions for non-writable characteristics + +commit c6924337ea3cb561a950cf0f08accf8696b6f59c +Author: Sandeep Mistry +Date: Thu Dec 3 16:55:03 2015 -0500 + + Dynamically allocate characteristic and descriptor data buffers + +commit 040b63b1d23533774edf7cb46604740bbe92d2ff +Author: Sandeep Mistry +Date: Thu Dec 3 16:54:28 2015 -0500 + + Set initial value of characteristics + +commit 479e8600a665ad21b3b6181997ce871b100c94f4 +Author: Sandeep Mistry +Date: Thu Dec 3 16:50:16 2015 -0500 + + Sent initial value of switch characteristic + +commit 6d6a0c6e5b681c6be61a110d0fe4309c5a38b2a7 +Author: Sandeep Mistry +Date: Thu Dec 3 16:47:18 2015 -0500 + + Set initial value of switch characateristic + +commit ce32c92177a01fd6be5688bf693050d225570ace +Author: Sandeep Mistry +Date: Thu Dec 3 16:40:57 2015 -0500 + + Remove while(!Serial) + +commit b6eea7463bd84ec516f56f98f50fd0f424460060 +Author: Sandeep Mistry +Date: Thu Dec 3 16:31:11 2015 -0500 + + Use bool for public API's return types instead of BleStatus type + +commit 1596dc12e3ca099d483d52476c3c8378ad8d7c3a +Author: Sandeep Mistry +Date: Thu Dec 3 15:47:57 2015 -0500 + + Change public API types to use non-stdint types + + as per https://www.arduino.cc/en/Reference/HomePage + +commit 026f4c044879ae294e3c41aa0fe5d16336feefdf +Author: Sandeep Mistry +Date: Thu Dec 3 15:34:42 2015 -0500 + + Replace battery monitor example with new version + +commit 7767d3d6c42fb1c555ac68a5c9e687b33e6afbd8 +Author: Sandeep Mistry +Date: Thu Dec 3 15:31:15 2015 -0500 + + Rename Ble prefixes to BLE + +commit ee0ae446682773bbd8b240de2d03a0627096e87c +Author: Sandeep Mistry +Date: Thu Dec 3 14:50:40 2015 -0500 + + Separate device name from advertised local name + +commit c23609225aee221ed7ad83429b186826b55baca7 +Author: Sandeep Mistry +Date: Thu Dec 3 14:34:20 2015 -0500 + + Don't advertise the device appearence + +commit 661fc89a9981932103c2a0cc96d46becd6177018 +Author: Sandeep Mistry +Date: Thu Dec 3 14:29:37 2015 -0500 + + Correct advertised service uuid + +commit fe78397481705f520627c860db257ad62a9c5d72 +Author: Sandeep Mistry +Date: Thu Dec 3 14:08:36 2015 -0500 + + Correct presentation format descriptor handling + +commit c1882ee3119a3754378ed7f085c6ab19f53843ab +Author: Sandeep Mistry +Date: Thu Dec 3 12:54:37 2015 -0500 + + Add special handling for 0x2902 and 0x2904 descriptors + +commit 8ee6a0264c81f9534633234b9ff8e809c37abbe0 +Author: hbisby +Date: Thu Dec 3 17:56:19 2015 +0100 + + variable name changed from switchCharacteristic to ledCharacteristic + +commit e0139b68668f891b4ccd6ef166db67c20c172686 +Author: Sandeep Mistry +Date: Thu Dec 3 11:51:58 2015 -0500 + + Add delay(1) in poll + +commit 1b4f5134b152fc062c2f7d2d2aa29f1dfdcb1218 +Author: Sandeep Mistry +Date: Thu Dec 3 10:41:51 2015 -0500 + + keywords.txt updates + +commit 855737bc879868ea759c4eed46ec9420c886752a +Author: Sandeep Mistry +Date: Thu Dec 3 10:41:33 2015 -0500 + + Change internals to use less private friends, add comments in header files, make var types more consistent + +commit 6c946eda6d1ccd4a610e91ab99babbe7924832ca +Author: Sandeep Mistry +Date: Thu Dec 3 10:33:37 2015 -0500 + + User serial baud rate of 9600 for all examples + +commit df691a9ff790a9cf020878104dc138c9c0aeda66 +Author: Sandeep Mistry +Date: Thu Dec 3 10:28:29 2015 -0500 + + Rename with capital B + +commit f68199943d2c525cb3d6fdcbd0cfaf07427aa18b +Author: Sandeep Mistry +Date: Thu Dec 3 10:21:48 2015 -0500 + + Correct UUID + +commit 90886c696057dfd2fb95edeb60502b82c96f8d48 +Author: Sandeep Mistry +Date: Thu Dec 3 10:06:52 2015 -0500 + + Correct include filename + +commit 03673b47fa1cc950734baffb9bb8313629c366f9 +Author: Sandeep Mistry +Date: Wed Dec 2 16:57:46 2015 -0500 + + Use dashed UUID in example + +commit 940374fa55bae556ac093bad2cf6a200529150f2 +Author: hbisby +Date: Wed Dec 2 15:44:59 2015 +0100 + + changed format of long UUIDs + +commit 3d3f973329d08a4f617da27e30f03abed12c4335 +Author: hbisby +Date: Wed Dec 2 15:26:01 2015 +0100 + + ported examples from BLEPeripheral buttonLED and callbackLED + +commit 2581cffca43521c85d5c0101cf3c57878397930e +Author: Sandeep Mistry +Date: Tue Dec 1 17:29:47 2015 -0500 + + API Cleanup + +commit 03c82d3babe18a2fbae49abd49ec9f72cb9127a2 +Author: Sandeep Mistry +Date: Tue Dec 1 16:03:57 2015 -0500 + + Add new LED example + +commit 6e5a9dee80787f90c47435901792c27c2b2687a1 +Author: Sandeep Mistry +Date: Tue Dec 1 15:20:24 2015 -0500 + + Add written and subscribed API's to BleCharacteristic, pass central into BleCharacteristic even handers, remove BleAck event for now + +commit cd54545dc25a0a47cddbfc7722d24f626db12cb2 +Author: Sandeep Mistry +Date: Tue Dec 1 10:47:07 2015 -0500 + + Update previousMillis in example + +commit 3d3f65f2135bef419ce82dcc06690f251419f258 +Author: Sandeep Mistry +Date: Tue Dec 1 10:31:12 2015 -0500 + + Reverse UUID conversion loop + +commit 4dfc0a4f68b7cf7c57f05d5ae6a6770b8e718509 +Author: Sandeep Mistry +Date: Mon Nov 30 17:52:10 2015 -0500 + + Experimental BatteryMonitor example sketch with new API + +commit 99ab222ec39c31e2c27ba8962f4022c499b341b6 +Author: Sandeep Mistry +Date: Mon Nov 30 17:49:47 2015 -0500 + + BleCharacteristic event handler API's + +commit d4efbb2cf9f86ece8804877b268f8ce00f40b736 +Author: Sandeep Mistry +Date: Mon Nov 30 17:20:28 2015 -0500 + + Make descriptor BleCharacteristic API's private + +commit 06a05c2a86886ee4deab539d76a23e85798b0449 +Author: Sandeep Mistry +Date: Mon Nov 30 15:49:12 2015 -0500 + + More keyword.txt updates + +commit e01b7bf4d56a771c3ff3d9db9b1d26de05160a5e +Author: Sandeep Mistry +Date: Mon Nov 30 15:48:30 2015 -0500 + + BlePeripheral event handler rename, and misc var name consistency + +commit 69697e3670a813cfb6a5912d35e80427012f7645 +Author: Sandeep Mistry +Date: Mon Nov 30 15:21:46 2015 -0500 + + Add typed characteristics + +commit be1fcea44f1b9266a88de7d97b341ca4125585fe +Author: Sandeep Mistry +Date: Mon Nov 30 14:13:03 2015 -0500 + + Change return type of BleCentrall::address a C string, make getLocalAddress private for now + +commit 2fb56144f09631a97e73b86f3ffeae5289497f10 +Author: Sandeep Mistry +Date: Mon Nov 30 13:13:11 2015 -0500 + + Whitespace formatting + +commit a711fa2a7bc1cb0cbeaae4b179010b4c2e5ed326 +Author: Sandeep Mistry +Date: Mon Nov 30 13:12:57 2015 -0500 + + Allow BleCharacteristic::setValue to be called before begin + +commit b06df63df5e01de9a13ceddb74dad9fb15d3b821 +Author: Sandeep Mistry +Date: Mon Nov 30 12:24:52 2015 -0500 + + Introduce BleUuid, UUID's are now strings externally + +commit 67d47f330d4e8de2999a4c82f25eed2c3c4c4e45 +Author: Sandeep Mistry +Date: Mon Nov 30 11:38:22 2015 -0500 + + Change begin to return BleStatus + +commit a1d134b6e8fc2ba15b2df3a28244facb5d7d4bd9 +Author: Sandeep Mistry +Date: Mon Nov 30 11:00:33 2015 -0500 + + Add BleAttibute class and add new public addAttribute API + + Make addPrimaryService and getState API’s private. As well as, + BleService::addCharacteristic, BleService::addSecondaryService, and + BleCharacateristic::addDescriptor. + +commit e136ce82f377896cd8f442fe626682654cb9086b +Author: Sandeep Mistry +Date: Fri Nov 27 17:24:26 2015 -0500 + + Expose characteristic properties instead of access and notify mode + +commit 6d101d6288c9bad8960c73fafa40f54692e55333 +Author: Sandeep Mistry +Date: Fri Nov 27 16:45:50 2015 -0500 + + Split up GAP event callback registration + +commit bf3d0bbe1886be69b0b9fedac2a3c73a0cac59e0 +Author: Sandeep Mistry +Date: Fri Nov 27 15:55:22 2015 -0500 + + More keywords + +commit dbdebdb84f982c1edd8e9088e7b3d71a8534b7aa +Author: Sandeep Mistry +Date: Fri Nov 27 15:55:08 2015 -0500 + + Add BleCentral class, disconnect API, split out BleAddress + +commit 4e2a4d7d64669448ea4edcfbd10f6194041a6a9a +Author: Sandeep Mistry +Date: Fri Nov 27 14:12:03 2015 -0500 + + Add setAdvertisedServiceUuid API, and remove param to advertise from addPrimaryService + +commit 2881aa5175d2e0120a4c25dbf8188a589709405d +Author: Sandeep Mistry +Date: Fri Nov 27 14:11:11 2015 -0500 + + Add uuid method to BleService + +commit e7b71f54697a90f1b27e306817142a502cfd0690 +Author: Sandeep Mistry +Date: Fri Nov 27 13:47:49 2015 -0500 + + Rename set/getName to set/getLocalName + +commit ff11e027d85ae5fc312bb87509b65c0f87e62729 +Author: Sandeep Mistry +Date: Fri Nov 27 13:41:00 2015 -0500 + + Add poll API (no-op for now) + +commit 60f6c475aa6b0cd3fe6e366adebc2d9ae4924c7b +Author: Sandeep Mistry +Date: Fri Nov 27 13:37:21 2015 -0500 + + Add begin and end API's + +commit 6d5aa275c531c4fb180256f86e5ede51158710f5 +Author: Sandeep Mistry +Date: Fri Nov 27 13:31:18 2015 -0500 + + Rename bleDevice variable to blePeripheral + +commit 08fd946c6d1632198f4f3bc40d21ac8bb425c70e +Author: Sandeep Mistry +Date: Fri Nov 27 13:28:13 2015 -0500 + + Initial keywords.txt + +commit e8bdd87b7b0cf9ee3d993b2c5542f7593272c41b +Author: Sandeep Mistry +Date: Fri Nov 27 13:28:01 2015 -0500 + + Rename BleDevice.* files to BlePeripheral.* + +commit 7eea01f3e26eda828208ee64068dde040b253e88 +Author: Sandeep Mistry +Date: Fri Nov 27 13:22:31 2015 -0500 + + Add CurieBle.h for main lib header + +commit f6c59c14f95772fa3d6de4b8dfdc697cf8867b0d +Author: Sandeep Mistry +Date: Fri Dec 4 11:53:02 2015 -0500 + + Change CurieImu and BMI160 to KEYWORD2 + +commit 3642f44a88069e89cd644faabae8c72da78a2bfd +Author: hbisby +Date: Fri Dec 4 17:40:59 2015 +0100 + + added defines and classes to keywords.txt + +commit d8618b23ede8b769ecfe8cafee0695c2eea60956 +Author: hbisby +Date: Fri Dec 4 17:02:10 2015 +0100 + + adding keywords.txt for CurieImu library + +commit 262fd1e2940498c00d9871a455de21be1c73785f +Author: tigoe +Date: Thu Dec 3 23:33:37 2015 -0500 + + Style changes to IMU examples + + Note: IMU Library API still needs to be standardized. + +commit 39881ec83254758186e58c8e291b05ff09f6151e +Author: Dino Tinitigan +Date: Thu Dec 3 13:16:44 2015 -0800 + + ATLEDGE-393 Update SD library + + Rebase library from version 1.05 to 1.06 + Fixes issue with passing String class object to SD.exists() + +commit bca4512908095a1c6f04a1c975849080861ff609 +Author: Dino Tinitigan +Date: Wed Dec 2 11:01:11 2015 -0800 + + ATLEDGE-423 Export compiled binary + + Make changes to platform.txt to allow exporting compiled binary as a + .hex + +commit 3c833b2536b4616b38ef342289bb5efb440b6769 +Author: Dino Tinitigan +Date: Tue Dec 1 11:52:57 2015 -0800 + + ATLEDGE-442 Fix some SoftwareSerial Rx limitations + + Fixed some limitations for Rx on SOC_GPIO pins. + Rx should now be functional on all pins except pin 13. + +commit 0b100b2d006add6692a76d1658ca04b317b640a6 +Author: Dino Tinitigan +Date: Wed Nov 25 21:24:00 2015 -0800 + + Atledge-184 Minor improvements to SoftwareSerial library + + Minor improvements to SoftwareSerial library + +commit 7150436d89ca73fa7af68cd81c312203a7da4d4a +Author: Dino Tinitigan +Date: Wed Nov 25 19:14:24 2015 -0800 + + CurieRTC - SetTime example not setting RTC + + RTC not being set because the wrong call was being made should call + RTC.set(t) to set the hardware RTC instead of setTime(t). + +commit 25acb322cad8505f9564ca435b0e113bf5b5d9df +Author: Calvin Park +Date: Wed Nov 25 16:28:00 2015 -0800 + + Fixed typo in old IDE version error message + +commit fc55eedd7ce7fafbc5b0dd35c61ed12f22c0f26c +Author: Krzysztof Sywula +Date: Tue Nov 24 17:03:18 2015 -0800 + + ATLEDGE-455 verbose/quiet selection for upload + +commit 4984085e655687db615b3a9675ee374fba8d6cad +Author: Martino Facchin +Date: Wed Nov 25 16:37:28 2015 +0100 + + Add error message if using IDE 1.6.6 + +commit 69a88721160920cbd77b26836fc97a0549f87db4 +Author: Martino Facchin +Date: Wed Nov 18 10:59:59 2015 +0100 + + Fix recipe.ar.pattern to avoid warning at startup + +commit a22ea571d1863e3869ec5e9f29936d00822b8dcb +Author: Dino Tinitigan +Date: Tue Nov 24 14:01:14 2015 -0800 + + ATLEDGE-444 Fix Library warnings for Arduino IDE 1.6.6 + + Some libraries were missing the "category" field in library.properties + Minor fixes in some libraries for 1.6.6 compatibility + +commit 5c29db6c5b00b32d7f4d2379c3e89d9fdcc076d6 +Author: Dino Tinitigan +Date: Tue Nov 24 10:30:05 2015 -0800 + + ATLEDGE-396 Fix behavior of analogWrite() on non PWM pins + + For all non PWM pins, the behavior of calling analogWrite() should be + logic 0 if the value is 127 or less. For values of 128 or above, the pin + should go to logic 1. + +commit 7afbd91dd8c0aa2b39fbe696c0dcb506e28fddd6 +Author: Dino Tinitigan +Date: Mon Nov 23 18:09:53 2015 -0800 + + ATLEDGE-416 Fix some compile issues with Time.h + + Fix some issues with compiling Time.h by updating to version 1.50 of + Time library + Also removed some examples that will not compile for Arduino101 + +commit c7b04f7d7915407f5194f42abf3dcfc691cd23d8 +Author: Dino Tinitigan +Date: Mon Nov 23 16:07:16 2015 -0800 + + ATLEDGE-384 Remove Esplora specific examples + + Remove Esplora specific examples + +commit 2beea3e778b05e985ac7daacce86fb94847c054e +Author: Brian Baltz +Date: Fri Nov 6 10:33:12 2015 -0800 + + Resolving KW issue with SoftwareSerial destructor + + Signed-off-by: Brian Baltz + +commit b30a275c7221b614071767772e72b98ce93b7ed2 +Merge: 78afaae 3759bcd +Author: Calvin Park +Date: Thu Nov 5 11:05:04 2015 -0800 + + Merge pull request #62 from kevin306/testing + + Klocwork issues + +commit 3759bcd7fc648ae686de973af3df50f92e2dff9f +Author: Kevin Moloney +Date: Thu Nov 5 17:39:14 2015 +0000 + + Fix Klocwork#2051,2060: Array may be outside index + + Change && to || + + Signed-off-by: Kevin Moloney + +commit 5baa3fc6386781a784148fdf2b3fc65476416f05 +Merge: afcc4ef 344f90d +Author: Kevin Moloney +Date: Thu Nov 5 12:45:34 2015 +0000 + + Merge branch 'testing' of github.com:kevin306/corelibs-arduino101 into testing + + Conflicts: + libraries/CurieBle/src/BleCharacteristic.cpp + +commit afcc4efd16a7c7b9d915913d641a76f0b448eb3d +Author: Kevin Moloney +Date: Tue Nov 3 15:38:37 2015 +0000 + + Fix Klocwork#2051,2060: Array may be outside index + + * Added check to ensure _data_len is within index values. + + * Had to repeat the branch statement rather than move it because of memcpy. + + * Fixed bug introduced(c8ecd5f) in WString.h when "len" became protected. + + Signed-off-by: Kevin Moloney + +commit 344f90d892d33c47f121cc374643c5e28b51bbdd +Author: Kevin Moloney +Date: Tue Nov 3 15:38:37 2015 +0000 + + Fix Klocwork#2051,2060: Array may be outside index + + * Added check to ensure _data_len is within index values. + + * Had to repeat the branch statement rather than move it because of memcpy. + + Signed-off-by: Kevin Moloney + +commit 78afaae4c7f189dc44ec83d19745dc4bb4e7f6ac +Author: Dino Tinitigan +Date: Mon Nov 2 10:48:45 2015 -0800 + + ATLEDGE-229 CurieRTC and Time Library + + Initial implementation of the CurieRTC library for the built-in RTC + Includes the Time library plus 3 new examples for the Arduino101 + +commit cacac37db51b7212b92f3e90ff944006771860c4 +Author: Bogdan Pricop +Date: Thu Oct 29 22:28:12 2015 +0000 + + Fix Klocwork#137: Non-void function does not return value + + Change getTimeStampClks() implementation from assembly to C. + + Signed-off-by: Bogdan Pricop + +commit 8fa6bbaa920005ea42f738f305bcd4852c822a1b +Author: Dino Tinitigan +Date: Wed Oct 28 16:28:50 2015 -0700 + + ATLEDGE-184 SoftwareSerial Library + + Port of SoftwareSerial Library for Arduino101 + Tx works up to 384000 bps + Rx works up to 57600 bps + +commit 2ae262a2a87d0d85032da3d975e7f1385a02ea75 +Author: Kevin Moloney +Date: Thu Oct 29 14:41:28 2015 +0000 + + Fix Klocwork#2051,2060: Array may be outside index + + * Added check to ensure _data_len is within index values. + + * Had to repeat the branch statement rather than move it because of memcpy. + + Signed-off-by: Kevin Moloney + +commit 739c4007ba9c4b7a77d57628eb9ea31ab204d880 +Author: Kevin Moloney +Date: Wed Oct 28 16:47:44 2015 +0000 + + Fix Klocwork#543,544: Buffer overflow/null pointer + + * Added a check to ensure array does not access index value of -1. + + * Added a check for this null pointer. + + Signed-off-by: Kevin Moloney + +commit dd4845e5d4f7dca461587d8bc0cc998598b060bc +Author: Kevin Moloney +Date: Wed Oct 28 16:44:45 2015 +0000 + + Fix Klocwork#2081,2082: Uninitialized variable. + + * using memset to initialize struct to zero. + + Signed-off-by: Kevin Moloney + +commit 79744c4255d4c33d21b79bbc6f99922476ad3adf +Author: Kevin Moloney +Date: Wed Oct 28 16:40:38 2015 +0000 + + Fix Klocwork#79,80,81,82: Uninitialized Variable. + + * using memset to initialize struct to zero. + + Signed-off-by: Kevin Moloney + +commit 79008fa1132cd1c9790c50a3f96232f54774a1dd +Author: Kevin Moloney +Date: Wed Oct 28 16:38:07 2015 +0000 + + Fix Klocwork#671: Infinite loop. + + * Added comment to verify requirement for infinite loop. + + Signed-off-by: Kevin Moloney + +commit cfe0a5df34a7f8b94724a9b99f02b5e62e42854b +Author: Kevin Moloney +Date: Wed Oct 28 16:33:00 2015 +0000 + + Fix Klocwork#105: Pointer returned may be null. + + * Added a check for this null pointer. + + Signed-off-by: Kevin Moloney + +commit 5e71e700d4d1b66f9e68fc725653db9859660255 +Author: Kevin Moloney +Date: Wed Oct 28 16:30:11 2015 +0000 + + Fix Klocwork#100: Infinite loop. + + * Added comment to verify requirement for infinite loop. + + Signed-off-by: Kevin Moloney + +commit db2995a78d772adb072ce743e77eece69a01d0d8 +Author: Kevin Moloney +Date: Wed Oct 28 16:28:23 2015 +0000 + + Fix Klocwork#91: Infinite loop + + * Added comment to verify requirement for infinite loop. + + Signed-off-by: Kevin Moloney + +commit 62395e48e858c433a88c20523481382e90be21a3 +Author: Kevin Moloney +Date: Wed Oct 28 16:25:14 2015 +0000 + + Fix Klocwork#1093: Infinite loop. + + * Added comment to verify requirement for infinite loop. + + Signed-off-by: Kevin Moloney + +commit b3afd60a73d2fa8ead92ffa8e66a264e64bafd12 +Author: Bogdan Pricop +Date: Wed Oct 28 14:19:45 2015 +0000 + + Fix Klocwork#137: Non-void function does not return value + + Move getTimeStampClks() function to an *.S file + It is fully implemented in assembly and we take care of returning value by + filling in the proper value in the proper registers. + + Signed-off-by: Bogdan Pricop + +commit 0e094210f3d645b109adceb393a00b0b41acdf80 +Author: Martino Facchin +Date: Thu Oct 29 09:54:33 2015 +0100 + + fix BLE library String handling + + the correct way to get a String lenght is by calling String.length() + now len field is protected so a compilation error will be triggered + +commit 0ffb9749afb8dc53abd628e00ced6af07d0c97d1 +Merge: b17f321 6f35dfd +Author: Calvin Park +Date: Wed Oct 28 17:03:31 2015 -0700 + + Merge pull request #58 from facchinm/new_delete + + Fixes to pass validation with test suite + +commit 6f35dfd332c30b135c14d1f718f923299d7e6695 +Author: Martino Facchin +Date: Wed Oct 28 12:53:47 2015 +0100 + + stdlib_noniso: expand all functions up to base 36 + + needed to pass a very strict test + Porting of latest Due implementation + +commit f07a20aa02e5421b1fc6e9775fdeb2221c8bd2a7 +Author: Martino Facchin +Date: Wed Oct 28 12:50:35 2015 +0100 + + remove misleading SERIAL_PORT_USBVIRTUAL define + + the Serial via USB port is not a real virtual cdc port (it still emulates an Hardware Serial), remove to avoid sketches getting confused and expect CDC flow control functions + +commit c8ecd5f0af6c87fdd02382f0cab275d83da31f2c +Author: Martino Facchin +Date: Tue Oct 27 18:01:17 2015 +0100 + + Sync IPAddress and Wstring with SAM implementation + + Test suite failed on these functions + +commit d179695b0494b96cc1feb963905ee8fea9a7d2a5 +Author: Martino Facchin +Date: Tue Oct 27 15:41:24 2015 +0100 + + Add new/delete implementations + + This is needed to pass C++ validation in test suite + +commit b17f321e32464222ff433afa69af2ba3fe0149c5 +Author: Martino Facchin +Date: Tue Oct 27 15:40:30 2015 +0100 + + Specify architecture in library properties + + to avoid conflicts with standard libs + +commit cd4f66d4620a8aabb4bfb966fe6564a367a24f32 +Author: Dan O'Donovan +Date: Thu Oct 22 17:50:32 2015 +0100 + + libarc32drv_edu.a: Update of pre-compiled driver library. + + Signed-off-by: Dan O'Donovan + +commit 95174ce3dd682621e1f74ef0e04e818b0ff1dce3 +Author: Dan O'Donovan +Date: Thu Oct 22 17:47:07 2015 +0100 + + build: unused global variables in header file causing BLE build failure + + factory_data.h defines 2 global variables which aren't actually used anywhere. + However, they become global symbols in any C files that include this header + file. For most builds, this header file is included only once but, for CurieBle + library builds, it is included by another C file as well. This causes a linker + error due to duplicate symbols in the final image. + + The simple solution is to just remove these variables, because they aren't used. + + Signed-off-by: Dan O'Donovan + +commit 7052d8fe88034c92bd845b818bd1c028adea0444 +Merge: 6efbac6 c5e9152 +Author: Brian Baltz +Date: Wed Oct 14 16:20:32 2015 -0600 + + Merge pull request #52 from 01org/arduino101-rename + + ATLEDGE-364 Rename EDU to Arduino 101 + +commit c5e915295c995aebc15ecab2a2538b6c3ab20f23 +Author: Brian Baltz +Date: Wed Oct 14 15:14:56 2015 -0700 + + ATLEDGE-364 Rename arduino_101_x to arduino_101 + + Signed-off-by: Brian Baltz + +commit 570a904927ca18737613dbee8f4640382dba0746 +Author: Brian Baltz +Date: Wed Oct 14 14:56:03 2015 -0700 + + Update pre-compiled library + + Signed-off-by: Brian Baltz + +commit d342223adc0676d5c39a0d89f9ab94d0cea5e56e +Author: Brian Baltz +Date: Wed Oct 14 14:55:55 2015 -0700 + + ATLEDGE-364 Remove CONFIG_BOARD_ATLASPEAK_EMU specific code + + Signed-off-by: Brian Baltz + +commit 6efbac63436af6e286aa4b5e09b30bbe4cebeb80 +Author: Manoel Ramon +Date: Tue Oct 13 15:49:41 2015 -0700 + + ATLEDGE-316 - isAlphaNumeric returns incorrect bool for '@' + +commit 31e75615c26a6d19c168fc16e6b44d4e9504c45b +Author: Kevin Moloney +Date: Wed Oct 14 12:11:13 2015 +0100 + + Missing examples folder in Wire library + + - Slave examples not relevant because AtlasPeak does not support + slave-mode I2C. + + - Examples included digital_potentiometer, master_reader, + master_writer, SFRRanger_reader. + + Signed-off-by: Kevin Moloney + +commit 4c04540989a546fb6b668f35cee49a272bed9019 +Author: Brian Baltz +Date: Tue Oct 13 16:01:50 2015 -0700 + + ATLEDGE-364 Rename EDU library folders + + Signed-off-by: Brian Baltz + +commit d7617aba523a269a0d8278ba758bbe706fdd74f3 +Author: Brian Baltz +Date: Tue Oct 13 15:56:24 2015 -0700 + + ATLEDGE-364 Rename EDU to Arduino 101 + + Signed-off-by: Brian Baltz + +commit 7436867a37228a6bdeecf87c80489187a99f01ed +Author: Manoel Ramon +Date: Wed Oct 7 22:10:55 2015 -0700 + + ATLEDGE-358 - BLE Broadcast name must read the product name in the OTP + +commit 94ea92298feee063539ed2ca791cdef826d71333 +Author: Kevin Moloney +Date: Tue Oct 13 14:42:51 2015 +0100 + + Updated libarc32 + + Signed-off-by: Kevin Moloney + +commit 5a1c28cd384e01c50068aca8c7b379b05bb50571 +Author: Kevin Moloney +Date: Tue Oct 13 14:36:32 2015 +0100 + + ATLEDGE 201 Pointer returned may be null + + Added a check for this null pointer. + + Signed-off-by: Kevin Moloney + +commit 45e6046f09e2c465c69456869cee6992792e4f55 +Author: Kevin Moloney +Date: Tue Oct 13 13:04:04 2015 +0100 + + Files no longer in use, can be removed. + +commit 15dbf74d82907eb0af47ad9c5ef682fa298b11f3 +Merge: 685eed6 aa8e01a +Author: Calvin Park +Date: Mon Oct 12 11:43:12 2015 -0700 + + Merge pull request #48 from Dan-Emutex/adafruit_libraries + + Adafruit libraries + +commit 685eed663cedc37c91855048c216872a479605ad +Author: Dan O'Donovan +Date: Fri Oct 9 16:49:22 2015 +0100 + + imu: revert commit b62bbfc89b + + This commit essentially reverts the changes made in b62bbfc89b. + That is, it removes some Accelerometer data sampling rates which + we don't support in the mode that we are using the Accelerometer + + Signed-off-by: Dan O'Donovan + +commit aa8e01a64fe31172758ee0b1c66b4a3ce521730b +Author: Dan O'Donovan +Date: Fri Oct 2 17:59:40 2015 +0100 + + dotstar: initial port to AtlasEdge + + Signed-off-by: Dan O'Donovan + +commit 4fee1cca6bac948cb010cadb6b9fba33d8fbc2c6 +Author: Dan O'Donovan +Date: Fri Oct 2 17:57:02 2015 +0100 + + dotstar: add DotStar library v1.0.1 from Adafruit + + - Adafruit_Dotstar Github repository: https://github.com/adafruit/Adafruit_DotStar + Tag: v1.0.1 + + Signed-off-by: Dan O'Donovan + +commit 6e2de131cbfd585cf027f41353a71707185a8bbd +Author: Dan O'Donovan +Date: Fri Oct 2 17:52:45 2015 +0100 + + motorshield: initial port to AtlasEdge + + Signed-off-by: Dan O'Donovan + +commit e671f3f6c3b134d6b326c671de255c2f47d83969 +Author: Dan O'Donovan +Date: Fri Oct 2 17:07:56 2015 +0100 + + motorshield: add Motor Shield V2 library v1.0.1 from Adafruit + + - Adafruit_Motor_Shield_V2_Library Github repository: https://github.com/adafruit/Adafruit_Motor_Shield_V2_Library + Tag: v1.0.1 + + Signed-off-by: Dan O'Donovan + +commit 146b0bf2912cf09735f2701564261bb06d2aa6b3 +Author: Dan O'Donovan +Date: Mon Sep 28 17:00:30 2015 +0100 + + neopixels: initial port to AtlasEdge + + Signed-off-by: Dan O'Donovan + +commit ca4d7f2530f4077d6d1108d450c32afaa9f7862a +Author: Dan O'Donovan +Date: Mon Sep 28 14:18:41 2015 +0100 + + neopixel: add Neopixel library v1.0.3 from Adafruit + + - Adafruit_Neopixel Github repository: https://github.com/adafruit/Adafruit_NeoPixel + Tag: v1.0.3 + + Signed-off-by: Dan O'Donovan + +commit 7d930a50dbfb0890b4bb0915fe34c5dc2bdd6d79 +Author: Dan O'Donovan +Date: Fri Oct 9 13:21:22 2015 +0100 + + imu: fixed and simplified (set|get)ZeroMotionDetectionDuration methods + + Validation feedback revealed logic errors in + setZeroMotionDetectionDuration and a lack of clarity on how it should + be used. Addressed by providing an explicit set of valid values for + the user to pass to the method, which can in turn be written directly + to the relevant register + + Signed-off-by: Dan O'Donovan + +commit 7134c41e2940db726cfa293f19e9207cc9b643a2 +Author: Dan O'Donovan +Date: Mon Oct 5 10:17:29 2015 +0100 + + imu: improve interrupt-safety of CurieImu API methods + + Ensure that SPI transfers cannot be interrupted, and + avoid use of global buffer to improve interrupt safety + + Signed-off-by: Dan O'Donovan + +commit 252bd5308f34dd442d9190d36bfbe7f7b1379402 +Author: Calvin Sangbin Park +Date: Mon Oct 5 15:26:15 2015 -0700 + + Updated libarc32 + +commit b1cbef53bbd79333c0df25816078a7eab4b441bc +Author: Dan O'Donovan +Date: Fri Oct 2 15:26:25 2015 +0100 + + imu: minor tidy-up of documentation for API enumeration values + + Signed-off-by: Dan O'Donovan + +commit b62bbfc89bc35b3a0a04de74f7e4898371922a83 +Author: Dan O'Donovan +Date: Fri Oct 2 14:31:57 2015 +0100 + + imu: add missing accelerometer sample rate options + + - The following sample rates were previously omitted: + - 25/32 Hz + - 25/16 Hz + - 25/8 Hz + - 25/4 Hz + + Signed-off-by: Dan O'Donovan + +commit 426367514593a075b3dc5d373dca10e82cf24112 +Author: Dan O'Donovan +Date: Fri Oct 2 14:28:22 2015 +0100 + + imu: remove invalid 3200Hz accelerometer sample rate option + + The maximum sample rate for the accelerometer is 1600Hz + + Signed-off-by: Dan O'Donovan + +commit c8c4d98b50644141b77868996e226fba167944c9 +Author: Dan O'Donovan +Date: Fri Oct 2 14:06:00 2015 +0100 + + imu: fixes/improvements needed for TapDetect example + + - Threshold was set incorrectly, leading to over-sensitive detection + - Default accelerometer range of 2g prevented detection of strong taps + - Added comments to explain the code in more detail + + Signed-off-by: Dan O'Donovan + +commit 23bd20fe1081edde07fca0a85718f5a52987abfc +Author: Dan O'Donovan +Date: Fri Oct 2 13:49:24 2015 +0100 + + imu: compile error in RawImuDataSerial.ino when CALIBRATE_ACCELGRYO_OFFSETS defined + + Signed-off-by: Dan O'Donovan + +commit 67629a6de0e9163f1a7631fa2ae28c9f5b9e4765 +Author: Dan O'Donovan +Date: Fri Oct 2 13:34:48 2015 +0100 + + imu: remove delay between bi-dir SPI transfers causing data loss + + A wait for TX to complete, followed then by RX, was causing data + loss due to the fact that it was waiting for the busy status flag + to clear after TX, but this doesn't clear until after RX is also + complete. The result was data loss due to RX FIFO overflow. + Fixed by disabling the wait between TX and RX steps. + + This affected functions requesting more than 8 bytes from the + BMI160, such as getMotion6() and getFIFOBytes() methods. + + Signed-off-by: Dan O'Donovan + +commit 599e33bf4bfd604f68e55252511075e078c673de +Author: Dan O'Donovan +Date: Thu Oct 1 12:55:05 2015 +0100 + + imu: fixed error in reg_write_bits + + - reg_write_bits was erroneously clearing all other bits in + a register outside of the bits targeted for the write + operation. + + Signed-off-by: Dan O'Donovan + +commit 17b8d04c60919d25ccac54d7cf2901c1d0f0e285 +Author: Dan O'Donovan +Date: Mon Sep 28 14:08:28 2015 +0100 + + imu: minor clean-ups + + - removed some dead code + - added/corrected some code comments + + Signed-off-by: Dan O'Donovan + +commit e4904009052717894720323d8b037307b24b9204 +Author: Dan O'Donovan +Date: Fri Sep 25 18:10:25 2015 +0100 + + imu: adding support for tap detection by BMI160 accelerometer + + Signed-off-by: Dan O'Donovan + +commit a5a12fc002430d002d9434f47582577da5c36631 +Author: Dan O'Donovan +Date: Fri Sep 25 15:21:05 2015 +0100 + + imu: added support for Step Detection/Counting in CurieImu library + + Signed-off-by: Dan O'Donovan + +commit b759ec35f46ef38d77fcd90ad1d91a5840607aaa +Author: Dan O'Donovan +Date: Fri Sep 25 01:36:11 2015 +0100 + + imu: fixes for issues found while testing shock detection + + - Created new SPI driver using polling instead of interrupts. + This allows it to be used within an ISR so that + we can check the source of the CurieImu interrupts. + - Fixed bit manipulation logic for partial register read/writes + - Added a new example sketch to demonstrate Shock Detection function + - Fixed IMU power-up logic + + Signed-off-by: Dan O'Donovan + +commit 982a470e6909bd444a399b49ced4749d9da72754 +Author: Dan O'Donovan +Date: Thu Sep 17 15:59:50 2015 +0100 + + Initial commit for new CurieImu Gyro/Accel library + + Signed-off-by: Dan O'Donovan + +commit e25bcde0d0b7f9fc635e376aa649884a369d6c45 +Merge: 6f196e1 2b11283 +Author: Brian Baltz +Date: Fri Oct 2 12:32:31 2015 -0600 + + Merge pull request #46 from 01org/cdc-acm + + CDC-ACM: move allocation of shared buffers to LMT - Has pair commit in Thunderdome + +commit 2b112833285765ef1e9436d5a82f1eeb65f53df8 +Author: Calvin Sangbin Park +Date: Fri Oct 2 10:32:51 2015 -0700 + + Updated libarc + +commit 05d4ecade9f44e2d86a43fde1030b2b0167236ed +Author: Bogdan Pricop +Date: Fri Oct 2 16:02:09 2015 +0100 + + CDC-ACM: avoid race condition. + + * In case bool() is called in a very tight while loop, give LMT space + to set the host_open shared variable. + + Signed-off-by: Bogdan Pricop + +commit b8d9b11d8d1c61d704f967d5d730b244c72d918f +Author: Bogdan Pricop +Date: Fri Oct 2 12:19:29 2015 +0100 + + CDC-ACM: change end and init to avoid race condition. + + Signed-off-by: Bogdan Pricop + +commit 5174c9c7e1634eef20c84b436c58a7b7cbbddbb3 +Author: Bogdan Pricop +Date: Fri Oct 2 10:29:43 2015 +0100 + + libarc32drv_edu.a: Update of pre-compiled driver library. + + Signed-off-by: Bogdan Pricop + +commit a6473d1fc4c8e4207f974eac273b0f5781341bc7 +Author: Dan O'Donovan +Date: Fri Oct 2 00:11:03 2015 +0100 + + CDC-ACM: move allocation of cdc-acm shared buffers to LMT + + LMT shall now be responsible for allocating shared data buffers + used to exchange CDC-ACM data between ARC and LMT. + + Defined a revised set of structures to allow the pointers to + be passed from LMT to ARC during initialisation. + + NOTE THAT THIS DEPENDS ON A CORRESPONDING CHANGE IN THUNDERDOME + FIRMWARE + + Signed-off-by: Dan O'Donovan + +commit 6f196e1fcdb422ca29229af27ff984eb113e3bd0 +Author: Calvin Park +Date: Thu Oct 1 22:11:13 2015 -0700 + + Updated libarc32 + +commit 4f1a71a77685e4b98a2c0345773bb5c92cbc98f4 +Author: Bogdan Pricop +Date: Fri Sep 11 08:59:45 2015 +0100 + + CDC-ACM fix flush() API + + Signed-off-by: Bogdan Pricop + +commit 0f07ea0e5dcf0039761e256a7efe7f327270124e +Author: Dan O'Donovan +Date: Thu Sep 10 13:43:13 2015 +0100 + + CDC-ACM - Fix slow write() performance and availableForWrite() logic + + - Removed delay in write() function which caused slow TX performance + - Removed timeout logic in write() function; moved to LMT side + - Fixed logic in availableForWrite() - ring-buffer capacity is at most + 1 less than actual size to avoid head index passing tail index + + Signed-off-by: Dan O'Donovan + +commit 33f4380d60a5f3fd110965f15565f3b83b57d6c9 +Author: Bogdan Pricop +Date: Tue Sep 8 10:57:00 2015 +0100 + + CDC-ACM - address review comments. + + Signed-off-by: Bogdan Pricop + +commit ddb0003c675d648f1b49ea8956e5b0f3b49d4775 +Author: Bogdan Pricop +Date: Mon Sep 7 15:36:58 2015 +0100 + + CDC-ACM using shared memory buffers + + Signed-off-by: Bogdan Pricop + +commit 6d0fc98091cedcc6c2e947878bdf7f5201592abe +Author: Dan O'Donovan +Date: Sat Sep 19 09:50:03 2015 +0100 + + ble: update libarc32drv_edu.a + + Signed-off-by: Dan O'Donovan + +commit 9314b22ff29e70c400c61d8f39c6486d8faa03ad +Author: Dan O'Donovan +Date: Sat Sep 19 09:41:46 2015 +0100 + + ble: address code review comments from Manoel Ramon + + - Added checks in example sketches for API return values + - Applying Public MAC address if present in factory data + - Applying default device name if user doesn't provide one + - Only issuing notifications/indications if enabled by peer + - Re-sync'd with latest BLE code from Thunderdome + - Added basic DTM support for use in sketch (for internal testing) + - Other minor updates, corrections and clarifications + + Signed-off-by: Dan O'Donovan + +commit a709e252eb60dec7eb7f923797814e72ffda5dcc +Author: Brian Baltz +Date: Fri Sep 18 09:47:10 2015 -0600 + + ATLEDGE-334 Update version header location in linker script + + Need to update linker script to match recent firmware change: + + JIRA: FIRE-2160 + + 1024 bytes were used to store the version header, which is only + 48 bytes big. So we wasted 976 bytes. By moving it after the vector table, + we can free this 1024 bytes space. + + Signed-off-by: Brian Baltz + +commit c33d42adca3d1fd4295e7df8f278c41089da26f6 +Author: Brian Baltz +Date: Thu Sep 17 12:58:44 2015 -0700 + + ATLEDGE-333 CLUploader script path is hard-coded + + Signed-off-by: Brian Baltz + +commit 28304b5b8ba763fe00d23cd074f23b3b8e6b97e0 +Author: Dan O'Donovan +Date: Wed Sep 16 17:51:36 2015 +0100 + + uart: fixing baud divisor calculation to add support for 230400 bps + + Added code to configure the UART fractional divisor to improve the + UART timing at higher speeds such as 230400, 460800 and 921600 bps. + + Signed-off-by: Dan O'Donovan + +commit b96562dbb3c63d5cc894f128d61de4f1bc6de3d5 +Author: Dan O'Donovan +Date: Wed Sep 16 14:45:05 2015 +0100 + + wire: adding support for I2C RESTART and some minor clean-ups + + - Added support for sending repeated-START conditions on the I2C bus + By adding an option to not send a STOP condition at the end of a + transfer, it is possible for the I2C master to hold the bus and + send additional transfers. If switching from writing to reading, + or vice-versa, the I2C master controller will automatically send + a repeated-START (RESTART) in between. For consecutive writes or + consecutive reads to the same slave, a repeated-START is not needed. + + - Cleaned up some redundant code and removed some unsupported methods + in the Wire library implementation for AtlasEdge, particularly those + related to I2C Slave-mode. AtlasEdge supports I2C Master-mode only. + + Signed-off-by: Dan O'Donovan + +commit 026afb2d00b89999b07bd7c5c6bc54cd29bbb310 +Author: Dino Tinitigan +Date: Mon Sep 14 16:11:37 2015 -0700 + + ATLEDGE-231 TFT Library + + Add missing wiring_private.h file + +commit 6b5577e058a46fcfca5ba91ccd3c9824acd941b6 +Author: Dan O'Donovan +Date: Sat Sep 12 11:26:50 2015 +0100 + + ble: adding new CurieBle Arduino library for AtlasEdge + + Added new BLE library and examples, providing access to + basic GAP/GATTS features of Intel Curie module + + Includes a port of the BLE Core Service CFW API and + UART-IPC drivers from Thunderdome code base + + Also includes a shift of CFW master role from LMT to ARC. + Requires matching commit 4d056720 or newer in thunderdome + atlaspeak_atlasedge project source tree to work correctly + + Known issues: + - A fix in Nordic BLE firmware is required to support + adding Presentation Format descriptors to characteristics. + Until that fix is available, the addPresentationMethod() + of the BleCharacteristic class should not be used. + - Due to issues with the current CDC-ACM implementation on + AtlasEdge platforms, use of Serial should be replaced with + Serial1 in the CurieBle example sketches, until CDC-ACM + issues are resolved. + + Not currently supported: + - Direct Test Mode (DTM) + - Bluetooth bonding (pairing) + - BLE Central Device role and GATT client functionality + + Signed-off-by: Dan O'Donovan + +commit 4cf249987b5da85a90025d174021824e5ce09cc6 +Author: Bogdan Pricop +Date: Mon Aug 17 22:49:26 2015 +0100 + + Port OneWire to Atlas Edge board + + * Implement platform specific macros for Intel AtlasPeak SoC. + + Signed-off-by: Bogdan Pricop + +commit 42da7aadcf2439bb4adaa5a1e112381786639486 +Author: Bogdan Pricop +Date: Fri Jul 31 16:23:55 2015 +0100 + + Add Paul Stoffregen's OneWire library version 2.3 + + * 1-Wire Github repository: https://github.com/PaulStoffregen/OneWire + tag: 2.3 + + Signed-off-by: Bogdan Pricop + +commit d439d3be7522a5d4c2adf552039b089dea0d495f +Author: Dino Tinitigan +Date: Thu Sep 10 11:13:58 2015 -0700 + + ATLEDGE-231 TFT Library + + Add AtlasEdge support to TFT library + +commit f34bda4517f1cc199d29e3fe51c220cae5b2cf4c +Author: Dan O'Donovan +Date: Wed Sep 2 12:53:49 2015 +0100 + + Updated license headers in Thunderdome-derived source files + + New license headers and other minor changes have been imported + from the Thunderdome code base. Note that no functionality has + been added/changed/removed in this commit. + + Signed-off-by: Dan O'Donovan + +commit 647e20823be90638e707fbcb66c8be4e1f9ea351 +Author: Dino Tinitigan +Date: Tue Aug 25 10:24:03 2015 -0700 + + ATLEDGE-279 F_CPU not defined + + Added F_CPU to boards.txt and platform.txt. + Fixed format of boards.txt + +commit d3bbf49643a9fdd2a19426f5818cd602e1e99e8d +Author: Dino Tinitigan +Date: Mon Aug 24 16:34:21 2015 -0700 + + ATLEDGE-228 SD Library + + Add AtlasEdge support to SD library + +commit 83a4c0213a24c32e4f2924fbbcad5dd5afca9ec3 +Author: Dino Tinitigan +Date: Fri Aug 21 13:05:14 2015 -0700 + + ATLEDGE-272 SPI broken by new clock gating feature + + Enable clock gate before configuring SPI + +commit c29233c5826e85f49173a77757400678471bd49b +Author: David Hunt +Date: Wed Aug 12 12:40:28 2015 +0100 + + Cleaned up buffer handling in CDCSerial class. + + Signed-off-by: David Hunt + +commit b9d35bdac7c27a1c407fe2e0d4f97236a980f312 +Author: David Hunt +Date: Thu Aug 6 14:28:16 2015 +0100 + + libarc32drv_edu.a: Update of pre-compiled driver library. + + Signed-off-by: David Hunt + +commit 7fa713d2ef47140a82b4b0f50ab31ec43206fada +Author: David Hunt +Date: Tue Aug 11 13:53:48 2015 +0100 + + Address review commments on cdc-acm serial + + Signed-off-by: David Hunt + +commit 511a8d76f20698813cafa1b0f7130e40f37cdaea +Author: David Hunt +Date: Tue Aug 4 12:23:24 2015 +0100 + + Changes out of code reviews. + + Signed-off-by: David Hunt + +commit d85aa9643ac15389004d05217e67d438d689916d +Author: David Hunt +Date: Wed Jul 29 14:45:44 2015 +0100 + + Added CDC-ACM serial functionality as Serial. + + Pin header pins 0 and 1 have moved to Serial1 + + Signed-off-by: David Hunt + +commit 347ded518d9731dd93460b569168f2631ad604c1 +Author: Manoel Ramon +Date: Thu Aug 13 16:28:39 2015 -0700 + + ATLEDGE-44 Creation of platform ID and platform name for Atlas Edge + +commit a9c0430563473d556a766ac7df953969363f3bc8 +Author: Krzysztof Sywula +Date: Tue Aug 11 18:33:04 2015 -0700 + + vid/pid change + + JIRA: ATLEDGE-181 + + Signed-off-by: Krzysztof Sywula + +commit 7d55eb88f2c659ca0dc3bc83ef607fbeb439bbe2 +Author: Dino Tinitigan +Date: Tue Aug 11 10:48:22 2015 -0700 + + ATLEDGE-141 Add ATN pin as a regular gpio + + Added ATN pin as a regular gpio as pin 20 + +commit e487817583d12c6ef1203ef60c14cd4882509b32 +Author: Martino Facchin +Date: Tue Aug 11 13:56:19 2015 +0200 + + import stdlib noniso functions + + try not to reinvent the wheel + solves print(*, BIN) returning "unsupported base" + +commit a03d93d5634335a96549c1c41923e03424f5d488 +Author: Martino Facchin +Date: Tue Aug 11 12:34:10 2015 +0200 + + add support for String operation with uint64_t + + fixes examples StringConstructors, StringAdditionOperator, StringAppendOperator + + only needed because millis() returns a uint64_t + +commit 2dbdd016cc9cf47649c55141b56bc7c2e64315ad +Author: Dino Tinitigan +Date: Thu Aug 6 15:38:23 2015 -0700 + + ATLEDGE-30 Port Ethernet Library + + Port of the Ethernet Library for Atlasedge. + Added missing files from cores directory needed by Ethernet, WiFI, and + other similar libraries. + Works for Arduino 1.6.5 and above + +commit 293b27908134ab79d689020dece0bf6ce8cc02a7 +Author: Bogdan Pricop +Date: Thu Aug 6 15:04:43 2015 +0100 + + Fix the build. + + Signed-off-by: Bogdan Pricop + +commit bc74b7df42ec1a9413dd044b814363c7cc51bdeb +Author: Bogdan Pricop +Date: Thu Aug 6 13:48:37 2015 +0100 + + Address code review comments + + * Correct spelling error evry => every + * Remove magic number 0xFFFFFFFF and define it as FREE_RUN_TIMER + * Remove 2 and 10 magic numbers from Print class; use BIN and DEC instead + * Add base checking inside printNumber() and printLongLong() methods + * Remove some unnecessary white spaces. + + Signed-off-by: Bogdan Pricop + +commit 3cc79807014c1f386e12017c4063ccc62db9e15c +Author: Kevin Moloney +Date: Tue Aug 4 12:21:44 2015 +0100 + + ATLEDGE-185 - String object is missing functions + + Also included Bug #2289 overloaded operators missing + Signed-off-by: Kevin Moloney + +commit e3f227ff6fe7c5530a2f99f2c42206dd08071020 +Author: Martino Facchin +Date: Mon Aug 10 15:05:26 2015 +0200 + + WStrings: add c_str function + + this fixes SD library compilation + + However, in the long term, WString, Print, IPAddress, Stream and WMath (every core file non hardware-related) should be aligned to AVR version to avoid incompatibilities with derived classes + +commit fd8b3e5e6899ed12ada55829c7557be0402dd123 +Author: Martino Facchin +Date: Mon Aug 10 14:53:57 2015 +0200 + + Add digitalPinTo* macros/functions + + these functions ensure compatibility with lots of existing libraries + +commit f3f2b0bc66b053b2cd59cee578906a2f7d83eabc +Author: Martino Facchin +Date: Tue Jul 21 18:09:38 2015 +0200 + + Improve Wire library + + still unreliable though + +commit a33835c16343c18ed75e51418ff02c72684a745b +Author: David Hunt +Date: Fri Jul 31 13:56:57 2015 +0100 + + ATLEDGE-177-char-Signed + + Char is now signed (fix of previous regression in merge) + + Signed-off-by: David Hunt + +commit 0aa51368ea4b1688aecbe2b2b0b8b1bf57058ecf +Author: David Hunt +Date: Fri Jul 31 12:50:14 2015 +0100 + + libarc32drv_edu.a: Update of pre-compiled driver library. + + Signed-off-by: David Hunt + +commit 31513f70d52408093dfbcaeeee4ec77e9c1c3dcb +Author: Bogdan Pricop +Date: Wed Jul 29 17:37:35 2015 +0100 + + Fix bug #2220: delay(150secs) only waits for approx 15secs + + Root cause: + While transforming milliseconds in clocks, the result of an uint32_t + multiplication overflows + Solution: + Cast one of the operands to uint64_t + + Signed-off-by: Bogdan Pricop + +commit b365f143e2b11346ee54a9c48f6c6b3b48e33e56 +Author: Kevin Moloney +Date: Wed Jul 29 11:14:02 2015 +0100 + + Bug#2262 String Object compile error + + Signed-off-by: Kevin Moloney + +commit da0eaa49fe58a431fdf03403355cf71ab671b9bd +Author: Kevin Moloney +Date: Wed Jul 29 14:06:08 2015 +0100 + + ATLEDGE-209 tone() bug when frequency = 0 + + Signed-off-by: Kevin Moloney + +commit bc7fbd8adbf3058f4dc3bae0c9a1568b3e98ba3f +Author: David Hunt +Date: Thu Jul 30 11:32:26 2015 +0100 + + Bug# 2265 - fixed parseInt(skipchar) Compilation error + + Signed-off-by: David Hunt + +commit 67e7f2e9843096b03110cefdc5e702d896bf5be6 +Author: David Hunt +Date: Wed Jul 29 10:07:37 2015 +0100 + + Added support for printing long long values, e.g. millis() + + Signed-off-by: David Hunt + +commit abe68dea6befe32fc4ce2951c5bb2e89c2e4bd45 +Author: Bogdan Pricop +Date: Wed Jul 29 12:14:56 2015 +0100 + + ARC init: enable FIRQ + + * Change interrupts priority from 1 to 0 (FIRQ) + * Modify linker script: add stack area for FIRQ + Define a stack memory section in SRAM and split it between run time + and FIRQ stacks. + * Replace existing generic ISR; it initialises the SP, decodes the IRQ + source and finally jumps and links to the specific ISR. + * Modify _IsrTableEntry structure: get rid of ISR parameter. + + Signed-off-by: Bogdan Pricop + +commit 47fab774f96532134ad74a8c16bcecf6c9fdefbf +Author: Bogdan Pricop +Date: Mon Jul 27 14:37:09 2015 +0100 + + ATLEDGE-169: Change interrupt routing mask + + Issue: The LMT receives an interrupt enabled by SS because the routing + mask is disabled for both cores (the interrupt is routed to both + ARC and LMT) and it masks it because it is a "spurious irq" from + its point of view. + + Fix: When the ARC enables an interrupt source, it configures the interrupt + router to route the interrupt only to ARC core. + + Signed-off-by: Bogdan Pricop + +commit ab97250c0df109b68f71983fe0046b2d16f839fc +Author: Kevin Moloney +Date: Tue Jul 28 11:58:41 2015 +0100 + + Bug #2184 Serial.begin() config not implemented + + Signed-off-by: Kevin Moloney + +commit e542703d8458e5769ab6d8aa38a9a565aaff83a3 +Author: Kevin Moloney +Date: Fri Jul 24 12:43:34 2015 +0100 + + ATLEDGE-177-char-Signed + + Char is now signed + Boolean modified to be a bool not an int + + Signed-off-by: Kevin Moloney + +commit afcd5f7932f62f7692121b9dcce8b67972a2fac6 +Author: Kevin Moloney +Date: Thu Jul 16 15:45:30 2015 +0100 + + Enable/disable_internal-pullup_with-digitalWrite + + Emulate Arduino pull-up control, by allowing a digitalWrite() on an INPUT pin to toggle the internal pull-up + Signed-off-by: Kevin Moloney + +commit 925ddb77900e4bb8ede5f59daf7656073c81bb2b +Author: Dino Tinitigan +Date: Wed Jul 29 15:01:15 2015 -0700 + + ATLEDGE-224 port avr/pgmspace.h + + many libraries fail to compile because they need avr/pgmspace.h. + Galileo/Edison had the same issue and the same code can be ported over. + +commit 6875a7ffed5d9dd038037148efccc0ef1fe2f2f6 +Author: Kevin Moloney +Date: Wed Jul 15 09:26:12 2015 +0100 + + Bug fix to allow three methods for Serial.Write() + + Signed-off-by: Kevin Moloney + +commit a50e097c7c7d217b4d0b9135a9d2e970f435edcf +Author: Bogdan Pricop +Date: Tue Jul 14 23:05:16 2015 +0100 + + Arduino core functions: pulseIn + + Change pulseIn implementation to be inline with the new time functions + which provide 64 bit timestamps. + + Signed-off-by: Bogdan Pricop + +commit 895d7b94b167cafbd6306ce79942c7f2bc811181 +Author: Dan O'Donovan +Date: Wed Jul 15 14:17:35 2015 +0100 + + Temporary fix is to compile with -O0 instead (optimisation disabled). + Further investigation required. + + Signed-off-by: Dan O'Donovan + +commit 9bf75da8684e5917d343795eb9f1156d28eb89b4 +Author: Bogdan Pricop +Date: Wed Jul 15 12:24:01 2015 +0100 + + libarc32drv_edu.a: Update of pre-compiled driver library. + + Signed-off-by: Bogdan Pricop + +commit 33342070baf9a8b5dadc26d9691499d30461be68 +Author: Bogdan Pricop +Date: Tue Jul 14 20:59:11 2015 +0100 + + Time related Arduino core functions: Re-write + + * Change Timer0 configuration according to Alexandre D'Alton suggestion: + use it as a free-run timer which delivers interrupts every 0xFFFFFFFF + clock ticks and its ISR increments a global variable; in this way a + 64-bit virtual RTC is created. The downside is the delay() function + cannot take advantage of ARc's power management features anymore. + + * Change delay() implementation to make use of 64-bit time-stamp. + + * Change delayMicroseconds to use Timer0 counter value and unsigned + arithmetic's features to handle the overflow case. + The credit goes to Dan O'Dononvan. + + * Add function to get an atomic 64-bit time-stamp. + + * Change millis() and micros() implementation to use the 64-bit time-stamp. + + Signed-off-by: Bogdan Pricop + +commit 7405797b110db61e838dc92141f7d8082b159c3a +Author: Dan O'Donovan +Date: Fri Jul 10 09:45:36 2015 +0100 + + Updates and fixes to Component Framework code for Arduino on ARC + + - Sync'd CFW code with Thunderdome code base from 01-July-2015 + - Fixed issue with mailbox interrupts halting CPU, caused by bug in scss_registers.h + - Added CFW test service client to facilitate CFW sanity check (requires LMT build running Test service) + + Signed-off-by: Dan O'Donovan + +commit cdc73f8e532be8ea3c5791fe575bc30381a6e0dc +Author: David Hunt +Date: Thu Jul 9 14:29:46 2015 +0100 + + Fixed redmine 2150 - inByte variable declaration issue + + Signed-off-by: David Hunt + +commit 4489870248153835baa05bcc6956f0f0f81ffb37 +Author: David Hunt +Date: Thu Jul 9 16:03:43 2015 +0100 + + Remove unneeded main.c from driver library. + + Signed-off-by: David Hunt + +commit ecbe76a8febfd31a8b0f1d3dd30fa6545bafafec +Author: David Hunt +Date: Thu Jul 9 14:01:45 2015 +0100 + + Fixed macro for enabling pullups, plus fixed pin# for IO8 + + Signed-off-by: David Hunt + +commit 3193ffc31ab65125c66337aadef85c6da3d22d2b +Author: Bogdan Pricop +Date: Fri Jul 10 15:52:33 2015 +0100 + + Update of pre-compiled driver library. + + Signed-off-by: Bogdan Pricop + +commit c968b172d1b0ca86936ae34793d701ac2fee778f +Author: David Hunt +Date: Wed Jul 8 17:31:48 2015 +0100 + + Reduced footprint of blink sketch from 65K to 25K by removing call to sprintf + + Signed-off-by: David Hunt + +commit 4fc372ef78d1929fc1ff12d1c1a806c1dc236bdd +Author: Kevin Moloney +Date: Wed Jul 8 15:31:45 2015 +0100 + + Remove hardware loop-back flag set in SPI.begin() + + This was added previously for internal testing, but was not fully removed prior to release + + Signed-off-by: Kevin Moloney + +commit f88353e642f8e88361a055fdecdf8fef3f41e337 +Author: David Hunt +Date: Wed Jul 8 13:54:26 2015 +0100 + + Fix for malloc(), round up to 4k Pages. + + Signed-off-by: David Hunt + +commit 13cd850d73127de56c31945a3e24f78d99ef7f2e +Author: David Hunt +Date: Tue Jul 7 16:19:38 2015 +0100 + + ATLEDGE-158 - Serial.end() not working + + Signed-off-by: David Hunt + +commit 3f3c4c207f1342ffd17e65e0025f4ab8a9e998dc +Author: Kevin Moloney +Date: Mon Jul 6 13:02:12 2015 +0100 + + Modify pin 19's pin description for EVT board + + Signed-off-by: Kevin Moloney + +commit d5bf0344ab8762b716e264eec680970b708f7f1b +Author: Kevin Moloney +Date: Mon Jul 6 12:50:20 2015 +0100 + + Modifify pin 19's pin discription for EVT board + + Signed-off-by: Kevin Moloney + +commit a1d94f84bfa3cb7fa164e79b14ba89227d24dea0 +Author: Bogdan Pricop +Date: Mon Jul 6 14:04:56 2015 +0100 + + ATLEDGE-142: noInterrupt() not working: change delay() behaviour. + + * Change delay() implementation NOT to enable interrupts before putting the + ARC core into sleep state. + * delay() still cannot be called from a "no interrupts" context, but it + doesn't overwrite the user's settings anymore. In this way, if delay() + is called in a no interrupts context, the ARC sleeps for ever. + + Signed-off-by: Bogdan Pricop + +commit de8fab5b63ea28e84055a33b5201d0d44bad0dab +Author: Kevin Moloney +Date: Mon Jul 6 11:46:10 2015 +0100 + + Include Knob example in Servo library + + Signed-off-by: Kevin Moloney + +commit ae93ed8d139f36825dcc80bb705d7066af7415c2 +Author: David Hunt +Date: Thu Jul 2 13:56:13 2015 +0100 + + Shifting out wrong bit index. Should be 7-i instead of 8-i + + Signed-off-by: David Hunt + +commit 57d3d3dae78e31623c5d60a770f90938df6c1a8d +Author: Kevin Moloney +Date: Thu Jul 2 10:02:38 2015 +0100 + + Implement Servo Library for Intel EDU + + Signed-off-by: Kevin Moloney + +commit 7ae6ecfc2fec406ea15f8af6d83fb31c3fe45b6e +Author: Dan O'Donovan +Date: Thu Jul 2 13:07:37 2015 +0100 + + SPI library implementation for Intel EDU + + The following functions/features have been implemented: + + * Standard SPI API: + - SPI.begin() + - SPI.setClockDivider() + - SPI.setDataMode() + - SPI.transfer() (single-byte and multi-byte versions) + - SPI.transfer16() + - SPI.end() + * SPI Transaction API + - SPI.beginTransaction() + - SPI.endTransaction() + - SPI.usingInterrupt() + - SPI.notUsingInterrupt() + * New Intel EDU specific API functions + - SPI.transfer24() + - SPI.transfer32() + + Known issues/limitations: + * LSBFIRST bit order not supported in hardware, requires (slower) software emulation + * SPI Transaction API has not been fully tested at time of writing + + Signed-off-by: Dan O'Donovan + +commit 1cdc4f0688be19e32396d50e731ff3cf16b7d8a6 +Author: Bogdan Pricop +Date: Tue Jun 30 15:27:49 2015 +0100 + + Update source code with WRS restrictive license headers + + * Delete arcv2_timer1.[c|h] driver - not used at this stage. + * arcv2_timer0 driver: update license header to WRS permissive license; + arcv2_timer0.h doesn't exist anymore in the latest Tiny Mountain source + code, but we use it, stick in the same WRS permissive license header. + * For linker.cmd and flsh.ld linker scripts: replace license header with + the WRS permissive one fomr the original linker.cmd files from + Tiny Mountain OS + * aux_regs.h - derived work from aux_reg.h from Tiny Mountain OS; + change license header to WRS permissive. + * remove license header as in the original files from thunderdome code + base: compiler.h, portable.h + + Signed-off-by: Bogdan Pricop + +commit c338e4b94124bb619896e8a8c80217e790717ca7 +Author: Kevin Moloney +Date: Wed Jun 17 11:02:39 2015 +0100 + + ADC Optimization (clock ratio) + + Signed-off-by: Kevin Moloney + +commit 98fdd4c83861e084c7819d08c3f90e8600675bc6 +Author: Kevin Moloney +Date: Tue Jun 30 14:22:47 2015 +0100 + + Arduino core functions: tone/noTone implementation.. + + * tone/noTone implemented using ARC's Timer1. + + Signed-off-by: Kevin Moloney + +commit 32ae6276ac86dd24961eb010297e2239b5ee8b80 +Author: Bogdan Pricop +Date: Fri Jun 26 15:43:49 2015 +0100 + + Arduino core functions: pulseIn(pin, value, timeout) + + Implementation of pulseIn() Arduino core function using GPIO interrupts + and micros() for time-stamping. + NOTES: + * The performance is not as good as on Arduino UNO. It should be + re-measured after following optimisation: + * Enable FIRQ (Fast Interrupts) on ARC. + * Optimise the GPIO interrupts + * Optimise the Timer0 interrupt + * Empirical measured accuracy is 10 microseconds. + + Signed-off-by: Bogdan Pricop + +commit cbc40d38c6cd1ef5e433e378c99cc95f19e31fc9 +Author: Dino Tinitigan +Date: Fri Jun 26 16:18:29 2015 -0700 + + Update sketchUploader version + + Updated sketchUploader version in platform.txt + +commit 875ec047d28c3059ca215e261bd28f780d0b48d5 +Author: David Hunt +Date: Fri Jun 26 13:59:13 2015 +0100 + + Change to see new VID/PID for ACM devices for baud change reset + + Must be used with firmware that presents 8087:0A9F as PID/VID + + Signed-off-by: David Hunt + +commit 11dfe699887f47f65276f880b5a4aaa01f282baa +Author: Bogdan Pricop +Date: Tue Jun 23 17:56:55 2015 +0100 + + ATLEDGE-75 - Time: micros() + + * Re-write micros() function in assembly for a 15-20% performance + increase. It should take less than a microsecond now. + + Signed-off-by: Bogdan Pricop + +commit 39eb85ad388a7324a24bb17598e2b6b745f209ab +Author: Kevin Moloney +Date: Tue Jun 23 12:44:16 2015 +0100 + + ATLEDGE-84 - Interrupt framework: make interrupt.h C++ compatible. + + Signed-off-by: Kevin Moloney + +commit 63f6a7698502e7b14798e261be1f2407e06e6a5f +Author: Bogdan Pricop +Date: Wed Jun 17 11:01:10 2015 +0100 + + ATLEDGE-82 - ARC Init: Re-enable I-CACHE + + Enable Instruction cache and invalidate it after interrupt unit device + initialisation + +commit 7f98355166f010b00a64cbf7a949b84d96bec05a +Author: David Hunt +Date: Thu Jun 18 14:13:17 2015 +0100 + + updated pre-compiled driver library. + + Signed-off-by: David Hunt + +commit 653e96c9d9b206297d5c631180c41b4cb13e2860 +Author: David Hunt +Date: Thu Jun 18 13:58:40 2015 +0100 + + ATLEDGE-27 - Wire (i2c) Library - Moving header files. + + Signed-off-by: David Hunt + +commit 31e4e972141524297a096b38d067593a72af5f6e +Author: Bogdan Pricop +Date: Wed Jun 17 10:50:00 2015 +0100 + + ATLEDGE-75 - Time : delayMicroseconds + + Implement delayMicroseconds function in Assembly and using the ARC's + instructions timing as a reference. + The instruction's timing was computed with a scope and using infinite + loops, meaning the code most likely used the advantage of ARC'c cache. + + Function's accuracy is +- 0.15 microseconds in the above stated conditions. + The accuracy can be affected by cache miss annd/or interrupts handling. + It doesn't disable interrupts and it doesn't use any of the SoC power + management features. + + Signed-off-by: Bogdan Pricop + +commit c165e1c12c3918f7dd7e10e05be9550b9fbf1777 +Author: David Hunt +Date: Thu Jun 18 10:20:57 2015 +0100 + + ATLEDGE-27 - Wire (i2c) Library + + Signed-off-by: David Hunt + +commit 648ca2ebcced299f53485e384ea590ff033aafc7 +Author: David Hunt +Date: Tue Jun 16 09:43:33 2015 +0100 + + Updated licence headers according to latest files from Intel. + + Signed-off-by: David Hunt + +commit 4c3f58a7e39ee3da55e83d104897b5abdf60c76f +Merge: c2b4f74 d7c5a80 +Author: David Hunt +Date: Tue Jun 9 16:29:48 2015 +0100 + + ATLEDGE-82 - merge in change of start address for arc code + + Signed-off-by: David Hunt + +commit d7c5a80233d7f574f9060d49f26f102634a50a64 +Author: Bogdan Pricop +Date: Tue Jun 9 15:27:14 2015 +0100 + + ATLEDGE-82 - Init: Change linker scripts + + Modify the start address and the size of the flash area allocated for + ARC core, according to ATLASEDGE/WEEKLY/WW23 tag + +commit c2b4f74efc0cafe3ad4aebd365b2457284a7dafe +Merge: b408ea9 a801dd7 +Author: David Hunt +Date: Tue Jun 9 15:16:08 2015 +0100 + + Merge branch 'fix_1999' - fix for INPUT_PULLUP + + Signed-off-by: David Hunt + +commit b408ea97cbd30aae038381f930995b0f3869702e +Merge: d45290e 539a7c2 +Author: David Hunt +Date: Mon Jun 8 14:20:29 2015 +0100 + + feat_irq_uart: Merged serialEvent() functionality. + + Signed-off-by: David Hunt + +commit 539a7c26495321edae81804e9432a5d0c7f88fbb +Author: David Hunt +Date: Mon Jun 8 13:48:55 2015 +0100 + + feat_irq_uart - Added in serialEvent() functionality + + Signed-off-by: David Hunt + +commit a801dd73b1e5eb41a0bcdb3c50b5a5691ede8f9e +Author: Dan O'Donovan +Date: Mon Jun 8 13:48:20 2015 +0100 + + INPUT_PULLUP doesn't appear to enable an internal pull-up resistor + + Incorrect register base address used by SET_PIN_PULLUP macro in + scss_registers.h to enable/disable internal pull-ups + + Signed-off-by: Dan O'Donovan + +commit d45290e31df7def5c65e1951bd8d3e69347b3843 +Author: David Hunt +Date: Fri Jun 5 13:49:06 2015 +0100 + + Update of precompiled driver library + + Signed-off-by: David Hunt + +commit 88baee7283dc174131c42b7d0256753f6ee9a906 +Merge: ac134d6 79d1ab1 +Author: David Hunt +Date: Fri Jun 5 11:22:49 2015 +0100 + + ATLEDGE-84 - Interrupt framework + + Arduino functions implemented: + * attachInterrupt(Arduino_Pin, handler, mode): + * it works for all Arduino GPIO (IO0 - IO19) + * CHANGE mode is supported only for SoC GPIOs (hardware limitation: + SS doesn't support interrupt generation on both rising and falling + edges.) + * detachInterrupt() + * interrupts() + * noInterrupts() + + Above functions behaviour is according to Arduino website description. + For details please see below references: + http://www.arduino.cc/en/Reference/AttachInterrupt + http://www.arduino.cc/en/Reference/DetachInterrupt + http://www.arduino.cc/en/Reference/Interrupts + http://www.arduino.cc/en/Reference/NoInterrupts + + This implementation uses ss_gpio and soc_gpio drivers from thunderdome. + + Signed-off-by: Bogdan Pricop + +commit 79d1ab16a6687015893a83f8bba079fff0e3be6e +Author: Bogdan Pricop +Date: Fri Jun 5 10:36:30 2015 +0100 + + ATLAEDGE-84: Interrupt framework + + Arduino functions implemented: + * attachInterrupt(Arduino_Pin, handler, mode): + * it works for all Arduino GPIO (IO0 - IO19) + * CHANGE mode is supported only for SoC GPIOs (hardware limitation: + SS doesn't support interrupt generation on both rising and falling + edges.) + * detachInterrupt() + * interrupts() + * noInterrupts() + + Above functions behaviour is according to Arduino website description. + For details please see below references: + http://www.arduino.cc/en/Reference/AttachInterrupt + http://www.arduino.cc/en/Reference/DetachInterrupt + http://www.arduino.cc/en/Reference/Interrupts + http://www.arduino.cc/en/Reference/NoInterrupts + + This implementation uses ss_gpio and soc_gpio drivers from thunderdome. + + Signed-off-by: Bogdan Pricop + +commit ac134d6f742532d9c43783b29c5d145ab8306054 +Merge: 77d7a18 d7cbbf4 +Author: David Hunt +Date: Fri Jun 5 10:09:17 2015 +0100 + + ATLEDGE-14 - Added wiring-shift functionality + + shiftIn() and shiftOut() + + Signed-off-by: David Hunt + +commit d7cbbf4f4bb3abee46f887ee8adbcb9e851594c9 +Author: davids +Date: Fri Jun 5 09:23:44 2015 +0100 + + implement wiring_shift.c() + +commit da2e44848abcb12f4f6c9a891a55425b330fdb25 +Author: davids +Date: Thu Jun 4 15:20:53 2015 +0100 + + implement wiring_shift() + +commit 77d7a180c96bb25b69cc82de14e37104dcc77707 +Merge: de3666c 941f594 +Author: David Hunt +Date: Thu Jun 4 14:44:52 2015 +0100 + + ATLEDGE-83 - Integrating Component Framework IPC with Arduino run-time lib + + Signed-off-by: David Hunt + +commit de3666c598909ffd19079a6e5390559e3435812b +Merge: 59634af 325da1d +Author: David Hunt +Date: Thu Jun 4 14:27:36 2015 +0100 + + ATLEDGE-15 - Analog In functions + +commit 941f594f9fbdc201af1539678e3cd30c9dc8b09d +Author: Dan O'Donovan +Date: Wed Jun 3 10:25:40 2015 +0100 + + cfw: Integrating Component Framework IPC with Arduino run-time lib + + Adding glue layer to initialise CFW and enable interrupt-driven + handling of received messages from LMT core + + Signed-off-by: Dan O'Donovan + +commit cdf2107957c9c8d17ee0667cb754a31d242c75a5 +Author: davids +Date: Thu Jun 4 11:35:13 2015 +0100 + + implement wiring_shift() + +commit 325da1ded53cd4a533c7cd4c2782fa3fbe1dc30c +Author: Kevin Moloney +Date: Thu Jun 4 03:35:04 2015 -0700 + + analogRead fixes + +commit 57310fed13bdf80a77a24b663925ff28b4595bc2 +Author: Kevin Moloney +Date: Thu Jun 4 03:15:40 2015 -0700 + + analogRead fixes: + + Signed-off-by: Kevin Moloney + +commit 59634aff378b89deb36041d94aed7132e5588b37 +Merge: e60cba4 530ba96 +Author: David Hunt +Date: Thu Jun 4 10:17:03 2015 +0100 + + ATLEDGE-76 - Serial functions, addition of interrupt handling + +commit 530ba96203602f7743aac12175c08e4b5ddf0209 +Author: David Hunt +Date: Thu Jun 4 09:52:07 2015 +0100 + + feat_irq_uart: minor changes after code reviews + + Signed-off-by: David Hunt + +commit f0b0954a09cf5808fa87abf8052a088f5ee5e5bd +Author: davids +Date: Wed Jun 3 17:42:21 2015 +0100 + + implement wiring_shift() + +commit 65e2c057260887613e173a274bb439c92bb8141c +Author: Kevin Moloney +Date: Wed Jun 3 07:24:48 2015 -0700 + + adc: Implement analogRead() + + Signed-off-by: Kevin Moloney + +commit acde269f698e087f6e2d23f498576c720dc91c07 +Author: David Hunt +Date: Wed Jun 3 11:19:39 2015 +0100 + + feat_irq_uart: enable UART interrupt handling + + Signed-off-by: David Hunt + +commit e60cba4bcb0e03c4fd8158d9b1226c023e016f19 +Author: David Hunt +Date: Thu May 28 13:56:49 2015 +0100 + + feat_strings: add -fno-exceptions for C++ code to remove linker errors + + Signed-off-by: David Hunt + +commit 81123d478ae1747a9f1148c0270395d95ba62ef8 +Author: David Hunt +Date: Thu May 28 12:03:33 2015 +0100 + + feat_strings: Compiler & linker flags for String builds + + Signed-off-by: David Hunt + +commit d72c26f1c38ef35556dd1faf832b0be8e9c7dd60 +Merge: 07a494f d1289bb +Author: Bogdan Pricop +Date: Wed May 27 18:05:56 2015 +0100 + + ATLEDGE-82: Init - change ARC memory layout. + + * Change start address and size of the Flash area allocated to the ARC core + according to new memory layout received from Toulouse. + + Signed-off-by: Bogdan Pricop + +commit d1289bbdbfdad34ecac16de752237aba65a942ef +Author: Bogdan Pricop +Date: Wed May 27 09:06:25 2015 +0100 + + ATLEDGE-82: Init - change ARC memory layout. + + * Change start address and size of the Flash area allocated to the ARC core + according to new memory layout received from Toulouse. + + Signed-off-by: Bogdan Pricop + +commit 07a494f00158248b1100ad4ba1e240ad0221bfc0 +Author: David Hunt +Date: Thu May 21 15:43:55 2015 +0100 + + Adding updated pre-compiled driver library. + Cleaning up after code reviews and validation of build. + + Signed-off-by: David Hunt + +commit e77ff7a37c2bd3a00199471cbc328d7bf338b87b +Author: David Hunt +Date: Thu May 21 14:08:03 2015 +0100 + + Updated due to code reviews + + * Fix delay() issue + Issue: If value of microsecond is Timer0 limit, arcv2_timer0_count_get() + microseconds condition will always be true, spinning for ever. + The main issue is that the time between 2 consecutive readings of + COUNT0 register is around 90 ticks and the Timer may overflow + before the next reafing of COUNT0 if last values read > LIMIT - 90. + Fix: Take in consideration the number of overflows. If TIMER0 overflows + just leave the loop (even if COUNT0 < microseconds) + * Restructure a bit arcv2_timer0_enable() function in order to reflect the + procedure described in chapter 3.3.76.1 of DesignWare ARCv2 ISA + Programmer's Reference Manual. + Make sure Timer0 initialisation clears the counter register as well. + * code review - added yield via hooks.c + * added back in strip stage when building + * Remove unused code in os.h, os_types.h and pf_init.h + * Uncomment call to yield() from delay() Arduino function; yield() is + added for sake of compatibility. + * Remove dead code from timer0 init function. + * Commented out enable instruction cache + * Added Copyright header to wiring.c + * Setup automatic (hardware) context saving feature for non-fast interrupts + * Serial Communication API Initial checkin of Serial.read() and Serial.write() + using header pins 0 and 1 + * Eliminated some compiler warnings. + + Signed-off-by: David Hunt + +commit c4fad8ecba577bfd28171c31b14aab47a465754a +Merge: 9ec6faf e187e5e +Author: David Hunt +Date: Tue May 19 14:05:37 2015 +0100 + + ATLEDGE82 init code + + small cleanup around interrupt init code. + + Signed-off-by: David Hunt + +commit e187e5ed742bd85ecafa6cde5dfa3ad35ec90bb9 +Author: Dan O'Donovan +Date: Tue May 19 13:42:45 2015 +0100 + + ATLEDGE-82 init code + + Minor tidy-up to interrupt init code + + Currently, timer init functions enable global interrupts. This should + be done in the interrupt setup code during the chip init sequence. + + Signed-off-by: Dan O'Donovan + Signed-off-by: David Hunt + +commit 9ec6fafc1665504fe90fc99623f1348267caeed9 +Author: David Hunt +Date: Tue May 19 13:13:45 2015 +0100 + + ATLEDGE-82 init code + + final cleanup before push. no functional changes. + +commit d37176a3b8483127244c5c72bad861ef4598d756 +Author: David Hunt +Date: Tue May 19 12:56:33 2015 +0100 + + ATLEDGE-82 init code + + Interrupt handling - add hw context saving + + * Disable instruction cache (we don't need it at this stage) + * Setup automatic (hardware) context saving feature for non-fast + interrupts. + * Set optimization to none (-O0) in Makefile. + + build: Eliminating compiler warnings + + Fix interrupt handling bug + + Issue: + A simple blink sketch having a 10 ms delay between blinks crashed + after a few seconds. + It looks like the stack got corrupted. + Root cause: + The generic assembly hardware ISR, "_do_isr", was not properly + written; the "sp" was not properly handled. + Solution: + Replace the assembly hardware ISR with a C function having + "__attribute__((interrupt("ilink")))" + + Note: + We need this generic hardware ISR because the IVT is in flash and + we cannot change it at runtime. + + Allocating more SRAM to ARC (syncing with latest Thunderdome mem allocation) + + build: Removing sdata section declaration from linker scripts + + ARC doesn't support an SDATA section bigger than 1024 bytes, and + we overflow this too easily when we link in code that hasn't been + compiled with the -mno-sdata compiler flag. So we will ensure that + we only use code compiled with -mno-sdata (including standard C lib) + and we remove this section declaration to weed out any exceptions to this. + In other words, if we link any code that tries to use the sdata section, + we will see a linker error. + + build: Adding HEAP section + + Adding heap section with start/end marker symbols to satisfy + malloc() and friends + + Signed-off-by: David Hunt + +commit d4fe5885d8e2bebd071e4e7d378d3fbf8e85a2eb +Author: Bogdan Pricop +Date: Mon May 18 11:12:35 2015 +0100 + + ATLEDGE-82 init code + + Interrupt handling - add hw context saving + + * Disable instruction cache (we don't need it at this stage) + * Setup automatic (hardware) context saving feature for non-fast + interrupts. + * Set optimization to none (-O0) in Makefile. + + Signed-off-by: Bogdan Pricop + Signed-off-by: David Hunt + + Author: Bogdan Pricop + +commit 82c3529091c7c2d1f13d1d55c3d31cdf0aa56840 +Author: Dan O'Donovan +Date: Fri May 15 16:25:07 2015 +0100 + + ATLEDGE-82 init code for arc + + Eliminating compiler warnings and cleanup. + + Signed-off-by: Dan O'Donovan + Signed-off-by: David Hunt + + Conflicts: + system/libarc32_edu/drivers/ns16550.c + system/libarc32_edu/drivers/uart.h + system/libarc32_edu/main.c + +commit 4a29f5c30fb52e433f30c1ab7ba30244953e2d05 +Author: Dan O'Donovan +Date: Fri May 15 14:46:08 2015 +0100 + + cfw: Importing Component Framework library code from Thunderdome + + Framework code extracted from the following commit ID in + Intel's thunderdome git repo: 8b198659675cd820072bdeb00d0c5de87c6f6ee2 + + This brings the necessary library code into the source tree, but not + yet integrated in the Arduino run-time environment (to follow shortly). + + Signed-off-by: Dan O'Donovan + +commit c2f3e0413c6e1c4567faedd5b2e7a8308fc8c42e +Author: Bogdan Pricop +Date: Fri May 15 14:24:10 2015 +0100 + + ATLEDGE-82 init code - Fix interrupt handling bug. + + Issue: + A simple blink sketch having a 10 ms delay between blinks crashed + after a few seconds. + It looks like the stack got corrupted. + Root cause: + The generic assembly hardware ISR, "_do_isr", was not properly + written; the "sp" was not properly handled. + Solution: + Replace the assembly hardware ISR with a C function having + "__attribute__((interrupt("ilink")))" + + Note: + We need this generic hardware ISR because the IVT is in flash and + we cannot change it at runtime. + + Signed-off-by: Bogdan Pricop + Signed-off-by: David Hunt + +commit 723be266ea682a413efca74e5b69190e17bf2a65 +Author: Dan O'Donovan +Date: Fri May 15 14:49:26 2015 +0100 + + Allocating more SRAM to ARC (syncing with latest Thunderdome mem allocation) + + Signed-off-by: Dan O'Donovan + +commit b9bc0fb221574f5f5a52abfa1d9d2b3da85fc1ba +Author: Bogdan Pricop +Date: Tue May 12 21:31:11 2015 +0100 + + .gitignore file added to repo. + + Signed-off-by: Bogdan Pricop + +commit bd205779390d879a5e866941b840e5094204c97c +Author: Dan O'Donovan +Date: Tue May 12 17:47:54 2015 +0100 + + build: Adding HEAP section + + Adding heap section with start/end marker symbols to satisfy + malloc() and friends + + Signed-off-by: Dan O'Donovan + +commit 4139a2efcdee1b210933b7abeee2bea084d1b369 +Author: David Hunt +Date: Tue May 19 12:06:17 2015 +0100 + + ATLEDGE-75 Arduino time related functions. + + A first draft for the following functions: + * delay() + * millis(); + * micros(); + Not yet implemented: + * delayMicroseconds. + + Author: Bogdan Pricop + + Signed-off-by: Bogdan Pricop + Signed-off-by: David Hunt + +commit 3689741b718ce769a50515d661a7ebf13cf733be +Author: David Hunt +Date: Tue May 19 11:58:55 2015 +0100 + + ATLEDGE-24 Serial Communication API + + Intial release of serial functionality, Serial.write, print, println, read + Also added files required, Ringbuffer (not used yet), Print, etc. + Also some small changes to make Intel toolchain work, still more work needed. + + Signed-off-by: David Hunt + +commit 57550ebb85d6f69dc52cefcf38f47a7995f708b3 +Author: David Hunt +Date: Tue May 19 11:52:19 2015 +0100 + + ATLEDGE-83 Component Framework integration into bare metal + + Author: Dan O'Donovan + Date: Fri May 15 14:46:08 2015 +0100 + + Framework code extracted from the following commit ID in + Intel's thunderdome git repo: 8b198659675cd820072bdeb00d0c5de87c6f6ee2 + + This brings the necessary library code into the source tree, but not + yet integrated in the Arduino run-time environment (to follow shortly). + + Signed-off-by: Dan O'Donovan + Signed-off-by: David Hunt + +commit ed4bf0214f53df5b8c255ed6f575fcdc6bf361d3 +Author: David Hunt +Date: Tue May 19 11:48:40 2015 +0100 + + ATLEDGE-15 basic analog functions + + Adding analogWriteResolution and analogReadResolution + + Signed-off-by: Dan O'Donovan + Signed-off-by: David Hunt + +commit 32aff42d8023cafcb6b5b86820e455b1914ecf55 +Author: David Hunt +Date: Wed May 6 17:14:51 2015 +0100 + + ATLEDGE-62 Create Initial Release of Arduino Corelibs + + Adding licence headers to those files that don't have any. + + Signed-off-by: David Hunt + +commit 09a6c2ea91c99a7f8e3aff45cb4bc7f3e501a715 +Author: David Hunt +Date: Wed May 6 14:50:40 2015 +0100 + + ATLEDGE-62 Create Initial Release of Arduino Corelibs + + Allows Arduino IDE to build Blink Sketch + Includes pinMode(), digitalWrite() and delay() + Allows download via JTAG + + Signed-off-by: David Hunt + +commit a5ca45cc6a31e8775363fa6c3f0c32e337945a43 +Author: Dino Tinitigan +Date: Thu Apr 16 14:05:33 2015 -0700 + + Initial commit of core files + + Initial commit of core files + +commit 631d399bf35241b823ae74b3b4dc6b27d303078e +Author: Calvin Park +Date: Thu Apr 16 13:29:04 2015 -0700 + + Initial commit From 8c5268a6a0a1b797321a80aa73dab233e74056c0 Mon Sep 17 00:00:00 2001 From: Yashaswini Hanji Date: Thu, 16 Mar 2017 12:58:35 -0700 Subject: [PATCH 43/91] cleanup unwanted file --- tatus | 4812 --------------------------------------------------------- 1 file changed, 4812 deletions(-) delete mode 100644 tatus diff --git a/tatus b/tatus deleted file mode 100644 index 0bf5a18c..00000000 --- a/tatus +++ /dev/null @@ -1,4812 +0,0 @@ -commit 178bb5f58570f9e71b7423940c11e4d6d97e8f1a -Author: Dino Tinitigan -Date: Wed Feb 22 14:08:30 2017 -0800 - - CDC-ACM CODK-M firmware compatibility changes - - -compatibility changes for CDC-ACM usb serial to work with upcoming - CODK-M based firmware - -use a fixed delay between writes instead of trying to mimick UART - throttling - -commit ee08a03b21d5c141020b328974c2392a8484dfa9 -Author: Erik Nyquist -Date: Fri Jan 27 16:28:38 2017 -0800 - - Use single dataReady() method, instead of accelDataReady/gyroDataReady - - This method is a bit more flexible. There is a version with no - parameters, which will return true if all enabled sensors have new - data. There is one overload, that takes a single 'flags' parameter, - which returns true if all enabled *and* selected sensors have new data. - Sensors are selectable through bit flags. For example; - - CurieIMU.dataReady() : this will return true if both the accel and gyro - are enabled, and both have new data ready. - - CurieIMU.dataReady(ACCEL | GYRO) : this will return true if both the - accel and gyro are enabled, and both have new data ready. - - CurieIMU.dataReady(GYRO) : this will return true if the gyro is - enabled and has new data ready. - - CurieIMU.dataReady(ACCEL) : this will return true if the accel is - enabled and has new data ready. - - This also involved changing the 'begin' method to allow selective - enabling of sensors, e.g. - - CurieIMU.begin() : same as it always has, initializes IMU, enabling - both accel and gyro - - CurieIMU.begin(ACCEL | GYRO) : initializes IMU, enabling both accel - and gyro - - CurieIMU.begin(ACCEL) : initializes IMU, enabling accel only - -commit fb578000afad9bc5cdf74358e8c3acbc7a04f9e8 -Author: Sidney Leung -Date: Wed Feb 15 22:28:08 2017 -0800 - - Jira 792, Support addition UUID types, git PR 386. - - Features added: - - 1. Add the support for two addition UUID types, - UUID16_SOME and UUID128_SOME. These types, - practically, behaves the same as their related - ALL types. Sandeep found that the Apple devices - made use of these additional types and requested - for their support. - - File mods: - - 1. BLEDeviceManager.cpp: - - Add UUID16_SOME and UUID128_SOME at places - checking for UUID types. - -commit f61091473e5888337098a103daccf321e3fe328c -Author: lianggao -Date: Wed Feb 8 10:59:09 2017 +0800 - - Jira 804 BLE Characteristic initialization issue, git 366 - - Issue: - - Created Characteristic failed to reflect the initialized - value. - - Root cause: - - During initialization, the length field was incorrectly - skipped over. - -commit ff32c97b547b42e8afa3e423c7ad9ddf4057b4dd -Author: lianggao -Date: Tue Dec 20 18:21:23 2016 +0800 - - BLE Peripheral cannot discover Central attributes - - 1. Add test sketches discoveratperipheral.ino and profileatcentral.ino - 2. Modify BLEDeviceManager.cpp to add central to profile buffer in peripheral - role. - -commit d6c68f26914bf9508e8b76081d383a5cd432c7b6 -Author: Erik Nyquist -Date: Tue Feb 14 12:40:25 2017 -0800 - - flash.ld: fix mis-aligned .data section - - The end of the .data section in flash must be explicitly word-aligned, - otherwise corruption can occur in a .data section that happens to contain - non-word aligned data. - -commit 0285190f5d94dd2228a33ec5ef91d0e3cecfed56 -Author: Erik Nyquist -Date: Thu Feb 9 10:18:37 2017 -0800 - - EEPROM.cpp: Use double quotes for include file - - works in the Arduino IDE, but it's not actually in a system - include location so it makes non-IDE (i.e. Klocwork) builds fail - -commit 547ecd723e39da4044cb636d6bdbb8956cb2f2f2 -Author: lianggao -Date: Fri Jan 13 09:04:29 2017 +0800 - - Sketch crash using both Firmata and BLE library, gitHub issue #377 - - 1. The BLEStream object adds profile when boot but the HW doesn't be - initialized and makes APP crash. - 2. Change the BLE initial process not depend on HW. Buffer the - attributes if HW not initialized. - 3. Changed files - libraries/CurieBLE/src/BLEDevice.h - expose constructor - libraries/CurieBLE/src/BLEPeripheral.cpp - not call HW init function - libraries/CurieBLE/src/internal/BLEDeviceManager.cpp - change init order - libraries/CurieBLE/src/internal/BLEProfileManager.cpp - change constructor - -commit fe14b8bd2600544330e95ccf22f7f91c114467c0 -Author: lianggao -Date: Mon Feb 6 14:13:37 2017 +0800 - - Fix #380 characteristic written returns incorrect value after first connect - - 1. Not set the flage when local device try to set the value. - 2. Changed file - libraries/CurieBLE/src/internal/BLECharacteristicImp.cpp - -commit 0eac6a00a766e424b87aecbbb734eb76bcb71694 -Author: lianggao -Date: Fri Jan 13 22:07:08 2017 +0800 - - Jira 794 Inconsistent writeInt() result with different Peripherals, git 385 - - Root cause: - - As a Central, the write() operation can produce two different - commands to a Peripheral depending on the Characteristic. - - One command is a simple write without aknowledgement from - Peripheral and the other requires a complete handshake for - each write operation. - - Root cause of the issue was that the function, - BLECharacteristicImp::write(), did not check the - characteristic property to determine if the caller requires - a response. It just treats all calls do not require a - response. - - Feature added: - - For write with respond from Peripheral, it is now a - blocking call (it also satisfied Arduino's request). - - Modifications: - 1. libraries/CurieBLE/src/internal/BLECallbacks.cpp: - - ble_on_write_no_rsp_complete: CB to process Peripheral - Response to complete a write operation. - 2. libraries/CurieBLE/src/internal/BLECallbacks.h: - - Function definition added. - 3. libraries/CurieBLE/src/internal/BLECharacteristicImp.cpp: - - In function write(), check the characteristic property to - determine whether the call requires a response. - - Added a flag to signal the waiting on Peripheral - Response for a write operation. - - Write with response is now a blocking call. - 4. BLECharacteristicImp.h: - - Prototyping. - -commit 40b0c43967187137c9bde6bf88f57732a8a30aa4 -Author: lianggao -Date: Mon Jan 9 10:50:13 2017 +0800 - - Jira 797, Central can scan with MAC address, git 376 - - New feature: - - Add the capability for a Central to scan for a - Peripheral using its MAC address. - - Code Modifications: - - Added the API for MAC address scanning. - - For Device Manager, added provision for holding the - MAC address of a Peripheral. - - For scan discovery handler, added the checking - for MAC address comparison, if MAC address scanning - is requested. - - File changes: - - 1. libraries/CurieBLE/src/BLEDevice.cpp: - - Added API for MAC address scanning. - 2. libraries/CurieBLE/src/BLEDevice.h: - - API definition. - 3. libraries/CurieBLE/src/internal/BLEDeviceManager.cpp: - - Added provision for storing the MAC address. - - Added MAC address comparison in the scan discovery - handle if MAC address scanning is selected. - 4. libraries/CurieBLE/src/internal/BLEDeviceManager.h: - - Prototyping. - -commit 78c3d0ad0a5475f7809d31dfd1c2d75cbcf4a58c -Author: Erik Nyquist -Date: Thu Feb 2 13:49:50 2017 -0800 - - EEPROM library: move function definitions into separate .cpp files - -commit 001cab44592510cf9ea799d7a6f34d237d5b149c -Author: Erik Nyquist -Date: Wed Feb 1 11:36:59 2017 -0800 - - freeMemory.ino: add introductory comment - -commit b60860237540cde903b81615c3324f47f03cd756 -Author: Erik Nyquist -Date: Tue Jan 10 15:18:27 2017 -0800 - - Add new library MemoryFree - - This is the MemoryFree libary from - http://playground.arduino.cc/code/AvailableMemory, rewritten specifically - for Arduino 101 and tinyTILE. It provides some functions for querying - available stack & heap space. - -commit 29daefb64ae643a0cb2bcb15b586e90a206bf7e8 -Author: Dino Tinitigan -Date: Tue Jan 10 10:24:15 2017 -0800 - - add support for Power Management library - -commit cd3215bd5929dd83004cdf3b94e32726ff2eba2e -Author: Dino Tinitigan -Date: Tue Jan 10 10:17:13 2017 -0800 - - expose all AON-GPIOs - - -expose AON-GPIOs since they are available on the TinyTILE - -commit 90e8bc65828a7e65f5a59d9a64c3db7df185e0a3 -Author: Dino Tinitigan -Date: Tue Jan 10 09:55:59 2017 -0800 - - shared memory structure changes for CODK-M - - -added struct for ipm using shared memory - -added cdc-acm buffer space on shared memory which is used by the new firmware - -commit 7c97231c087929a90ae880486b3c0ce539a9b326 -Author: Erik Nyquist -Date: Tue Jan 10 10:31:56 2017 -0800 - - CurieIMU.cpp: initialize saved accel/gyro ranges in begin() - - This ensures that "read[Accelerometer/Gyro]Scaled()" will work as - expected even if a range has not been explicitly set using the API - -commit 17d2e2fb22ba0cd239c46973cca0006704534195 -Author: Erik Nyquist -Date: Mon Jan 9 10:55:34 2017 -0800 - - Rebuild libarc32drv_arduino101.a - -commit 5d91dc66fe0f49ab5cb9d5dc7459a9abba5ea7de -Author: Erik Nyquist -Date: Thu Dec 29 17:57:17 2016 -0800 - - libarc32_arduino101/Makefile: Add 'strip' target - - The file libarc32drv_arduino101.a is built with debugging symbols by - default, however the version we ship needs to be stripped. The new - "strip" target makes it easy for us to strip when committing, and - the default target still behaves the same way, so the library can be - re-compiled for debugging purposes - -commit 4ae5af7f8a63dfaa9d44b35c0c820d93a4a6980e -Author: Noel Paz -Date: Thu Dec 22 13:24:24 2016 -0800 - - Corrected the MIDIBLE example so it advertises correctly - -commit 621949108d0c3def12722b626b57176d10425863 -Author: noelpaz -Date: Wed Dec 21 17:10:09 2016 -0800 - - Modified SensorTag example and added examples derived from 1.0.7 - -commit 2391f48210995aa34fc20e62745811aeaaa0bd7d -Author: Sidney Leung -Date: Wed Dec 21 00:48:55 2016 -0800 - - Moving balloc static memory buffer to DCCM memory - - balloc() is used by interrupt context code for memory allocation. The memory space is statically allocated at - initialization. In order not to take up SRAM memory, this buffer is moved to the DCCM memory space. - -commit 34d0e50135f9e0baff349fe116f92d049e9f97c9 -Author: Sidney Leung -Date: Tue Dec 20 13:11:21 2016 -0800 - - I2S example sketches failed compliation, Jira 786. - - The latest BLE library consumes more heap space that causes these sketches ran out of heap space for their temporary - buffers. For now, the size of the tempporary is reduced. For the near future, there are 3 improvements to address - this issue. The BLE library will be making use of the DCCM memory instead of heap. The I2S library buffering space - is going to the DCCM memory too. The heap space will be increased to maximize the usage of the entire SRAM sapce. - -commit 4c89a183f8e509c3f7c08a589a291ebb91ee171e -Author: lianggao -Date: Mon Dec 19 14:59:55 2016 +0800 - - Add test sketches - -commit ade23f0c2c064b733a1c3d264eb29e1a608f8745 -Author: lianggao -Date: Mon Oct 17 16:11:18 2016 +0800 - - Arduino BLE new library - - 1. Add new library - - 2. Add BLEPeripheral library back compatible features - - 3. Fix IMU build issue - - 4. Fix the memset crash issue - i. The FIRQ doesn't save the LP_COUNTER register. - ii. Update the code to save LP related register - - 5. Fix the central crash issue when peripheral disconnect - - 6. Revert the UART changes - -This change will break the BLE's communication - - 7. Implement the balloc to replace old one - -Create memory pool - -Port V3's balloc - -Fix the local name display unexpected chars - - 8. Fix ScanCallback, LED related issue - -The Serial.print called in interrupt and interrupt block the Serial interrupt. - -The resource not released when call disconnect API. - - 9. Fix the discover blocked when connect/disconnect the link successively - - Block the disconnect if not receive the disconnect event - - 10. Return error when discover attributes if error happened - - 11. Update the back compatible comments - - 12. Fix the discover attribute failed issue - -Add the -fcheck-new build option - -Increase the IRQ stack size - - 13. Add discoverAttributesByService API - - The sensorTag has many services and RAM is not enough for discover all services - -This crash caused by bt_uuid_16 and bt_uuid_128 has different space and makes an address exception - - 14. Add keywords and fix read issue - - 15. Update the CurieBLE and delete BLE - -commit 431c7812e71c904b0e8212a0234d520ffbbe2b0d -Author: Dino Tinitigan -Date: Tue Dec 13 16:16:17 2016 -0800 - - check mux mode when using digitalWrite (#335) - - -check and make sure that the pin is in GPIO_MUX_MODE when doing a - digitalWrite() - -this has a slight performance impact of digitalWrite - -it also comsumes an extra byte in SRAM per pin - -it does however give us the ability to track the muxing state of each - pin - -commit 16227f53f2591eaa47e551b8000878855294eb35 -Author: Dino Tinitigan -Date: Tue Dec 13 16:15:51 2016 -0800 - - Ensure RTC clock scaling is set to 1Hz (#350) - - -needed to make sure that the RTC scaling is consitent with the factory - firmware and CODK-M based firmware - -commit 0d321db5cc619dc9a4451a6710dabd38fee492bf -Author: Erik Nyquist -Date: Tue Nov 29 11:32:50 2016 -0800 - - CurieIMU.cpp: Don't lock interrupts for SPI transfers - - This is unnecessary- nothing else is contending for access to this - particular SPI controller - -commit e870ba255646afa47debfc0b1cb493cc055520dd -Author: Dino Tinitigan -Date: Tue Nov 29 13:27:38 2016 -0800 - - Ensure RTC clock scaling is set to 1Hz - - -needed to make sure that the RTC scaling is consitent with the factory - firmware and CODK-M based firmware - -commit de208be5c42a305624468d9a1a5208f60d0b5bdb -Author: Erik Nyquist -Date: Tue Nov 29 10:35:10 2016 -0800 - - README.md: add steps for updating intel-arduino-tools - -commit 2bb7d4b58e4152fde9b87153f71618475f54c42a -Author: Erik Nyquist -Date: Fri Oct 21 16:20:37 2016 -0700 - - README.md: remove Serial1 debug information - -commit 205c1e40852f356a4819a16260086e8f3c719592 -Author: Adrien Descamps -Date: Thu Aug 11 23:13:02 2016 +0200 - - Enable interrupt mode of UART tx - - Previous version of write will never use the interrupt mode - transmission, because it fails to check if holding register is - empty. This commit fix that, and several bugs related to - interrupt mode serial transmission. - When possible, it uses the tx FIFO, in order to reduce - the number of interrupts called and the overhead. - -commit 5279509cc2f6d161e1607245f15024e5d578c10e -Author: Erik Nyquist -Date: Mon Nov 14 10:12:39 2016 -0800 - - CurieTime.cpp: check gmtime() return pointer for NULL-ness - -commit 249fb3b7b6a7ebf85a202688c960de9f256a8018 -Author: Erik Nyquist -Date: Mon Nov 14 16:20:09 2016 -0800 - - README.md: add link to ICS for product support - -commit c353f4caa7e5d9a4287410f2826f8e75683ab13c -Author: Calvin Park -Date: Thu Oct 27 15:57:39 2016 -0700 - - Use our own version of copy.exe so that we can copy without cmd.exe - -commit 6ee828b737b4bd08dda78b0769bb9043c64d2c4c -Author: Dino Tinitigan -Date: Thu Oct 20 15:53:53 2016 -0700 - - Move SoftwareSerial buffers into DCCM area - -commit 41f98f9c459a0ed7175b34c9c334c03c352c0706 -Author: Dino Tinitigan -Date: Thu Oct 20 15:14:47 2016 -0700 - - Allocate RingBuffer buffer into DCCM area - - -this buffer is used by the uart. Moving it into the DCCM area would - save us 128 bytes of SRAM - -commit 8619f2b3e088c28c389550a19ecf2e2e3029543e -Author: Dino Tinitigan -Date: Thu Oct 20 11:35:08 2016 -0700 - - Move buffers for Wire library to DCCM area - -commit 4e2232e3e55ab68da0e125f59da2817f45b7e06d -Author: Dino Tinitigan -Date: Wed Oct 19 15:26:19 2016 -0700 - - Expose dccm area - - -expose dccm area giving the user an extra 8k of memory - -simple implementation of a malloc like function for dccm memory area - -commit 1c8de0d7cc0ecf93abeb539bd97b0fee2b09eb97 -Author: Erik Nyquist -Date: Tue Oct 11 10:11:29 2016 -0700 - - Add functions to check if new IMU data is available - - accelDataReady() and gyroDataReady() read the drdy_acc and drdy_gyr - bits, respectively, of the BMI160's sensor status register. This removes - the burden of syncronising sensor reads from the user. - - (adapted from descampsa/corelibs-arduino101@773a800) - -commit 3d3c1f92c2c15724725f71542bc564754ba5d6e3 -Author: Erik Nyquist -Date: Wed Oct 12 15:42:50 2016 -0700 - - I2SDMA: Do not modify g_APinDescription - - The g_APinDesctiption is now 'const', so cannot be modified. - -commit d6b2ecaa47bd543dbb35a33b36dfa2fb9037de86 -Author: Dino Tinitigan -Date: Wed Sep 28 12:54:37 2016 -0700 - - pwm improvements - - -add capability to change pwm signal frequency with analogWriteFrequency - -improve pwm signal frequency accuracy - -commit 27a68decb8e450f52b7c4c9dc254a1b0cb045b17 -Author: Biagio Montaruli -Date: Wed Sep 7 13:15:41 2016 +0200 - - Update sketches that use serial communication of different libraries - - Improve sketches of CurieTime, CurieTimerOne, CurieSoftwareSerial, SPI and - SerialFlash libraries that use Serial communication. - Since Arduino/Genuino 101 uses USB native port, wait for the Serial port - to open to not lose serial data already sent to the Serial monitor. - - Signed-off-by: Biagio Montaruli - -commit 39ef9ef12c50366c4b77f494ae53361bbaf2118c -Author: Calvin Park -Date: Fri Oct 7 11:07:44 2016 -0700 - - Don't save unstripped elf for debugging (#314) - - The current save mechanism breaks when a user has deleted system32 from PATH environment variable. Comment out the copying so that it won't break for such users, but do not delete so that advanced users can use the unstripped elfs to debug. - -commit c396a3ad4f0ffb9163b0a2b270aa4584848764f3 -Author: Erik Nyquist -Date: Tue Oct 4 16:59:36 2016 -0700 - - Shrink oversized objects in SRAM - - 824 bytes is gained for use by sketches. Two new defines are added; - CDCACM_BUFFER_SIZE and UART_BUFFER_SIZE. The CDC-ACM Serial class and - the UART driver had been using the same #define for buffer size-- - SERIAL_BUFFER_SIZE-- and separating them means that the CDC-ACM buffer - can stay the same size, while the UART buffer is shrunk. - -commit 1a5e3f7b2d65cf2b81417f85bd24ca455bdaa1fc -Author: Erik Nyquist -Date: Thu Sep 29 15:17:07 2016 -0700 - - Make g_APinDescription const - - This has the effect of moving g_APinDescription out of .data (SRAM), - and into .rodata (flash). - - Pros: - sketches now have an additional 1160 bytes of SRAM available - - Cons: - state of pins is no longer tracked; e.g. when calling digitalWrite, - the full configuration is done each time. See changes in wiring_digital.c - and wiring_analog.c for details. There is inevitably a performance impact - for digitalRead/Write & analogRead/Write, though it is unlikely to be a - noticable one. - -commit 2e56b81a264c8760f095a12f650381b8ea8de831 -Author: Erik Nyquist -Date: Wed Sep 28 12:02:32 2016 -0700 - - stdlib_noniso.cpp: Handle rounding corner case for dtostrf - - Rounding must be done before separating the integral and decimal portions. - -commit f2a001f4fa557c4374493242c67ecee617a59866 -Merge: 77d9086 d2b7d1d -Author: Calvin Park -Date: Thu Sep 22 11:57:28 2016 -0700 - - Add BLE Central feature - -commit d2b7d1d732ca2ace5eb3f3da2e5cf3371e104f54 -Author: unknown -Date: Mon Sep 12 10:33:51 2016 -0600 - - JIRA-685, Peripheral sketches shall state associated Central sketch. - -commit 9581cf18a0a904e096f1dcab30624871c22714c4 -Author: Brian Baltz -Date: Mon Aug 29 14:01:05 2016 -0700 - - Update expected BLE version for V3 - - Signed-off-by: Brian Baltz - -commit 0304de781d54d0158c070d2d9cc750ab295c0712 -Author: Calvin Sangbin Park -Date: Fri Sep 9 10:55:17 2016 -0700 - - Rebuilt libarc32drv - -commit 84fc3dbbfb900d0d5cf5b8b2a9c7e734accb5771 -Author: lianggao -Date: Fri Sep 9 08:28:50 2016 +0800 - - Create BLE Example sketches - - 1. Fix Jira 664 demonstrates changing the ADV data - 2. Fix Jira 671 Support update connection interval in central/peripheral - -commit e7238f02c945faf6a05eca38ae590d520ec2af62 -Author: lianggao -Date: Fri Sep 9 08:25:31 2016 +0800 - - Jira Tickets and Bug fix - - 1. Jira 541 Peripheral Start fails on X Number of Attributes - -Change the interface and add return value - - 2. Fix BLE Peripheral is not advertising - -Add a delay after register the profile. - - 3. Modify some comments based on code review - - 4. Jira 544 BLE peripheral disconnect and end functions - -The state not aligned and make disconnect failed. Update when connect and disconnect event received - - 5. Delete the duplicated code that base class has implemented - - 6. Fix Jira 665 BLECentral Preview -- compile issue when instantiating BLE descriptor - -Fix the build error. - Note: - i . The current code only support one descriptor on characteristic. - ii . The central discover logic need more twist. - iii. Now is so long and can't process CCCD and another characteristic. - iv . The library will support one other descriptor except CCCD. - - 7. Improve the discover logic and support another descriptor - i. Improve the discover logic - ii. Support another the descriptor and CCCD at same time. - - 8. Modify the comments and delete the unused API - - 9. Fix Jira 670 A compile error occurs with two BLE methods with the same name - i. Add method uuid_cstr in BLEAttribute class. - ii. Remove the duplicate file. - - 10. Fix Jira 672 BLE documentation in code needs to specify units - i. Change the scan and connection interval's unit to ms. - ii. Unify the advertising interval unit as millisecond - iii. Delete some unused code. - - 11. Fix Jria 671 Support update connection interval in central/peripheral - i. Central can update the connection interval. - ii. Unify the interval unit to ms at user API. - - 12. Adjust the example comments and functions - i. Fix Jira 675 - BLE callbacks should use passed arguments instead of global variables - ii. Adjust the code struture to align with Arduino's requirement - - 13. Fix Jira 680 LED and LED Central sketches need some work - -Add a delay to make sure profile register process success. - -The UART send too fast may makes the profile registration failed. - - 14. Fix Jira 673 BLE Api should pass arguments that are typedef - - 15. Fix Jira 671 Support update connection interval in central/peripheral - i. Add peripheral update the connection interval feature. - ii. Update the library. - - 16. Fix Jira 687 Edit the keyword.txt of CurieBLE to reflect Library changes - - 17. Make example function ready. But need to resolve Jira 675 - - 18. Fix Jira 676 Review Edit Update BLE User Manual with China Flex - - 19. Fix Jira 685 BLE Peripheral sketches shall state which associated Central sketch to use - - 20. Fix Jira 588 - BLE Corrupted Long Write - i. Modify the BLECharacteristic to implement the Long write feature. - - 21. Fix Jira 683 Typecasting and Pointers should be avoided in sketch - i. Add write in Characteristic template - ii. Add method in BLE Role class to avoid typecaste - iii. Modify the advertise address parameter and related example sketches - - 22. Fix Jira 704 Type Characteristic should be documented - 23. Fix Jira 684 Documentation about the central/peripheral - -commit ae78b1626ef682331af055075fbddb672cb19552 -Author: lianggao -Date: Fri Jul 29 22:19:36 2016 +0800 - - Add BLE central function, debug interface and refactor peripheral - - -Add debug interface on Serial1 - -Update BLE stack and need update BLE's FW - -Reconstruct the BLE peripheral base on V3 - -Implement the BLE Central Role base on V3 - -Implement some sketches for new BLE library - -Add central read/write example - -Add set advertising parameter interface - -Add API to allow set up advertising after setup - -Add interface to set the device name - - File description - Porting from V3 - system/libarc32_arduino101/common/atomic.h - system/libarc32_arduino101/common/misc/byteorder.h - system/libarc32_arduino101/drivers/atomic_native.c - system/libarc32_arduino101/drivers/bluetooth/att.h - system/libarc32_arduino101/drivers/bluetooth/bluetooth.h - system/libarc32_arduino101/drivers/bluetooth/conn.h - system/libarc32_arduino101/drivers/bluetooth/conn_internal.h - system/libarc32_arduino101/drivers/bluetooth/gatt.h - system/libarc32_arduino101/drivers/bluetooth/hci.h - system/libarc32_arduino101/drivers/bluetooth/uuid.h - system/libarc32_arduino101/drivers/rpc/rpc.h - system/libarc32_arduino101/drivers/rpc/rpc_deserialize.c - system/libarc32_arduino101/drivers/rpc/rpc_functions_to_ble_core.h - system/libarc32_arduino101/drivers/rpc/rpc_functions_to_quark.h - system/libarc32_arduino101/drivers/rpc/rpc_serialize.c - system/libarc32_arduino101/framework/include/util/misc.h - system/libarc32_arduino101/framework/src/os/panic.c - system/libarc32_arduino101/framework/src/services/ble/conn.c - system/libarc32_arduino101/framework/src/services/ble/conn_internal.h - system/libarc32_arduino101/framework/src/services/ble/dtm_tcmd.c - system/libarc32_arduino101/framework/src/services/ble/gap.c - system/libarc32_arduino101/framework/src/services/ble/gatt.c - system/libarc32_arduino101/framework/src/services/ble/hci_core.h - system/libarc32_arduino101/framework/src/services/ble/l2cap.c - system/libarc32_arduino101/framework/src/services/ble/l2cap_internal.h - system/libarc32_arduino101/framework/src/services/ble/smp.h - system/libarc32_arduino101/framework/src/services/ble/smp_null.c - system/libarc32_arduino101/framework/src/services/ble/uuid.c - system/libarc32_arduino101/framework/src/services/ble_service/ble_service.c - system/libarc32_arduino101/framework/src/services/ble_service/ble_service_api.c - system/libarc32_arduino101/framework/src/services/ble_service/ble_service_int.h - system/libarc32_arduino101/framework/src/services/ble_service/ble_service_internal.h - system/libarc32_arduino101/framework/src/services/ble_service/ble_service_utils.c - system/libarc32_arduino101/framework/src/services/ble_service/gap_internal.h - system/libarc32_arduino101/framework/src/services/ble_service/gatt_internal.h - system/libarc32_arduino101/framework/src/services/ble_service/nble_driver.c - -commit 77d908688e799557fa6e582fbd885c825aaa07c6 -Author: Calvin Sangbin Park -Date: Mon Sep 19 16:48:28 2016 -0700 - - Rebuilt libarc - -commit 5340b0c9c1fa02257b7f363339594944f4c6be9e -Author: Martino Facchin -Date: Mon Sep 5 15:41:42 2016 +0200 - - CurieEEPROM refactor - - This PR refactors CurieEEPROM library, syncing it with AVR version. - Since EEPROM on Curie chip is based on OTP flash storage, the minimum write - size is 4 bytes. The current implementation brings some problems like - http://forum.arduino.cc/index.php?topic=421348.0 , and the examples are - quite broken. - - The refactor also changes the name, from CurieEEPROM to EEPROM, so code for - AVR sketches compiles out of the box. The new library resolution engine - (from IDE 1.6.8 onward) handles this perfectly but we can stick to older name - if we need compatibility with older IDEs. - -commit 4c69f724b9e253c014e118ca87d031929deea7ca -Author: Sidney Leung -Date: Thu Sep 1 15:20:32 2016 -0700 - - Added support for Quark I2C interfaces: I2C0 and I2C1. - - Additions: - 1. Ported Quark I2C driver to ARC/CoreLibs, located at system/libarc32_arduino101/drivers. - 2. Created the I2C Adapters, located at cores/arduino. - - Modifications: - 1. Platform.h - added number of I2C interface definition. - -commit 7dcc0742ef43174547efec5497359d6d80cc6387 -Author: Biagio Montaruli -Date: Sat Sep 17 13:45:03 2016 +0200 - - Update bus_scan.ino sketch of Wire library - - Improve documentation, code formatting and use LED_BUILTIN instead of 13 - to control the on-board led connected to digital pin 13 of - Arduino/Genuino 101 - - Signed-off-by: Biagio Montaruli - -commit 23ca972371c3bf9db488e948d35b870a1fa52b2c -Author: Sandeep Mistry -Date: Thu Sep 15 15:22:35 2016 -0400 - - WString: add `toDouble` (#293) - - Port of https://github.com/arduino/Arduino/pull/5362 - -commit f818d7cd360e109c31bc65ed11f0df3b133bc826 -Author: Sandeep Mistry -Date: Tue Sep 6 14:06:34 2016 -0400 - - Make String::move of an invalidated String result in an invalidated String - -commit 2751995ab29738c708b5b7d109d98cbfc34a09e4 -Author: Biagio Montaruli -Date: Wed Sep 7 13:01:32 2016 +0200 - - Fix for USB virtual serial port in sketches of CurieIMU library - - Since Arduino/Genuino 101 uses USB native port, wait for the Serial port - to open before executing the sketch to not lose serial data already sent - to the Serial monitor - - Signed-off-by: Biagio Montaruli - -commit d8d2c495b531fda1ffe98cb59f7e35fd948c5bad -Author: Biagio Montaruli -Date: Wed Sep 7 13:05:01 2016 +0200 - - Fix for USB virtual serial port in sketches of CurieI2S library - - Since Arduino/Genuino 101 uses USB native port, wait for the Serial port - to open before executing the next lines of code to not lose serial data - already sent to the Serial monitor - - Signed-off-by: Biagio Montaruli - -commit e084140957ebe2aa0d891c496ced456538c9a1b9 -Author: Erik Nyquist -Date: Wed Sep 7 16:02:31 2016 -0700 - - stdlib_noniso.cpp: fix dtostrf() handling of integral portion - - Checking only for > 10 here (rather than >= 10) means that numbers with a - leading '10' in the integral portion generate incorrect strings. - -commit b329d080469778b7e9c8e0868ab6edba4a7fdf97 -Author: russmcinnis -Date: Tue Aug 30 15:56:08 2016 -0700 - - add comment to pulseIn() in the header file to warn programmer about trying to detect high frequencies. - -commit 10d1056503099431cda97deacabbb2a68f43121e -Author: Brian Baltz -Date: Thu Aug 25 12:47:00 2016 -0700 - - Verify BLE FW version on every sketch upload - - Signed-off-by: Brian Baltz - -commit 431fb6fd27bdfbd6aaa97e690f1b162a1e02cb62 -Author: sys_maker -Date: Mon Aug 22 12:35:27 2016 -0700 - - Rebuilding libarc32 library - - Signed-off-by: sys_maker - -commit 0d86ead0d4ae870c32c679fca3ef087c83a758fc -Author: Calvin Park -Date: Thu Dec 3 11:34:56 2015 -0800 - - Add flashpack to IDE - -commit 71cf8e44b3d9c28918084c0e5a6c2d1e239b1c98 -Author: Brian Baltz -Date: Wed Aug 10 13:53:03 2016 -0600 - - JIRA-668: Removing Intel version of Adafruit_NeoPixel - - Signed-off-by: Brian Baltz - -commit e4a5b14c51e70933ff3f85603a08c3b6970ec264 -Author: Adrien Descamps -Date: Sat Aug 6 16:27:35 2016 +0200 - - Fix UART receiver corruption - - When the UART receiver is disconnected for a time shorter than a line break - and longer than a start bit, it interpret that as a received packet, and if - data are transmitted immediatly after, they are corrupted. - This commit is a workarround for that bug, that enable the loopback feature - of the UART when UART is disconnected, so the UART module does not notice - it is disconnected. - A previous workarround for this bug (a forced delay after disconnection) is - not needed anymore and is removed. - -commit 7366ed0a4fd26faec64e11b530557c313069b4f7 -Author: Adrien Descamps -Date: Wed Aug 3 01:40:57 2016 +0200 - - Flush wait for transmission to be complete - - In previous version, flush wait for the transmission to be complete - by checking if the transmission holding register (or fifo) is empty. - When this happen, the last byte is still in the shift register, - and has still to be transmitted. - This mean we can't know when the transmission is actually complete, - which is crucial to implement RS485 communication, for example. - - This commit change this behaviour and wait for the shift register to be empty, - which means the transmission is really complete. - -commit 48b0e58306d227b289316fcb4143edb08570042c -Author: Calvin Sangbin Park -Date: Wed Aug 3 14:16:23 2016 -0700 - - Update libarc to the latest - -commit 9ae91d3e9d55d81358681dd1595880de1176d640 -Author: unknown -Date: Tue Aug 2 09:49:30 2016 -0600 - - Jira-556: Add comments to I2S examples - -commit b317284ec9312288dea4e2b5db5696821fa6237f -Author: Calvin Sangbin Park -Date: Thu Jul 28 10:44:44 2016 -0700 - - Update libarc to the latest - -commit 9a871b671ceec5f625c63c9a9e58f044cef2e70c -Author: Erik Nyquist -Date: Wed Jul 27 14:20:29 2016 -0700 - - Add delay to Serial1.end() allow GPIO lines to settle - - Through testing, it was discovered that if Serial1.begin() is called again - immediately after Serial1.end(), then any attempt to write data immediately - following the begin() call could result in corrupted frames. - - After calling Serial1.end(), it will be at least 300us before those pins can - be used as UART again. - -commit e3d90c19d96bbab006f59151b73179ab0c7d9097 -Author: Caihong Ma -Date: Tue Jul 26 01:34:39 2016 +0800 - - CurieI2SDMA: Fix typo and add explanatory notes - CurieI2SDMA.h: Fix typo at line 23 and 24; I2SDMA_RXCallBack.ino: add - explanatory notes to explain how to check the verification of data - -commit fbb7b02a89da37ac9408710ff5ed1a936d00cd8b -Author: Xie,Qi -Date: Tue Jul 19 09:13:39 2016 +0800 - - JIRA-640 I2C operations are sometimes timing out causing a long delay in between i2C operations - - fix this issue by call complete callback if no stop command issue at the end - of transfer. - -commit 160751a8c47f1d4cdd647ad1bf0d8eb6312d5791 -Author: Erik Nyquist -Date: Fri Jul 22 18:21:27 2016 -0700 - - README.md: add "commit message how-to" wiki link - -commit 197434001a973ad7a8df18b823f8365988140b43 -Author: Erik Nyquist -Date: Sun Jul 17 00:33:17 2016 -0700 - - Issue #149: Provide scaled IMU data - - Add implementations of readAccelerometer and readGyro which - return values that are scaled according to the range set with - setAccelerometerRange and setGyroRange - -commit 5671917298c35e6164784da6929cf006daf9d51d -Author: caihongm -Date: Fri May 27 02:17:19 2016 +0800 - - Jira509:add IMU examples:FreeFallDetection, MotionDetection,ZeroMotionDetection; change CurieIMU.cpp line490 from 'setZeroMotionDetectionThreshold' to 'setZeroMtionDetectionDuration' - -commit 12b2376ea58c79ef00ea47af2aea8796bb652d69 -Author: Erik Nyquist -Date: Wed Jul 20 15:23:23 2016 -0700 - - ATLEDGE-643: Add chip ID to SerialFlash example sketch - - RawHardwareTest reports the 101's on-board SPI flash chip as an unknown - device. Fix this by adding the device's JEDEC ID to the example sketch. - -commit b8162e993cccbe4065c1bd55d1f4466669f01f75 -Author: Caihong Ma -Date: Mon Jul 4 15:15:54 2016 +0800 - - Jira566: I2S DMA implement: supplement library and example - -commit c59e2808e1bf27e8adc7c3aff0d0ed1a8344e04f -Author: Erik Nyquist -Date: Fri Jul 15 15:39:16 2016 -0700 - - Issue #241: make Serial1 release GPIO pins on end() - - UARTClass::init() muxes out the UART pins to Arduino header pins 0/1. - Reset the mux on UARTClass::end() so that pins 0/1 can be used as GPIOs - again. - -commit bdaec192070ab196a55282fa57512748c6f1edd9 -Author: Erik Nyquist -Date: Mon Jul 11 11:21:34 2016 -0700 - - Add CurieIMUClass::end() - - Add end() method to IMU class, to disable clocking to the SPI - controller. This is unlikely to have noticeable power-saving effects, - however it is a good habit to get into. - -commit 2ec9b94f941d34ee1419311b194707aad3b0ee67 -Author: Dino Tinitigan -Date: Mon Jul 11 14:47:59 2016 -0700 - - Update Wire examples to use Serial instead of Serial1 - - -change Serial to Serial1 in the master_writer and master_reader - examples - -commit 5f3ee5bb36dc5e69ce26f7d2a64220ebc927ad83 -Author: Martino Facchin -Date: Tue Jul 12 10:22:12 2016 +0200 - - define digitalPinToInterrupt for backwards compatibility - - see http://forum.arduino.cc/index.php?topic=370167.0 - -commit ecee2e9483e39af71df873174df070fdf952c431 -Author: Caihong Ma -Date: Mon Jul 4 15:15:54 2016 +0800 - - I2S DMA - supplement library and examples - -commit 3168ede2cbd3df99121944d46a5b24e9557d2b4b -Author: erik.nyquist -Date: Fri Jun 24 13:08:25 2016 -0700 - - ATLEDGE-619: fix dtostrf - - Use a different method for float->string conversion, and - fix the width calculation so that extra spaces are only - printed if the width parameter exceeds the output string - length (ie. a mininum width, as specified by dtostrf - reference from avr-libc). - -commit 019bb8fcecc1c79d78bd58f18f1b4521e73fad35 -Author: Dino Tinitigan -Date: Fri Jun 24 14:58:48 2016 -0700 - - update libarc32 - - -update libarc32 binary - -commit 9be7604bec5f080683a236cbabfe0d70b174ac13 -Author: Dino Tinitigan -Date: Wed Apr 20 14:52:22 2016 -0700 - - I2C - add functionality to change i2c clock speed - - -adds functionality to change clock speed - -clock speed is set/changed when Wire.begin() is called - -default is standard mode - -use Wire.begin() for standard speed (100k) - -use Wire.begin(I2C_SPEED_FAST) for full speed (400k) - -use Wire.setClock(I2C_SPEED_FAST) for full speed (400k) - -commit 8682149177559757a57ae0b2ad6639dcf97e31b1 -Author: Dino Tinitigan -Date: Fri Jun 24 14:33:45 2016 -0700 - - reduce i2c delays - - -reduce i2c delays to increase performace without changing the timeout - threshold - -commit de0650c15a0d44284440e4c4ba1943639b73da4f -Author: erik.nyquist -Date: Tue Jun 28 15:21:32 2016 -0700 - - Add -std=gnu11 to compiler.c.flags in platform.txt - - Related to issue #221 - -commit 4d9642871ae0bfb28783b1d6fa00b364ea201cf1 -Author: Oren Levy -Date: Mon Jun 20 14:59:09 2016 -0700 - - Added MIDI examples - -commit 2cd33f43a1b84c3f23194b27290114c4cec5d9df -Author: Martino Facchin -Date: Thu Jun 16 11:29:06 2016 +0200 - - Correct core version in platform.txt - -commit 20844ff46b455055f86641c785fb580ae1214222 -Author: Mike Duong -Date: Wed May 25 18:32:05 2016 -0700 - - ATLEDGE-586: String.compareTo() does not compute the same as Uno for POS values - -commit 2f5ae85f235bc1e5a0e5b50d63961f4348f237a0 -Author: erik.nyquist -Date: Mon Jun 13 10:35:53 2016 -0700 - - ATLEDGE-572: Fix getStepDetectionMode() - - This function is reading all 8 bits of RA_STEP_CONF_1 (0x7A-0x7B) - to obtain a value for min_step_buf, though this value is only - represented by the lower 3 bits; bit 4 is used as the 'enable' bit. - As a consequence, this function will read the step detection mode - incorrectly when step counting is enabled. Fix this by only reading - the lower 3 bits of RA_STEP_CONF_1. - -commit de30a61b909802f2dbb3380c4adc9316ee1f64f7 -Author: erik.nyquist -Date: Mon Jun 13 11:57:21 2016 -0700 - - ATLEDGE-553 Modify library examples header info - -commit a694d09698db8d0f77ac19d58d1db34eef3d1b4d -Author: Sidney Leung -Date: Tue Jun 7 16:57:12 2016 -0700 - - Jira-617: String Object constructor hangs up when handling large floating point number - -commit df3b675c1ba4113fa560078ae60f610f4d8b3ae0 -Author: Erik Nyquist -Date: Fri Jun 3 15:02:00 2016 -0700 - - SerialFlash: enlarge chip ID buffer - - SerialFlashChip::readID() writes up to 5 bytes into - the buffer provided, but the caller only allocates - 3 bytes. Increase buffer size to 5 bytes. - -commit c27462cbc168257c2c928d435dcaf3b43a535fe1 -Author: Xie,Qi -Date: Wed May 25 07:30:23 2016 +0800 - - JIRA-560 I2C Bus Scan - using read instead of write to avoid sending the extra byte when scaning I2C bus - -commit e792ba2bd6480a556e50259e0e836ae4cf5ec371 -Author: Dino Tinitigan -Date: Tue May 31 17:03:06 2016 -0700 - - Fix bug when using StringConstructor with doubles - - -Fixes issue of StringContructor instability with doubles - -commit acc4b38ba43d654992b72fa9d4afa68b834a098c -Author: Dino Tinitigan -Date: Tue May 31 16:12:32 2016 -0700 - - Revert "Fix some issues with printing float and double" - - This reverts commit b8ea343bb237762de6ee3a60ba0b1e8d5af12ff0. - -commit 409e4b07f477e6345c972a40376085c89ecdb46e -Author: erik.nyquist -Date: Fri May 27 14:38:05 2016 -0700 - - Remove unsupported SerialFlash example - - CopyFromSD.ino requires SDfatlib (for AVR boards) which - is unsupported. - -commit 4294ca5ad86c2f7f5cfb354ac193ff1ecbfc9fa9 -Author: erik.nyquist -Date: Fri May 27 14:36:36 2016 -0700 - - Remove SPI.set* calls from SerialFlash example - - These functions are not implemented for A101's SPI library. - Remove these calls from examples/CopyFromSerial.ino - -commit f33e362db41f7871a63bc8f0294ce9aa43be3f0d -Author: erik.nyquist -Date: Fri May 27 14:26:46 2016 -0700 - - Add category to Wire/library.properties - -commit 348e36ee6e6eb2c5f5687b642f978aabcace5be2 -Author: Sidney Leung -Date: Thu May 26 15:54:08 2016 -0700 - - Jira-602: Convert float and double to strings. Output string is padded with spaces. - -commit ce7825883b79bd6849cc1fba4bbaa6416e43229d -Author: caihongm -Date: Fri May 27 02:17:19 2016 +0800 - - Jira509:add IMU examples:FreeFallDetection, MotionDetection,ZeroMotionDetection; change CurieIMU.cpp line490 from 'setZeroMotionDetectionThreshold' to 'setZeroMtionDetectionDuration' - -commit b8ea343bb237762de6ee3a60ba0b1e8d5af12ff0 -Author: Dino Tinitigan -Date: Thu May 26 13:51:06 2016 -0700 - - Fix some issues with printing float and double - - -fixes some issues with printing float and double - -limits the number of decimal places printable to 16 - -commit 9472c9aa9427030f3e24968d4915fdf69881ea66 -Author: Dino Tinitigan -Date: Wed May 25 15:43:28 2016 -0700 - - Remove unnecessary #undefs - - -Remove #undefs from CurieSoftwareSerial Library - -Because it was braking some functionality such abs() - -commit 048800b47b8edcbe0cbf9401163ace1f4c15bb3e -Author: Sidney Leung -Date: Thu May 19 11:36:38 2016 -0700 - - Jira-599. Routine, dtostrf, did not work with the latest toolchain. The call to sprintf in the routine crashed the system. Issue corrected by replacing the call. The routine, printfloat, in Print.cpp, is now usint dtostrf to print out double and float values. - -commit 874c3ef08bf7031a06248abbb59274da740444f2 -Author: erik.nyquist -Date: Fri May 20 10:38:55 2016 -0700 - - SPI: add SPI1 to keywords.txt - -commit 92818058e83302e478e7cdddd60d1d5568ce9bc5 -Author: erik.nyquist -Date: Thu May 19 10:34:30 2016 -0700 - - Add Paul Stoffregen's SerialFlash library - -commit 8dea7b4a1430dce33870a97fcf0330e0cda4fef3 -Author: erik.nyquist -Date: Mon May 16 10:41:02 2016 -0700 - - Fix SPI clock divider calculation - - If a clock value greater than the maximum supported - is passed (i.e. > 16MHz), the resulting value written - to the BAUDR register will be 0 which will disable - the serial output clock. Check for this and ensure - the value calculated for BAUDR register is never < 2. - -commit 331b2f0152bb90f1c96ee1726e8017db56e51789 -Author: erik.nyquist -Date: Thu May 12 11:18:35 2016 -0700 - - Clean up the SPI files - - Be consistent about commenting style, and - stay below 80 chars where appropriate. - -commit 2bb742afd2e8cf0a3708b3b50a94089b5b39a3a8 -Author: erik.nyquist -Date: Thu May 12 11:15:04 2016 -0700 - - Add support for SPI1 device to SPIClass - - SPI1 can now be used (SPI1.begin()) to access - the SPI device connected to the Arduino 101's - on-board SPI flash device - -commit 2bea587379b0e78d4006db13e4c9bdf4482637c0 -Author: Brian Baltz -Date: Mon Apr 25 15:36:38 2016 -0600 - - JIRA-550 Retain unstripped ELF file for debugging - - Signed-off-by: Brian Baltz - -commit ea7a804cefdf17a7518ba8c3fec95bb744273d0c -Merge: 2b5a040 9f88024 -Author: Brian Baltz -Date: Wed May 11 14:09:23 2016 -0600 - - Merge pull request #172 from bbaltz505/new_toolchain - - Updating compile command and driver lib for new toolchain - -commit 2b5a0402af9486f527805124a5ef937cbfb89ee1 -Author: Sidney Leung -Date: Fri May 6 16:39:36 2016 -0700 - - Bug fixed: CurieBle library, class BLECharacteristic allocates memory using an incorrect variable which may result in memory corruption if the memory size is bigger than 16 bytes. - -commit cdd2989b4297c10c8759de408ccb021f0874763a -Author: jysholar -Date: Mon May 9 12:48:48 2016 -0600 - - CurieIMU tap/double example, JIRA-508 - -commit 434fcd49ddcae18726b8196153baf0a68882b55e -Author: erik.nyquist -Date: Tue May 10 11:41:19 2016 -0700 - - README.md: clean up and add "support" section - - Break long lines to be <= 80 chars, where possible, and - add a new section to guide users to the appropriate place - for support (Arduino forum for product support, issue - tracker for bugs & features). - -commit eb0cf4f1ceaa0fc4220adcc726063e17934eee3e -Author: Martino Facchin -Date: Wed May 4 10:28:22 2016 +0200 - - Add SERIAL_PORT_USBVIRTUAL and SerialUSB macros - - This is needed to ensure compatibility with YunShield sketches - - asas - -commit 9f880240e6cb1deba4c8bd3f296dff4eb5a54929 -Author: Brian Baltz -Date: Thu Apr 28 15:33:58 2016 -0700 - - Updating compile command and driver lib for new toolchain - - Signed-off-by: Brian Baltz - -commit 2bac6d3432033197ffc23c6da96ddd99054271f9 -Author: Calvin Park -Date: Mon May 2 15:59:10 2016 -0700 - - Fixed the license file to LGPLv2.1 - -commit 443916f2621a808540997f36caa9bcd2c9d7fb5f -Merge: f43789e c1be134 -Author: Calvin Park -Date: Mon May 2 14:54:12 2016 -0700 - - Merge pull request #156 from bigdinotech/i2slib - - CurieI2S library - -commit f43789e71bcc9c7d8181aec61c48eed3a9683cba -Author: jysholar -Date: Tue Apr 26 12:25:01 2016 -0600 - - Jira-560, getInterruptStatus(...) should return type of bool - -commit 212dae55ea664d1bd92ad175615a49bec7d1bc4f -Author: Sandeep Mistry -Date: Tue Apr 5 09:50:36 2016 -0400 - - Sync avr/pgmspace.h entries with SAMD core - -commit 7bd93b3baf802481282e32240fcfc1f941e36561 -Author: Sidney Leung -Date: Thu Apr 14 15:46:58 2016 -0700 - - Jira-584: String constructor create floating point string with incorrect number of decimal places. - -commit 4d1014ff2b89a88f9605e2cb7f75bbe7bd0691e4 -Author: russmcinnis -Date: Wed Apr 13 11:10:56 2016 -0600 - - check pin range first thing in pinMode(), digitalWrite() and digitalRead() - - Signed-off-by: russmcinnis - -commit 285ec1770d831f584ca943f2e4d214ad59e35ffe -Author: Brian Baltz -Date: Tue Apr 12 10:56:38 2016 -0600 - - Removing obsolete TFT library - - Signed-off-by: Brian Baltz - -commit e9aaea9b39eb1496ebccdef422ae2d441f9086f4 -Author: Brian Baltz -Date: Fri Apr 8 15:11:42 2016 -0600 - - Fix CurieTimerOne example filename - - Signed-off-by: Brian Baltz - -commit 4cad8b8e31d7e8f13b394e90ffa2253ffb0d5f9b -Author: russmcinnis -Date: Wed Apr 6 13:30:42 2016 -0600 - - pwmStop() leaves pin HIGH - - pwmStop() was doing a digitalWrite(pwmPin, LOW) after the kill() so unless the pin happened to be 0 the pwmPin might be left in the HIGH state causing motors or other devices to run HIGH after pwmStop(). Just removed the pwmPin = 0 from kill() and it passes all our loopback tests. - -commit 0e4a0d439341781ef6709b73d45a77c79cdf0de7 -Merge: 669fb9b 0ad15b5 -Author: Brian Baltz -Date: Tue Apr 5 09:23:41 2016 -0600 - - Merge pull request #146 from bneedhamia/support-eddystone-url - - Added Eddystone-URL support - -commit 669fb9bcf6e80d774a8a9d836b3354c5ddd04a99 -Author: Brian Baltz -Date: Mon Apr 4 15:55:55 2016 -0600 - - JIRA-558 Remove Intel Ethernet and SD libraries - - Signed-off-by: Brian Baltz - -commit c1be134976c7afa8fd3af95907e0f043efc6bc8d -Author: Dino Tinitigan -Date: Mon Apr 4 10:17:29 2016 -0700 - - CurieI2S - minor fixes/improvements - - -prevent buffer overflow in I2S_RxCallback example - -calculate delay for any sample rate - -commit 0ad15b5a46969ddda239cf764caebb32a81e56ae -Author: Bradford H. Needham -Date: Sun Apr 3 11:07:14 2016 -0700 - - Fixed spaces in keywords.txt; keywords now highlight properly - -commit 89dd2287dfd41a12db0a34eed7d94b8593b2e5da -Author: Dino Tinitigan -Date: Fri Apr 1 12:06:36 2016 -0700 - - CurieI2S add examples - - -add basic examples using callback functions/interrupts - -add callback function to fill tx buffer - -commit 2bca6fc912b51200ad12b833e52321e65ccf553b -Author: Dino Tinitigan -Date: Wed Mar 30 12:18:36 2016 -0700 - - Interrupt based I2S library - - -CurieI2S using interrupts - -commit a54f5132630fb2825e27d84cf4ddf3d8ee22192a -Author: Sidney Leung -Date: Thu Mar 31 11:50:12 2016 -0700 - - Jira-575, Jira-506: Bug fixes to print float and double correctly, in a string or std output. - -commit ccc02128ad2371d3ed35ebb3a01d4146df930e97 -Author: Dino Tinitigan -Date: Wed Mar 23 18:07:38 2016 -0700 - - CurieI2S use interrupts for Tx - - -Use interrupts to fill FIFO buffer from TX buffer - -commit 4fae4ddb4cc9bb14c6c4ccc6147253944c778bb9 -Author: Dino Tinitigan -Date: Tue Mar 8 15:01:49 2016 -0800 - - CurieI2S initial commit - - - Minimal functional version - -commit 2eb99d10a116a092a2ade78a79d96d164847f9b2 -Author: agdl -Date: Fri Mar 11 13:58:24 2016 +0100 - - Removed delay from examples as requested by Tom - -commit 38a508e4552f88649cdd664babd0165673b7caa6 -Author: Sidney Leung -Date: Tue Mar 8 13:31:14 2016 -0800 - - Jira-528. Make CurieTimerOne library to be compatible with the TimerOne library originated from Paul. Created methods that have the same name and functionalities as in the TimerOne library. - -commit 98ee736fa2bb12e99d80bad866a9a298e0bc1c2e -Author: SimonePDA -Date: Mon Mar 14 18:01:40 2016 +0100 - - Update CurieTimer1Interrupt.ino - - Changed the style of the code according to Arduino's Tutorials guidelines. - -commit 40d3fb07d98db264dc1f2b0c2b5a3057359a721d -Author: Bradford H. Needham -Date: Tue Mar 8 20:35:51 2016 -0800 - - Added Eddystone-URL support: added setAdvertisedServiceData() to support BLE Service Data; changed Incomplete to Complete Service UUID list code in Advertising initialization, required by Eddystone-URL protocol; added (for debugging) getAdvertisingLength() and getAdvertising() to enable a Sketch viewing the Advertizing packet. - -commit 17eac79d76b721eb116179aa87f0e3627add4927 -Author: Dino Tinitigan -Date: Tue Mar 8 10:54:11 2016 -0800 - - Fix Klockwork issues in CurieEEPROM #142 - - -Also fixes issue of not being able to rewrite the last 3/4 of the - EEPROM area - -commit e50ef904347f9d4da0a7c4e0e5523b4ff5d040bb -Merge: 1f3899a c7b30f4 -Author: Brian Baltz -Date: Tue Mar 8 11:51:38 2016 -0700 - - Merge pull request #141 from bbaltz505/memory_size - - Fixing sketch size calculation (text + ctors + rodata + datas - -commit c7b30f4c627ad20b5cdbc621803afa76fba61bfd -Author: Brian Baltz -Date: Tue Mar 8 07:07:43 2016 -0800 - - Decrease max sketch size to 155,648 bytes - - Signed-off-by: Brian Baltz - -commit f02410e9bf138f48243b62853b44c9b797ea01e9 -Author: Brian Baltz -Date: Wed Feb 24 20:04:14 2016 -0800 - - Fixing sketch size calculation (text + ctors + rodata) - - Signed-off-by: Brian Baltz - -commit 1f3899a7cabd71ae9fbda7f721a117614587adaa -Author: SimonePDA -Date: Thu Mar 3 22:29:38 2016 +0100 - - Update library.properties - -commit c4a20140569016649b4333ef6c349c8041827164 -Author: SimonePDA -Date: Thu Mar 3 21:55:23 2016 +0100 - - Update library.properties - -commit 72b85b2bdb884a995620e3aeb66d518844b0746a -Author: SimonePDA -Date: Thu Mar 3 21:39:55 2016 +0100 - - Update library.properties - -commit 3d019ed2cebf9034e37cda961d16b08042d8f731 -Author: SimonePDA -Date: Thu Mar 3 21:34:23 2016 +0100 - - Update library.properties - -commit 5bb196cdd961a0fb54129d1fcf2fc99778ab0914 -Author: SimonePDA -Date: Thu Mar 3 19:58:12 2016 +0100 - - Update library.properties - -commit fda58303cb959000bb8d04855f5b11838423d15d -Author: SimonePDA -Date: Thu Mar 3 19:35:08 2016 +0100 - - Update library.properties - -commit 7905133b686bf5dcc0112b828a9d8128ddf6ee8e -Author: SimonePDA -Date: Thu Mar 3 19:24:32 2016 +0100 - - Update library.properties - -commit bc9c387332dc16290f1c1c180eabae0d33eec8fe -Author: SimonePDA -Date: Thu Mar 3 19:12:32 2016 +0100 - - Update library.properties - -commit 953479ae0f37961fb8f4040fbdcd8848f59cae33 -Merge: 3bd268c eacb1bd -Author: Brian Baltz -Date: Wed Mar 2 15:06:03 2016 -0700 - - Merge pull request #129 from 00alis/src_folders - - Moved .h and .cpp file in src folder - -commit 3bd268c3992f095233bb16a18dac8541b86b0bf2 -Author: Brian Baltz -Date: Wed Mar 2 10:40:59 2016 -0800 - - Updating install steps in README - - Signed-off-by: Brian Baltz - -commit eacb1bd114ec57cbecab357dfab8a396b5e7b09d -Author: Alice Pintus -Date: Wed Mar 2 12:49:10 2016 +0100 - - Rename library.properties - -commit 1cbd80b226b237ddb5a2cd5705f63975ed6f9596 -Author: Alice Pintus -Date: Wed Mar 2 11:56:24 2016 +0100 - - Moved .h and .cpp file in src folder - -commit e8b8a5db546696735d5de38e58253b75cb411e7a -Author: Sandeep Mistry -Date: Fri Feb 26 15:05:54 2016 -0500 - - Change set/get accelerometer and gyro offsets to use floats values - - This makes it consistent with other API changes to convert the register - values to floats and vice versa. - -commit ffc51eff1581f38c977798114f94affc5393d0e2 -Author: Sandeep Mistry -Date: Tue Feb 2 10:08:35 2016 -0500 - - Add setConnectionInterval API to CurieBle - -commit f11de80d789e9071a05387cfa96d80e08db563cc -Author: Martino Facchin -Date: Tue Feb 23 15:06:09 2016 +0100 - - use sprintf-based implementation for dtostrf - - altough the current implementation passed all the unit tests, an user reported problems with the actual code (http://forum.arduino.cc/index.php?topic=380422.0). - If libc has float support there is no need to do strange things like on AVR, so we can use the sprintf implementation - -commit ad1586ef179fa0920edb29d4e3a05307a267a3cd -Author: Calvin Park -Date: Mon Feb 29 15:14:32 2016 -0800 - - Updated README.md with instructions to manually install corelibs - -commit 582d03353b5111b8030ec5a6954ec480acaaa6d3 -Author: Dino Tinitigan -Date: Fri Feb 26 11:04:59 2016 -0800 - - i2c bus scan workaround - - -sends a byte of value 0 when doing an i2c bus scan - -commit f6d8aa81847643f1102805e9b1f6ef32c3fbc0a9 -Author: Dino Tinitigan -Date: Mon Feb 22 14:08:34 2016 -0800 - - CurieEEPROM - ensure 32-bit allignment - - -ensure 32-bit address allignment for put(), get(), read(), and write() - -commit 64ee87970db858c1e4caed63e41f21158f6653b7 -Author: Brian Baltz -Date: Wed Feb 24 17:45:23 2016 -0800 - - Remove custom Adafruit_Motor_Shield_V2 library - - Signed-off-by: Brian Baltz - -commit 6f9739fac258c812f74139c16017817aa4045ace -Author: Brian Baltz -Date: Thu Feb 18 17:16:09 2016 -0700 - - Use Go-based upload script - - Signed-off-by: Brian Baltz - -commit 83bb5f5d818a3ed2db05a0b784c6888822d3e2e7 -Author: jysholar -Date: Tue Feb 23 10:33:17 2016 -0700 - - Rename CurieTimer to CurieTimerOne for JIRA-532 - -commit 3448d230240682d1579b26e6f095afe479d68a09 -Author: Sandeep Mistry -Date: Wed Feb 17 08:37:19 2016 -0500 - - Remove enums for ranges and duration, auto calibrate/set offset now enables offset, rename interrupt routines to interrupts/noInterrupts - - keywords.txt updates - -commit 63a01dd918a1fd16d7a914dfd312c763699abdde -Author: Sandeep Mistry -Date: Tue Feb 2 11:40:38 2016 -0500 - - Rename CurieBle to CurieBLE - -commit e82fe904dba101da79bbd7dd63060f223d8716cc -Author: Sidney Leung -Date: Fri Feb 5 11:55:00 2016 -0800 - - Jira-507 and 514: 1. Bug corrected in timer ISR where the clearing of the pending interrupt was at the entrance instead of exit. When interrupts could happen fast enough to put the ISR in a loop. 2. The overhead for the s/w pwm code is 4-5 usec. Thus, limited the shortest pwm pulse to 10 usec (high and low). - -commit 2299da2693c0fe867c7b90d998b43c15d666e763 -Author: Brian Baltz -Date: Wed Feb 10 07:47:38 2016 -0800 - - Stop interrupt when switching to 100% duty cycle - - Signed-off-by: Brian Baltz - -commit da68b6fcd5363a5b771e02ec7fa4ab1774286ebe -Author: Brian Baltz -Date: Wed Feb 3 12:10:41 2016 -0800 - - ATLEDGE-516 Stop callback when setting duty cycle to 0 - - Signed-off-by: Brian Baltz - -commit ef62ce6bff2c6059e1f0750c8fa2ec9af424f712 -Author: Brian Baltz -Date: Wed Feb 3 12:09:33 2016 -0800 - - Fix pwmStop typo in keywords.txt - - Signed-off-by: Brian Baltz - -commit 6059a142b0bed4bd3b1a2e2c45a298bc72ee6754 -Author: agdl -Date: Tue Feb 2 15:13:42 2016 +0100 - - Fixed define - - To be compliant with all the others - -commit 65f3b2887bfc3dfe228a3216a4c8b4a4e51dcfac -Author: Dino Tinitigan -Date: Tue Feb 2 11:32:00 2016 -0800 - - CurieEEPROM eeprom_write example - - -increment eeprom address at the correct location so it matches the read - example - -commit 6885cded61c1dac1e45d4a33436da6c840994cc4 -Author: Dino Tinitigan -Date: Wed Jan 27 14:39:40 2016 -0800 - - CurieEEPROM reimplement put and get to not use STL - - -reimplement put() and get() to not use STL due - to incompatibility with max() and min() macros - -commit 0a382340a0487691627ad3af48bce01572029b4b -Author: Krzysztof Sywula -Date: Wed Jan 27 15:06:53 2016 -0800 - - Green pixel fix - - JIRA: ATLEDGE-470 - -commit a6381cb123d77d3da630eda19c5d2947c1e129c6 -Merge: 07a53ab 555c23b -Author: Brian Baltz -Date: Tue Jan 26 17:05:08 2016 -0700 - - Merge pull request #109 from SidLeung/master - - Jira-501: CurieTimer.resume() did not re-enable interrupt at the controller. - -commit 555c23bc7cabc7217818b18a267a490d01fa63ad -Author: Sidney Leung -Date: Tue Jan 26 15:46:33 2016 -0800 - - Jira-501: CurieTimer.resume() did not re-enable interrupt at the controller. - -commit 07a53ab9f5174153967e1ebdac7527b680ec6232 -Author: Dino Tinitigan -Date: Tue Jan 26 14:13:15 2016 -0800 - - CurieSoftwareSerial remove non-working example - - -Remove non-working TwoPortReceive.ino example - -commit 0eca3b32f09a30c0d146f5730d29f91527836108 -Author: Sidney Leung -Date: Fri Jan 22 15:07:03 2016 -0800 - - Jira-500. Corrected typo error. Routine, pwdStop, is now named as, pwmStop. - -commit 02c960487caaaea5e77ca2370af73b59064f442a -Merge: 8a517b6 1be5b6c -Author: Calvin Park -Date: Thu Jan 21 14:03:13 2016 -0800 - - Merge pull request #103 from pricopb/master - - Remove OneWire and Adafruit_DotStar libraries. - -commit 8a517b656072e22b9394ec58b6ee22e179a39789 -Author: Dino Tinitigan -Date: Wed Jan 20 15:08:42 2016 -0800 - - CurieSoftwareSerial timing issue fixes - - -fix some timing issues with slower baud rates - -commit aaa453d00cf6e06f36dbe5c9012b252ebbcc9170 -Author: Brian Baltz -Date: Tue Jan 19 14:17:18 2016 -0800 - - ATLEDGE-491 - rename sketchUploader tool to arduino101load - - Signed-off-by: Brian Baltz - -commit 4932616c873d7b06af99698214a718f572a404f6 -Author: Dino Tinitigan -Date: Tue Jan 19 15:53:12 2016 -0800 - - CurieEEPROM fixes - - -remove leftover debug prints - -put() and get() should only support 32-bit alligned addresses - -commit effd880b1cae45f923fabcd8582e86544288ed26 -Author: Dino Tinitigan -Date: Thu Jan 7 15:17:40 2016 -0800 - - CurieSoftwareSerial Improvements - - -changed global variables into static - -allow different baud rates for different instances of a SoftwareSerial object - -minor code cleanup of unused code - -moved source code into src directory - -commit 1be5b6cb91fa5f6de5749fa1268f03606f6a83f9 -Author: Bogdan Pricop -Date: Fri Jan 15 08:32:32 2016 +0000 - - Remove OneWire library. - - Remove the OneWire library because the code changes for porting it to - Arduino101 were pushed to Paul Stroffegen's repository: - https://github.com/PaulStoffregen/OneWire/commit/e21914433ec588a23922099fa4435fbe0493e5ab - - Signed-off-by: Bogdan Pricop - -commit 1253ea89e0d81b943a1e22aad79559913ea2e297 -Author: Bogdan Pricop -Date: Fri Jan 15 07:38:11 2016 +0000 - - Remove Adafruit_DotStar library. - - Arduino101 specific changes moved to Adafruit github repository: - https://github.com/adafruit/Adafruit_DotStar/commit/0fce0fe52956a7eaf8f29ecfbaecc4138e958ed5 - - Signed-off-by: Bogdan Pricop - -commit ef9d032bf468a09a6921ce4334aa50c1ac227e9c -Author: sys_maker -Date: Fri Jan 8 15:56:10 2016 -0800 - - Rebuilding libarc32 library and hard-coding tools version - - Signed-off-by: sys_maker - -commit cc7cccc85afe0fe9c558913305c0ffe86b213caf -Author: Kevin Moloney -Date: Fri Jan 8 13:27:59 2016 +0000 - - find() missing overload in Stream.h - - Signed-off-by: Kevin Moloney - -commit b0531afe05cb8e5f301f04e9a207b7fcbb00c93b -Author: Alice Pintus -Date: Fri Jan 8 11:41:36 2016 +0100 - - Update boards.txt - - Change name Arduino 101 into Arduino/Genuino 101 to be consistent with the rest of the ecosystem - -commit 3ca20d94b362264b0e9ddac74c3731c1ab26a467 -Author: Dino Tinitigan -Date: Tue Jan 5 14:06:21 2016 -0800 - - ATLEDGE-487 CurieEEPROM library - - -Initial commit for CurieEEPROM library - -Implements EEPROM functionality using an available area of the ROM - -supports both BYTE and DWORD reading/writing - -commit b19562438ca48b50a4e505d786d522900d9300fd -Merge: 23e6f16 6fc749d -Author: Calvin Park -Date: Wed Jan 6 15:45:42 2016 -0800 - - Merge pull request #90 from sandeepmistry/imu-api - - Add new API's and examples to CurieIMU - -commit 23e6f16a539bfc4b3fef5b76e1787a66d3966a76 -Author: Sidney Leung -Date: Mon Dec 21 12:12:18 2015 -0800 - - Jira-462: Call Available() after calling end() indicated data available. - - Code Modifications: - - 1. Added checking of device open in these routines: available, read, peek. - Will return 0 or -1 if device is not opened to indicate invalid operation. - -commit 46519997e46f5088d627e537086cab14e8e14e6d -Author: Krzysztof Sywula -Date: Tue Dec 22 16:55:54 2015 -0800 - - dtostrf: fix overflow problem - - JIRA: ATLEDGE-315 - -commit 6fc749d08dfe770992fe3f50d3073260960c98d9 -Author: Sandeep Mistry -Date: Mon Dec 21 13:46:04 2015 -0500 - - Remove calibration steps from accelerometer and gyro examples - -commit af28e53e5b3280f4188cc2c379bacf24cd454bb7 -Author: Sandeep Mistry -Date: Mon Dec 21 13:43:50 2015 -0500 - - Use int for accelerometer and gyro API's instead of short - -commit c84af94b39a1efbf3afee132ac49469935b0aa7e -Author: Sandeep Mistry -Date: Mon Dec 21 13:32:14 2015 -0500 - - Remove call to setIntEnabled, attachInterrupt enables interrupts - -commit 44fe3307074cb4f5648dbba5718f893b7a4098f4 -Author: Sandeep Mistry -Date: Mon Dec 21 12:10:45 2015 -0500 - - Rename CurieImu to CurieIMU - -commit 6557caf258f6d4cef6048036a6cdf15c4fa2a882 -Author: Sandeep Mistry -Date: Mon Dec 21 11:37:59 2015 -0500 - - Add accelerometer orientation example - -commit a50c6b649f093f6d5dbb19e9e376f700976b833e -Author: Sandeep Mistry -Date: Mon Dec 21 11:12:32 2015 -0500 - - Update example header - -commit 7e628f15227d24c81c4f42bfe1f3cb351bdb8f78 -Author: Sandeep Mistry -Date: Mon Dec 21 11:12:16 2015 -0500 - - Initial gyroscope example - -commit cfd445144984d9aaaf3995f257cc5db0e14f04af -Author: Sandeep Mistry -Date: Mon Dec 21 10:57:14 2015 -0500 - - Correct typo in example, az was printed instead of ax - -commit e8a13f7c205de09fa50e90946e9634ef0d6e1562 -Author: Sandeep Mistry -Date: Mon Dec 21 10:52:38 2015 -0500 - - Add accelerometer only example - -commit c45ece5a1392b6f0cc7cfdd202b11cc1f87e9d30 -Author: Sandeep Mistry -Date: Mon Dec 21 10:50:17 2015 -0500 - - Rename readAcceleration and readRotation API's to readAccelerometer and readGyro - -commit 162e0cfbbde7b3e7b8c63daa9444507c02917cbe -Author: Sidney Leung -Date: Tue Dec 15 11:12:47 2015 -0800 - - Jira-32 and Jira-386. CurieTimerOne lib - -commit 1e30828bac4a73ef240f1bf8df8aa5e1a2ff1ff3 -Author: Sandeep Mistry -Date: Fri Dec 18 17:46:47 2015 -0500 - - Use if statements instead of switch for a few API's - -commit f6d1516068c33085766dfa042fe843f69511277c -Author: Sandeep Mistry -Date: Fri Dec 18 17:26:19 2015 -0500 - - Sketch auto format - -commit 5e3605e67ef21d1b59fc5d3d7e7f034c674d6477 -Author: Sandeep Mistry -Date: Fri Dec 18 17:15:06 2015 -0500 - - Keyword updates from Helena - -commit ef3ccb5aebee42c2497631b8e7b77ecd5b5c2359 -Author: Sandeep Mistry -Date: Fri Dec 18 17:10:10 2015 -0500 - - Update example to use enums - -commit 0faeb636cda253ad2768af7db12df42b3c689aa0 -Author: Sandeep Mistry -Date: Fri Dec 18 17:09:13 2015 -0500 - - Add set/get gyro/accelerometer rate API's, and map more BMI160 enums - -commit 38f928fff483abfba10927610f889e022779f52a -Author: Sandeep Mistry -Date: Fri Dec 18 16:33:34 2015 -0500 - - Use enums for accelerometer and gyro ranges - -commit e5a1c21005d0f6049008e8856481c4642b5227ef -Author: Sandeep Mistry -Date: Fri Dec 18 15:34:39 2015 -0500 - - Example updates from Helena - -commit 0b57d5eea31457d9bef2bf4df76a8c1dcc0b92da -Author: Sandeep Mistry -Date: Fri Dec 18 15:34:02 2015 -0500 - - Add Arduino style API's for IMU, rename CurieImu to CurieIMU - -commit b5c27aef2d78d264733f1056a070ca49de407f2e -Author: Dino Tinitigan -Date: Tue Dec 15 16:11:48 2015 -0800 - - ATLEDGE-429 CurieSoftwareSerial fixes - - -Creating a new CurieSoftwareSerial object no longer break functionality - of previous ones. - -Minor Cleanup - -commit f9d1d5c5c26d615f08775d9bffd8bd58b5fd75a1 -Author: Martino Facchin -Date: Thu Dec 17 15:58:56 2015 +0100 - - hardcode sketchUploader version - - while we solve the bug IDE-side, it is safe to revert using the hardcoded version number to handle the sketchUploader installation; - This solves a clash with outdeted Galileo/Edison core which tools are picked randomly (depending on json download order and java filesystem library internal ordering). - -commit 520f922f28c53d22be751dc0e8fe60e9466fb548 -Author: Kevin Moloney -Date: Tue Dec 15 14:59:42 2015 +0000 - - ATLEDGE-426/ATLEDGE-445 CurieImu missing functions - - * Removed CurieImu.getZeroShockDetected() & CurieImu.getZeroMotionDetected(). - * Functions replaced with CurieImu.getIntShockStatus() & CurieImu.getIntZeroMotionStatus(). - - * Implemented getStepDetectionMode(). - * There was no means of verifying setStepDetectionMode(). - - Signed-off-by: Kevin Moloney - -commit 4422bce4466f9350baeed33a2b36b97fdde5694b -Author: Dino Tinitigan -Date: Wed Dec 9 15:09:55 2015 -0800 - - AGM-157 Add support for _BV() macro - - Add support for _BV() macro - -commit 0c1ba8baef33e74383c0be797955baf386d5c4aa -Merge: 44bc8db b3273bd -Author: Calvin Park -Date: Mon Dec 14 16:55:28 2015 -0800 - - Merge pull request #84 from sandeepmistry/rtc-api - - Rename CurieRTC to CurieTime and integrate some Processing/Time lib API's - -commit b3273bd9cec3f721e9958a768456965c3a7fe5b2 -Author: Sandeep Mistry -Date: Mon Dec 14 19:26:13 2015 -0500 - - Update name in keywords.txt - -commit d0c2800286ecf575fa900d9210d7473c9e68ba04 -Author: Sandeep Mistry -Date: Mon Dec 14 14:30:26 2015 -0500 - - Simplify SetTime example, use hard coded time - -commit e5072e27a530a68acda9fe84fb96abaf1f31faac -Author: Sandeep Mistry -Date: Mon Dec 14 14:27:15 2015 -0500 - - Add API's to convert epoch time to date/time component - -commit 304c733e07f4306c89533d5a36bc714cb43683ba -Author: Sandeep Mistry -Date: Mon Dec 14 14:03:13 2015 -0500 - - Rename CurieRTC to CurieTime - -commit 4d9c07eb44178b0afb185f247de561da87d8aa3d -Author: Sandeep Mistry -Date: Mon Dec 14 12:06:45 2015 -0500 - - Make current count value and counter load registers volatile - -commit b872431e1df13cebb07cef8b2d85bc0906202462 -Author: Sandeep Mistry -Date: Mon Dec 14 11:48:01 2015 -0500 - - Parse date and time strings using Arduino string class instead of sscanf - -commit ed69e4f8c0f57db4c910b84d65d93d67e716766b -Author: Sandeep Mistry -Date: Mon Dec 14 11:27:42 2015 -0500 - - Auto format - -commit 7bb2c23d0db4503d59cfeab00b7f12be8c8ff32c -Author: Sandeep Mistry -Date: Mon Dec 14 11:06:09 2015 -0500 - - Change CurieRTC lib to have Processing style time API's based on the RTC value - -commit 23a1c3b18c45abf82fd9b13393497d83c4496056 -Author: Sandeep Mistry -Date: Mon Dec 14 10:34:41 2015 -0500 - - Remove bundled time library - -commit 44bc8db8808ede092e85dcdb67c3f03b9f24c59f -Author: Krzysztof Sywula -Date: Fri Dec 11 15:32:34 2015 -0800 - - Fixed comparison between uint32 and int32 - - JIRA: ATLEDGE-457 - - Servo.cpp warning - -commit 51c7f7d9145e11f834a4fae290c6693cb871e3fb -Merge: e093df3 956aac4 -Author: Calvin Park -Date: Mon Dec 7 14:17:16 2015 -0800 - - Merge pull request #81 from sandeepmistry/arduino-ble-peripheral-api - - Initial port of BLEPeripheral style API to CurieBle library - -commit e093df3e60fca0338fe23c46ed3e34bb078ef5df -Merge: 39881ec f6c59c1 -Author: Calvin Park -Date: Mon Dec 7 13:16:24 2015 -0800 - - Merge pull request #80 from sandeepmistry/imu - - CurieImu examples updates and keywords.txt - -commit 956aac4612d5b81da30de7c5621596fa3c8d2be1 -Author: tigoe -Date: Thu Dec 3 23:33:37 2015 -0500 - - Style changes to IMU examples - - Note: IMU Library API still needs to be standardized. - -commit 744e66ebb2de90cfbe48d9d3f3497c18f74efddc -Author: Sandeep Mistry -Date: Fri Dec 4 12:43:53 2015 -0500 - - Shorten local name in examples - -commit 44cd7e505e59644a3fca7303b316293372580f9f -Author: Sandeep Mistry -Date: Fri Dec 4 10:45:47 2015 -0500 - - Update note on local name - -commit b272315dfe91418c79ee6ce445144ca3178a2571 -Author: Sandeep Mistry -Date: Fri Dec 4 10:37:13 2015 -0500 - - Misc example updates - -commit 93ce2bb743a166a88e1cd9e52bfe1d24be005f83 -Author: Sandeep Mistry -Date: Fri Dec 4 10:23:43 2015 -0500 - - Correct case of include - -commit ccfaa837fd5810424474bf4a045ae17837fe4b1f -Author: Sandeep Mistry -Date: Fri Dec 4 10:12:52 2015 -0500 - - Correct setDeviceName - -commit 3c848247e8be8dd1b9c9622ebb4cb09fc2e6379e -Author: Sandeep Mistry -Date: Fri Dec 4 09:27:17 2015 -0500 - - Remove AutomationIO example - -commit 3b8efcc191ecbea77096f116195667fde19d85e4 -Author: tigoe -Date: Thu Dec 3 22:24:01 2015 -0500 - - Style changes to BLE library examples - -commit a5c7f84f29a4f3c14594d50695f372702abec940 -Author: Sandeep Mistry -Date: Thu Dec 3 17:01:21 2015 -0500 - - Correct incorrect read permissions for non-writable characteristics - -commit c6924337ea3cb561a950cf0f08accf8696b6f59c -Author: Sandeep Mistry -Date: Thu Dec 3 16:55:03 2015 -0500 - - Dynamically allocate characteristic and descriptor data buffers - -commit 040b63b1d23533774edf7cb46604740bbe92d2ff -Author: Sandeep Mistry -Date: Thu Dec 3 16:54:28 2015 -0500 - - Set initial value of characteristics - -commit 479e8600a665ad21b3b6181997ce871b100c94f4 -Author: Sandeep Mistry -Date: Thu Dec 3 16:50:16 2015 -0500 - - Sent initial value of switch characteristic - -commit 6d6a0c6e5b681c6be61a110d0fe4309c5a38b2a7 -Author: Sandeep Mistry -Date: Thu Dec 3 16:47:18 2015 -0500 - - Set initial value of switch characateristic - -commit ce32c92177a01fd6be5688bf693050d225570ace -Author: Sandeep Mistry -Date: Thu Dec 3 16:40:57 2015 -0500 - - Remove while(!Serial) - -commit b6eea7463bd84ec516f56f98f50fd0f424460060 -Author: Sandeep Mistry -Date: Thu Dec 3 16:31:11 2015 -0500 - - Use bool for public API's return types instead of BleStatus type - -commit 1596dc12e3ca099d483d52476c3c8378ad8d7c3a -Author: Sandeep Mistry -Date: Thu Dec 3 15:47:57 2015 -0500 - - Change public API types to use non-stdint types - - as per https://www.arduino.cc/en/Reference/HomePage - -commit 026f4c044879ae294e3c41aa0fe5d16336feefdf -Author: Sandeep Mistry -Date: Thu Dec 3 15:34:42 2015 -0500 - - Replace battery monitor example with new version - -commit 7767d3d6c42fb1c555ac68a5c9e687b33e6afbd8 -Author: Sandeep Mistry -Date: Thu Dec 3 15:31:15 2015 -0500 - - Rename Ble prefixes to BLE - -commit ee0ae446682773bbd8b240de2d03a0627096e87c -Author: Sandeep Mistry -Date: Thu Dec 3 14:50:40 2015 -0500 - - Separate device name from advertised local name - -commit c23609225aee221ed7ad83429b186826b55baca7 -Author: Sandeep Mistry -Date: Thu Dec 3 14:34:20 2015 -0500 - - Don't advertise the device appearence - -commit 661fc89a9981932103c2a0cc96d46becd6177018 -Author: Sandeep Mistry -Date: Thu Dec 3 14:29:37 2015 -0500 - - Correct advertised service uuid - -commit fe78397481705f520627c860db257ad62a9c5d72 -Author: Sandeep Mistry -Date: Thu Dec 3 14:08:36 2015 -0500 - - Correct presentation format descriptor handling - -commit c1882ee3119a3754378ed7f085c6ab19f53843ab -Author: Sandeep Mistry -Date: Thu Dec 3 12:54:37 2015 -0500 - - Add special handling for 0x2902 and 0x2904 descriptors - -commit 8ee6a0264c81f9534633234b9ff8e809c37abbe0 -Author: hbisby -Date: Thu Dec 3 17:56:19 2015 +0100 - - variable name changed from switchCharacteristic to ledCharacteristic - -commit e0139b68668f891b4ccd6ef166db67c20c172686 -Author: Sandeep Mistry -Date: Thu Dec 3 11:51:58 2015 -0500 - - Add delay(1) in poll - -commit 1b4f5134b152fc062c2f7d2d2aa29f1dfdcb1218 -Author: Sandeep Mistry -Date: Thu Dec 3 10:41:51 2015 -0500 - - keywords.txt updates - -commit 855737bc879868ea759c4eed46ec9420c886752a -Author: Sandeep Mistry -Date: Thu Dec 3 10:41:33 2015 -0500 - - Change internals to use less private friends, add comments in header files, make var types more consistent - -commit 6c946eda6d1ccd4a610e91ab99babbe7924832ca -Author: Sandeep Mistry -Date: Thu Dec 3 10:33:37 2015 -0500 - - User serial baud rate of 9600 for all examples - -commit df691a9ff790a9cf020878104dc138c9c0aeda66 -Author: Sandeep Mistry -Date: Thu Dec 3 10:28:29 2015 -0500 - - Rename with capital B - -commit f68199943d2c525cb3d6fdcbd0cfaf07427aa18b -Author: Sandeep Mistry -Date: Thu Dec 3 10:21:48 2015 -0500 - - Correct UUID - -commit 90886c696057dfd2fb95edeb60502b82c96f8d48 -Author: Sandeep Mistry -Date: Thu Dec 3 10:06:52 2015 -0500 - - Correct include filename - -commit 03673b47fa1cc950734baffb9bb8313629c366f9 -Author: Sandeep Mistry -Date: Wed Dec 2 16:57:46 2015 -0500 - - Use dashed UUID in example - -commit 940374fa55bae556ac093bad2cf6a200529150f2 -Author: hbisby -Date: Wed Dec 2 15:44:59 2015 +0100 - - changed format of long UUIDs - -commit 3d3f973329d08a4f617da27e30f03abed12c4335 -Author: hbisby -Date: Wed Dec 2 15:26:01 2015 +0100 - - ported examples from BLEPeripheral buttonLED and callbackLED - -commit 2581cffca43521c85d5c0101cf3c57878397930e -Author: Sandeep Mistry -Date: Tue Dec 1 17:29:47 2015 -0500 - - API Cleanup - -commit 03c82d3babe18a2fbae49abd49ec9f72cb9127a2 -Author: Sandeep Mistry -Date: Tue Dec 1 16:03:57 2015 -0500 - - Add new LED example - -commit 6e5a9dee80787f90c47435901792c27c2b2687a1 -Author: Sandeep Mistry -Date: Tue Dec 1 15:20:24 2015 -0500 - - Add written and subscribed API's to BleCharacteristic, pass central into BleCharacteristic even handers, remove BleAck event for now - -commit cd54545dc25a0a47cddbfc7722d24f626db12cb2 -Author: Sandeep Mistry -Date: Tue Dec 1 10:47:07 2015 -0500 - - Update previousMillis in example - -commit 3d3f65f2135bef419ce82dcc06690f251419f258 -Author: Sandeep Mistry -Date: Tue Dec 1 10:31:12 2015 -0500 - - Reverse UUID conversion loop - -commit 4dfc0a4f68b7cf7c57f05d5ae6a6770b8e718509 -Author: Sandeep Mistry -Date: Mon Nov 30 17:52:10 2015 -0500 - - Experimental BatteryMonitor example sketch with new API - -commit 99ab222ec39c31e2c27ba8962f4022c499b341b6 -Author: Sandeep Mistry -Date: Mon Nov 30 17:49:47 2015 -0500 - - BleCharacteristic event handler API's - -commit d4efbb2cf9f86ece8804877b268f8ce00f40b736 -Author: Sandeep Mistry -Date: Mon Nov 30 17:20:28 2015 -0500 - - Make descriptor BleCharacteristic API's private - -commit 06a05c2a86886ee4deab539d76a23e85798b0449 -Author: Sandeep Mistry -Date: Mon Nov 30 15:49:12 2015 -0500 - - More keyword.txt updates - -commit e01b7bf4d56a771c3ff3d9db9b1d26de05160a5e -Author: Sandeep Mistry -Date: Mon Nov 30 15:48:30 2015 -0500 - - BlePeripheral event handler rename, and misc var name consistency - -commit 69697e3670a813cfb6a5912d35e80427012f7645 -Author: Sandeep Mistry -Date: Mon Nov 30 15:21:46 2015 -0500 - - Add typed characteristics - -commit be1fcea44f1b9266a88de7d97b341ca4125585fe -Author: Sandeep Mistry -Date: Mon Nov 30 14:13:03 2015 -0500 - - Change return type of BleCentrall::address a C string, make getLocalAddress private for now - -commit 2fb56144f09631a97e73b86f3ffeae5289497f10 -Author: Sandeep Mistry -Date: Mon Nov 30 13:13:11 2015 -0500 - - Whitespace formatting - -commit a711fa2a7bc1cb0cbeaae4b179010b4c2e5ed326 -Author: Sandeep Mistry -Date: Mon Nov 30 13:12:57 2015 -0500 - - Allow BleCharacteristic::setValue to be called before begin - -commit b06df63df5e01de9a13ceddb74dad9fb15d3b821 -Author: Sandeep Mistry -Date: Mon Nov 30 12:24:52 2015 -0500 - - Introduce BleUuid, UUID's are now strings externally - -commit 67d47f330d4e8de2999a4c82f25eed2c3c4c4e45 -Author: Sandeep Mistry -Date: Mon Nov 30 11:38:22 2015 -0500 - - Change begin to return BleStatus - -commit a1d134b6e8fc2ba15b2df3a28244facb5d7d4bd9 -Author: Sandeep Mistry -Date: Mon Nov 30 11:00:33 2015 -0500 - - Add BleAttibute class and add new public addAttribute API - - Make addPrimaryService and getState API’s private. As well as, - BleService::addCharacteristic, BleService::addSecondaryService, and - BleCharacateristic::addDescriptor. - -commit e136ce82f377896cd8f442fe626682654cb9086b -Author: Sandeep Mistry -Date: Fri Nov 27 17:24:26 2015 -0500 - - Expose characteristic properties instead of access and notify mode - -commit 6d101d6288c9bad8960c73fafa40f54692e55333 -Author: Sandeep Mistry -Date: Fri Nov 27 16:45:50 2015 -0500 - - Split up GAP event callback registration - -commit bf3d0bbe1886be69b0b9fedac2a3c73a0cac59e0 -Author: Sandeep Mistry -Date: Fri Nov 27 15:55:22 2015 -0500 - - More keywords - -commit dbdebdb84f982c1edd8e9088e7b3d71a8534b7aa -Author: Sandeep Mistry -Date: Fri Nov 27 15:55:08 2015 -0500 - - Add BleCentral class, disconnect API, split out BleAddress - -commit 4e2a4d7d64669448ea4edcfbd10f6194041a6a9a -Author: Sandeep Mistry -Date: Fri Nov 27 14:12:03 2015 -0500 - - Add setAdvertisedServiceUuid API, and remove param to advertise from addPrimaryService - -commit 2881aa5175d2e0120a4c25dbf8188a589709405d -Author: Sandeep Mistry -Date: Fri Nov 27 14:11:11 2015 -0500 - - Add uuid method to BleService - -commit e7b71f54697a90f1b27e306817142a502cfd0690 -Author: Sandeep Mistry -Date: Fri Nov 27 13:47:49 2015 -0500 - - Rename set/getName to set/getLocalName - -commit ff11e027d85ae5fc312bb87509b65c0f87e62729 -Author: Sandeep Mistry -Date: Fri Nov 27 13:41:00 2015 -0500 - - Add poll API (no-op for now) - -commit 60f6c475aa6b0cd3fe6e366adebc2d9ae4924c7b -Author: Sandeep Mistry -Date: Fri Nov 27 13:37:21 2015 -0500 - - Add begin and end API's - -commit 6d5aa275c531c4fb180256f86e5ede51158710f5 -Author: Sandeep Mistry -Date: Fri Nov 27 13:31:18 2015 -0500 - - Rename bleDevice variable to blePeripheral - -commit 08fd946c6d1632198f4f3bc40d21ac8bb425c70e -Author: Sandeep Mistry -Date: Fri Nov 27 13:28:13 2015 -0500 - - Initial keywords.txt - -commit e8bdd87b7b0cf9ee3d993b2c5542f7593272c41b -Author: Sandeep Mistry -Date: Fri Nov 27 13:28:01 2015 -0500 - - Rename BleDevice.* files to BlePeripheral.* - -commit 7eea01f3e26eda828208ee64068dde040b253e88 -Author: Sandeep Mistry -Date: Fri Nov 27 13:22:31 2015 -0500 - - Add CurieBle.h for main lib header - -commit f6c59c14f95772fa3d6de4b8dfdc697cf8867b0d -Author: Sandeep Mistry -Date: Fri Dec 4 11:53:02 2015 -0500 - - Change CurieImu and BMI160 to KEYWORD2 - -commit 3642f44a88069e89cd644faabae8c72da78a2bfd -Author: hbisby -Date: Fri Dec 4 17:40:59 2015 +0100 - - added defines and classes to keywords.txt - -commit d8618b23ede8b769ecfe8cafee0695c2eea60956 -Author: hbisby -Date: Fri Dec 4 17:02:10 2015 +0100 - - adding keywords.txt for CurieImu library - -commit 262fd1e2940498c00d9871a455de21be1c73785f -Author: tigoe -Date: Thu Dec 3 23:33:37 2015 -0500 - - Style changes to IMU examples - - Note: IMU Library API still needs to be standardized. - -commit 39881ec83254758186e58c8e291b05ff09f6151e -Author: Dino Tinitigan -Date: Thu Dec 3 13:16:44 2015 -0800 - - ATLEDGE-393 Update SD library - - Rebase library from version 1.05 to 1.06 - Fixes issue with passing String class object to SD.exists() - -commit bca4512908095a1c6f04a1c975849080861ff609 -Author: Dino Tinitigan -Date: Wed Dec 2 11:01:11 2015 -0800 - - ATLEDGE-423 Export compiled binary - - Make changes to platform.txt to allow exporting compiled binary as a - .hex - -commit 3c833b2536b4616b38ef342289bb5efb440b6769 -Author: Dino Tinitigan -Date: Tue Dec 1 11:52:57 2015 -0800 - - ATLEDGE-442 Fix some SoftwareSerial Rx limitations - - Fixed some limitations for Rx on SOC_GPIO pins. - Rx should now be functional on all pins except pin 13. - -commit 0b100b2d006add6692a76d1658ca04b317b640a6 -Author: Dino Tinitigan -Date: Wed Nov 25 21:24:00 2015 -0800 - - Atledge-184 Minor improvements to SoftwareSerial library - - Minor improvements to SoftwareSerial library - -commit 7150436d89ca73fa7af68cd81c312203a7da4d4a -Author: Dino Tinitigan -Date: Wed Nov 25 19:14:24 2015 -0800 - - CurieRTC - SetTime example not setting RTC - - RTC not being set because the wrong call was being made should call - RTC.set(t) to set the hardware RTC instead of setTime(t). - -commit 25acb322cad8505f9564ca435b0e113bf5b5d9df -Author: Calvin Park -Date: Wed Nov 25 16:28:00 2015 -0800 - - Fixed typo in old IDE version error message - -commit fc55eedd7ce7fafbc5b0dd35c61ed12f22c0f26c -Author: Krzysztof Sywula -Date: Tue Nov 24 17:03:18 2015 -0800 - - ATLEDGE-455 verbose/quiet selection for upload - -commit 4984085e655687db615b3a9675ee374fba8d6cad -Author: Martino Facchin -Date: Wed Nov 25 16:37:28 2015 +0100 - - Add error message if using IDE 1.6.6 - -commit 69a88721160920cbd77b26836fc97a0549f87db4 -Author: Martino Facchin -Date: Wed Nov 18 10:59:59 2015 +0100 - - Fix recipe.ar.pattern to avoid warning at startup - -commit a22ea571d1863e3869ec5e9f29936d00822b8dcb -Author: Dino Tinitigan -Date: Tue Nov 24 14:01:14 2015 -0800 - - ATLEDGE-444 Fix Library warnings for Arduino IDE 1.6.6 - - Some libraries were missing the "category" field in library.properties - Minor fixes in some libraries for 1.6.6 compatibility - -commit 5c29db6c5b00b32d7f4d2379c3e89d9fdcc076d6 -Author: Dino Tinitigan -Date: Tue Nov 24 10:30:05 2015 -0800 - - ATLEDGE-396 Fix behavior of analogWrite() on non PWM pins - - For all non PWM pins, the behavior of calling analogWrite() should be - logic 0 if the value is 127 or less. For values of 128 or above, the pin - should go to logic 1. - -commit 7afbd91dd8c0aa2b39fbe696c0dcb506e28fddd6 -Author: Dino Tinitigan -Date: Mon Nov 23 18:09:53 2015 -0800 - - ATLEDGE-416 Fix some compile issues with Time.h - - Fix some issues with compiling Time.h by updating to version 1.50 of - Time library - Also removed some examples that will not compile for Arduino101 - -commit c7b04f7d7915407f5194f42abf3dcfc691cd23d8 -Author: Dino Tinitigan -Date: Mon Nov 23 16:07:16 2015 -0800 - - ATLEDGE-384 Remove Esplora specific examples - - Remove Esplora specific examples - -commit 2beea3e778b05e985ac7daacce86fb94847c054e -Author: Brian Baltz -Date: Fri Nov 6 10:33:12 2015 -0800 - - Resolving KW issue with SoftwareSerial destructor - - Signed-off-by: Brian Baltz - -commit b30a275c7221b614071767772e72b98ce93b7ed2 -Merge: 78afaae 3759bcd -Author: Calvin Park -Date: Thu Nov 5 11:05:04 2015 -0800 - - Merge pull request #62 from kevin306/testing - - Klocwork issues - -commit 3759bcd7fc648ae686de973af3df50f92e2dff9f -Author: Kevin Moloney -Date: Thu Nov 5 17:39:14 2015 +0000 - - Fix Klocwork#2051,2060: Array may be outside index - - Change && to || - - Signed-off-by: Kevin Moloney - -commit 5baa3fc6386781a784148fdf2b3fc65476416f05 -Merge: afcc4ef 344f90d -Author: Kevin Moloney -Date: Thu Nov 5 12:45:34 2015 +0000 - - Merge branch 'testing' of github.com:kevin306/corelibs-arduino101 into testing - - Conflicts: - libraries/CurieBle/src/BleCharacteristic.cpp - -commit afcc4efd16a7c7b9d915913d641a76f0b448eb3d -Author: Kevin Moloney -Date: Tue Nov 3 15:38:37 2015 +0000 - - Fix Klocwork#2051,2060: Array may be outside index - - * Added check to ensure _data_len is within index values. - - * Had to repeat the branch statement rather than move it because of memcpy. - - * Fixed bug introduced(c8ecd5f) in WString.h when "len" became protected. - - Signed-off-by: Kevin Moloney - -commit 344f90d892d33c47f121cc374643c5e28b51bbdd -Author: Kevin Moloney -Date: Tue Nov 3 15:38:37 2015 +0000 - - Fix Klocwork#2051,2060: Array may be outside index - - * Added check to ensure _data_len is within index values. - - * Had to repeat the branch statement rather than move it because of memcpy. - - Signed-off-by: Kevin Moloney - -commit 78afaae4c7f189dc44ec83d19745dc4bb4e7f6ac -Author: Dino Tinitigan -Date: Mon Nov 2 10:48:45 2015 -0800 - - ATLEDGE-229 CurieRTC and Time Library - - Initial implementation of the CurieRTC library for the built-in RTC - Includes the Time library plus 3 new examples for the Arduino101 - -commit cacac37db51b7212b92f3e90ff944006771860c4 -Author: Bogdan Pricop -Date: Thu Oct 29 22:28:12 2015 +0000 - - Fix Klocwork#137: Non-void function does not return value - - Change getTimeStampClks() implementation from assembly to C. - - Signed-off-by: Bogdan Pricop - -commit 8fa6bbaa920005ea42f738f305bcd4852c822a1b -Author: Dino Tinitigan -Date: Wed Oct 28 16:28:50 2015 -0700 - - ATLEDGE-184 SoftwareSerial Library - - Port of SoftwareSerial Library for Arduino101 - Tx works up to 384000 bps - Rx works up to 57600 bps - -commit 2ae262a2a87d0d85032da3d975e7f1385a02ea75 -Author: Kevin Moloney -Date: Thu Oct 29 14:41:28 2015 +0000 - - Fix Klocwork#2051,2060: Array may be outside index - - * Added check to ensure _data_len is within index values. - - * Had to repeat the branch statement rather than move it because of memcpy. - - Signed-off-by: Kevin Moloney - -commit 739c4007ba9c4b7a77d57628eb9ea31ab204d880 -Author: Kevin Moloney -Date: Wed Oct 28 16:47:44 2015 +0000 - - Fix Klocwork#543,544: Buffer overflow/null pointer - - * Added a check to ensure array does not access index value of -1. - - * Added a check for this null pointer. - - Signed-off-by: Kevin Moloney - -commit dd4845e5d4f7dca461587d8bc0cc998598b060bc -Author: Kevin Moloney -Date: Wed Oct 28 16:44:45 2015 +0000 - - Fix Klocwork#2081,2082: Uninitialized variable. - - * using memset to initialize struct to zero. - - Signed-off-by: Kevin Moloney - -commit 79744c4255d4c33d21b79bbc6f99922476ad3adf -Author: Kevin Moloney -Date: Wed Oct 28 16:40:38 2015 +0000 - - Fix Klocwork#79,80,81,82: Uninitialized Variable. - - * using memset to initialize struct to zero. - - Signed-off-by: Kevin Moloney - -commit 79008fa1132cd1c9790c50a3f96232f54774a1dd -Author: Kevin Moloney -Date: Wed Oct 28 16:38:07 2015 +0000 - - Fix Klocwork#671: Infinite loop. - - * Added comment to verify requirement for infinite loop. - - Signed-off-by: Kevin Moloney - -commit cfe0a5df34a7f8b94724a9b99f02b5e62e42854b -Author: Kevin Moloney -Date: Wed Oct 28 16:33:00 2015 +0000 - - Fix Klocwork#105: Pointer returned may be null. - - * Added a check for this null pointer. - - Signed-off-by: Kevin Moloney - -commit 5e71e700d4d1b66f9e68fc725653db9859660255 -Author: Kevin Moloney -Date: Wed Oct 28 16:30:11 2015 +0000 - - Fix Klocwork#100: Infinite loop. - - * Added comment to verify requirement for infinite loop. - - Signed-off-by: Kevin Moloney - -commit db2995a78d772adb072ce743e77eece69a01d0d8 -Author: Kevin Moloney -Date: Wed Oct 28 16:28:23 2015 +0000 - - Fix Klocwork#91: Infinite loop - - * Added comment to verify requirement for infinite loop. - - Signed-off-by: Kevin Moloney - -commit 62395e48e858c433a88c20523481382e90be21a3 -Author: Kevin Moloney -Date: Wed Oct 28 16:25:14 2015 +0000 - - Fix Klocwork#1093: Infinite loop. - - * Added comment to verify requirement for infinite loop. - - Signed-off-by: Kevin Moloney - -commit b3afd60a73d2fa8ead92ffa8e66a264e64bafd12 -Author: Bogdan Pricop -Date: Wed Oct 28 14:19:45 2015 +0000 - - Fix Klocwork#137: Non-void function does not return value - - Move getTimeStampClks() function to an *.S file - It is fully implemented in assembly and we take care of returning value by - filling in the proper value in the proper registers. - - Signed-off-by: Bogdan Pricop - -commit 0e094210f3d645b109adceb393a00b0b41acdf80 -Author: Martino Facchin -Date: Thu Oct 29 09:54:33 2015 +0100 - - fix BLE library String handling - - the correct way to get a String lenght is by calling String.length() - now len field is protected so a compilation error will be triggered - -commit 0ffb9749afb8dc53abd628e00ced6af07d0c97d1 -Merge: b17f321 6f35dfd -Author: Calvin Park -Date: Wed Oct 28 17:03:31 2015 -0700 - - Merge pull request #58 from facchinm/new_delete - - Fixes to pass validation with test suite - -commit 6f35dfd332c30b135c14d1f718f923299d7e6695 -Author: Martino Facchin -Date: Wed Oct 28 12:53:47 2015 +0100 - - stdlib_noniso: expand all functions up to base 36 - - needed to pass a very strict test - Porting of latest Due implementation - -commit f07a20aa02e5421b1fc6e9775fdeb2221c8bd2a7 -Author: Martino Facchin -Date: Wed Oct 28 12:50:35 2015 +0100 - - remove misleading SERIAL_PORT_USBVIRTUAL define - - the Serial via USB port is not a real virtual cdc port (it still emulates an Hardware Serial), remove to avoid sketches getting confused and expect CDC flow control functions - -commit c8ecd5f0af6c87fdd02382f0cab275d83da31f2c -Author: Martino Facchin -Date: Tue Oct 27 18:01:17 2015 +0100 - - Sync IPAddress and Wstring with SAM implementation - - Test suite failed on these functions - -commit d179695b0494b96cc1feb963905ee8fea9a7d2a5 -Author: Martino Facchin -Date: Tue Oct 27 15:41:24 2015 +0100 - - Add new/delete implementations - - This is needed to pass C++ validation in test suite - -commit b17f321e32464222ff433afa69af2ba3fe0149c5 -Author: Martino Facchin -Date: Tue Oct 27 15:40:30 2015 +0100 - - Specify architecture in library properties - - to avoid conflicts with standard libs - -commit cd4f66d4620a8aabb4bfb966fe6564a367a24f32 -Author: Dan O'Donovan -Date: Thu Oct 22 17:50:32 2015 +0100 - - libarc32drv_edu.a: Update of pre-compiled driver library. - - Signed-off-by: Dan O'Donovan - -commit 95174ce3dd682621e1f74ef0e04e818b0ff1dce3 -Author: Dan O'Donovan -Date: Thu Oct 22 17:47:07 2015 +0100 - - build: unused global variables in header file causing BLE build failure - - factory_data.h defines 2 global variables which aren't actually used anywhere. - However, they become global symbols in any C files that include this header - file. For most builds, this header file is included only once but, for CurieBle - library builds, it is included by another C file as well. This causes a linker - error due to duplicate symbols in the final image. - - The simple solution is to just remove these variables, because they aren't used. - - Signed-off-by: Dan O'Donovan - -commit 7052d8fe88034c92bd845b818bd1c028adea0444 -Merge: 6efbac6 c5e9152 -Author: Brian Baltz -Date: Wed Oct 14 16:20:32 2015 -0600 - - Merge pull request #52 from 01org/arduino101-rename - - ATLEDGE-364 Rename EDU to Arduino 101 - -commit c5e915295c995aebc15ecab2a2538b6c3ab20f23 -Author: Brian Baltz -Date: Wed Oct 14 15:14:56 2015 -0700 - - ATLEDGE-364 Rename arduino_101_x to arduino_101 - - Signed-off-by: Brian Baltz - -commit 570a904927ca18737613dbee8f4640382dba0746 -Author: Brian Baltz -Date: Wed Oct 14 14:56:03 2015 -0700 - - Update pre-compiled library - - Signed-off-by: Brian Baltz - -commit d342223adc0676d5c39a0d89f9ab94d0cea5e56e -Author: Brian Baltz -Date: Wed Oct 14 14:55:55 2015 -0700 - - ATLEDGE-364 Remove CONFIG_BOARD_ATLASPEAK_EMU specific code - - Signed-off-by: Brian Baltz - -commit 6efbac63436af6e286aa4b5e09b30bbe4cebeb80 -Author: Manoel Ramon -Date: Tue Oct 13 15:49:41 2015 -0700 - - ATLEDGE-316 - isAlphaNumeric returns incorrect bool for '@' - -commit 31e75615c26a6d19c168fc16e6b44d4e9504c45b -Author: Kevin Moloney -Date: Wed Oct 14 12:11:13 2015 +0100 - - Missing examples folder in Wire library - - - Slave examples not relevant because AtlasPeak does not support - slave-mode I2C. - - - Examples included digital_potentiometer, master_reader, - master_writer, SFRRanger_reader. - - Signed-off-by: Kevin Moloney - -commit 4c04540989a546fb6b668f35cee49a272bed9019 -Author: Brian Baltz -Date: Tue Oct 13 16:01:50 2015 -0700 - - ATLEDGE-364 Rename EDU library folders - - Signed-off-by: Brian Baltz - -commit d7617aba523a269a0d8278ba758bbe706fdd74f3 -Author: Brian Baltz -Date: Tue Oct 13 15:56:24 2015 -0700 - - ATLEDGE-364 Rename EDU to Arduino 101 - - Signed-off-by: Brian Baltz - -commit 7436867a37228a6bdeecf87c80489187a99f01ed -Author: Manoel Ramon -Date: Wed Oct 7 22:10:55 2015 -0700 - - ATLEDGE-358 - BLE Broadcast name must read the product name in the OTP - -commit 94ea92298feee063539ed2ca791cdef826d71333 -Author: Kevin Moloney -Date: Tue Oct 13 14:42:51 2015 +0100 - - Updated libarc32 - - Signed-off-by: Kevin Moloney - -commit 5a1c28cd384e01c50068aca8c7b379b05bb50571 -Author: Kevin Moloney -Date: Tue Oct 13 14:36:32 2015 +0100 - - ATLEDGE 201 Pointer returned may be null - - Added a check for this null pointer. - - Signed-off-by: Kevin Moloney - -commit 45e6046f09e2c465c69456869cee6992792e4f55 -Author: Kevin Moloney -Date: Tue Oct 13 13:04:04 2015 +0100 - - Files no longer in use, can be removed. - -commit 15dbf74d82907eb0af47ad9c5ef682fa298b11f3 -Merge: 685eed6 aa8e01a -Author: Calvin Park -Date: Mon Oct 12 11:43:12 2015 -0700 - - Merge pull request #48 from Dan-Emutex/adafruit_libraries - - Adafruit libraries - -commit 685eed663cedc37c91855048c216872a479605ad -Author: Dan O'Donovan -Date: Fri Oct 9 16:49:22 2015 +0100 - - imu: revert commit b62bbfc89b - - This commit essentially reverts the changes made in b62bbfc89b. - That is, it removes some Accelerometer data sampling rates which - we don't support in the mode that we are using the Accelerometer - - Signed-off-by: Dan O'Donovan - -commit aa8e01a64fe31172758ee0b1c66b4a3ce521730b -Author: Dan O'Donovan -Date: Fri Oct 2 17:59:40 2015 +0100 - - dotstar: initial port to AtlasEdge - - Signed-off-by: Dan O'Donovan - -commit 4fee1cca6bac948cb010cadb6b9fba33d8fbc2c6 -Author: Dan O'Donovan -Date: Fri Oct 2 17:57:02 2015 +0100 - - dotstar: add DotStar library v1.0.1 from Adafruit - - - Adafruit_Dotstar Github repository: https://github.com/adafruit/Adafruit_DotStar - Tag: v1.0.1 - - Signed-off-by: Dan O'Donovan - -commit 6e2de131cbfd585cf027f41353a71707185a8bbd -Author: Dan O'Donovan -Date: Fri Oct 2 17:52:45 2015 +0100 - - motorshield: initial port to AtlasEdge - - Signed-off-by: Dan O'Donovan - -commit e671f3f6c3b134d6b326c671de255c2f47d83969 -Author: Dan O'Donovan -Date: Fri Oct 2 17:07:56 2015 +0100 - - motorshield: add Motor Shield V2 library v1.0.1 from Adafruit - - - Adafruit_Motor_Shield_V2_Library Github repository: https://github.com/adafruit/Adafruit_Motor_Shield_V2_Library - Tag: v1.0.1 - - Signed-off-by: Dan O'Donovan - -commit 146b0bf2912cf09735f2701564261bb06d2aa6b3 -Author: Dan O'Donovan -Date: Mon Sep 28 17:00:30 2015 +0100 - - neopixels: initial port to AtlasEdge - - Signed-off-by: Dan O'Donovan - -commit ca4d7f2530f4077d6d1108d450c32afaa9f7862a -Author: Dan O'Donovan -Date: Mon Sep 28 14:18:41 2015 +0100 - - neopixel: add Neopixel library v1.0.3 from Adafruit - - - Adafruit_Neopixel Github repository: https://github.com/adafruit/Adafruit_NeoPixel - Tag: v1.0.3 - - Signed-off-by: Dan O'Donovan - -commit 7d930a50dbfb0890b4bb0915fe34c5dc2bdd6d79 -Author: Dan O'Donovan -Date: Fri Oct 9 13:21:22 2015 +0100 - - imu: fixed and simplified (set|get)ZeroMotionDetectionDuration methods - - Validation feedback revealed logic errors in - setZeroMotionDetectionDuration and a lack of clarity on how it should - be used. Addressed by providing an explicit set of valid values for - the user to pass to the method, which can in turn be written directly - to the relevant register - - Signed-off-by: Dan O'Donovan - -commit 7134c41e2940db726cfa293f19e9207cc9b643a2 -Author: Dan O'Donovan -Date: Mon Oct 5 10:17:29 2015 +0100 - - imu: improve interrupt-safety of CurieImu API methods - - Ensure that SPI transfers cannot be interrupted, and - avoid use of global buffer to improve interrupt safety - - Signed-off-by: Dan O'Donovan - -commit 252bd5308f34dd442d9190d36bfbe7f7b1379402 -Author: Calvin Sangbin Park -Date: Mon Oct 5 15:26:15 2015 -0700 - - Updated libarc32 - -commit b1cbef53bbd79333c0df25816078a7eab4b441bc -Author: Dan O'Donovan -Date: Fri Oct 2 15:26:25 2015 +0100 - - imu: minor tidy-up of documentation for API enumeration values - - Signed-off-by: Dan O'Donovan - -commit b62bbfc89bc35b3a0a04de74f7e4898371922a83 -Author: Dan O'Donovan -Date: Fri Oct 2 14:31:57 2015 +0100 - - imu: add missing accelerometer sample rate options - - - The following sample rates were previously omitted: - - 25/32 Hz - - 25/16 Hz - - 25/8 Hz - - 25/4 Hz - - Signed-off-by: Dan O'Donovan - -commit 426367514593a075b3dc5d373dca10e82cf24112 -Author: Dan O'Donovan -Date: Fri Oct 2 14:28:22 2015 +0100 - - imu: remove invalid 3200Hz accelerometer sample rate option - - The maximum sample rate for the accelerometer is 1600Hz - - Signed-off-by: Dan O'Donovan - -commit c8c4d98b50644141b77868996e226fba167944c9 -Author: Dan O'Donovan -Date: Fri Oct 2 14:06:00 2015 +0100 - - imu: fixes/improvements needed for TapDetect example - - - Threshold was set incorrectly, leading to over-sensitive detection - - Default accelerometer range of 2g prevented detection of strong taps - - Added comments to explain the code in more detail - - Signed-off-by: Dan O'Donovan - -commit 23bd20fe1081edde07fca0a85718f5a52987abfc -Author: Dan O'Donovan -Date: Fri Oct 2 13:49:24 2015 +0100 - - imu: compile error in RawImuDataSerial.ino when CALIBRATE_ACCELGRYO_OFFSETS defined - - Signed-off-by: Dan O'Donovan - -commit 67629a6de0e9163f1a7631fa2ae28c9f5b9e4765 -Author: Dan O'Donovan -Date: Fri Oct 2 13:34:48 2015 +0100 - - imu: remove delay between bi-dir SPI transfers causing data loss - - A wait for TX to complete, followed then by RX, was causing data - loss due to the fact that it was waiting for the busy status flag - to clear after TX, but this doesn't clear until after RX is also - complete. The result was data loss due to RX FIFO overflow. - Fixed by disabling the wait between TX and RX steps. - - This affected functions requesting more than 8 bytes from the - BMI160, such as getMotion6() and getFIFOBytes() methods. - - Signed-off-by: Dan O'Donovan - -commit 599e33bf4bfd604f68e55252511075e078c673de -Author: Dan O'Donovan -Date: Thu Oct 1 12:55:05 2015 +0100 - - imu: fixed error in reg_write_bits - - - reg_write_bits was erroneously clearing all other bits in - a register outside of the bits targeted for the write - operation. - - Signed-off-by: Dan O'Donovan - -commit 17b8d04c60919d25ccac54d7cf2901c1d0f0e285 -Author: Dan O'Donovan -Date: Mon Sep 28 14:08:28 2015 +0100 - - imu: minor clean-ups - - - removed some dead code - - added/corrected some code comments - - Signed-off-by: Dan O'Donovan - -commit e4904009052717894720323d8b037307b24b9204 -Author: Dan O'Donovan -Date: Fri Sep 25 18:10:25 2015 +0100 - - imu: adding support for tap detection by BMI160 accelerometer - - Signed-off-by: Dan O'Donovan - -commit a5a12fc002430d002d9434f47582577da5c36631 -Author: Dan O'Donovan -Date: Fri Sep 25 15:21:05 2015 +0100 - - imu: added support for Step Detection/Counting in CurieImu library - - Signed-off-by: Dan O'Donovan - -commit b759ec35f46ef38d77fcd90ad1d91a5840607aaa -Author: Dan O'Donovan -Date: Fri Sep 25 01:36:11 2015 +0100 - - imu: fixes for issues found while testing shock detection - - - Created new SPI driver using polling instead of interrupts. - This allows it to be used within an ISR so that - we can check the source of the CurieImu interrupts. - - Fixed bit manipulation logic for partial register read/writes - - Added a new example sketch to demonstrate Shock Detection function - - Fixed IMU power-up logic - - Signed-off-by: Dan O'Donovan - -commit 982a470e6909bd444a399b49ced4749d9da72754 -Author: Dan O'Donovan -Date: Thu Sep 17 15:59:50 2015 +0100 - - Initial commit for new CurieImu Gyro/Accel library - - Signed-off-by: Dan O'Donovan - -commit e25bcde0d0b7f9fc635e376aa649884a369d6c45 -Merge: 6f196e1 2b11283 -Author: Brian Baltz -Date: Fri Oct 2 12:32:31 2015 -0600 - - Merge pull request #46 from 01org/cdc-acm - - CDC-ACM: move allocation of shared buffers to LMT - Has pair commit in Thunderdome - -commit 2b112833285765ef1e9436d5a82f1eeb65f53df8 -Author: Calvin Sangbin Park -Date: Fri Oct 2 10:32:51 2015 -0700 - - Updated libarc - -commit 05d4ecade9f44e2d86a43fde1030b2b0167236ed -Author: Bogdan Pricop -Date: Fri Oct 2 16:02:09 2015 +0100 - - CDC-ACM: avoid race condition. - - * In case bool() is called in a very tight while loop, give LMT space - to set the host_open shared variable. - - Signed-off-by: Bogdan Pricop - -commit b8d9b11d8d1c61d704f967d5d730b244c72d918f -Author: Bogdan Pricop -Date: Fri Oct 2 12:19:29 2015 +0100 - - CDC-ACM: change end and init to avoid race condition. - - Signed-off-by: Bogdan Pricop - -commit 5174c9c7e1634eef20c84b436c58a7b7cbbddbb3 -Author: Bogdan Pricop -Date: Fri Oct 2 10:29:43 2015 +0100 - - libarc32drv_edu.a: Update of pre-compiled driver library. - - Signed-off-by: Bogdan Pricop - -commit a6473d1fc4c8e4207f974eac273b0f5781341bc7 -Author: Dan O'Donovan -Date: Fri Oct 2 00:11:03 2015 +0100 - - CDC-ACM: move allocation of cdc-acm shared buffers to LMT - - LMT shall now be responsible for allocating shared data buffers - used to exchange CDC-ACM data between ARC and LMT. - - Defined a revised set of structures to allow the pointers to - be passed from LMT to ARC during initialisation. - - NOTE THAT THIS DEPENDS ON A CORRESPONDING CHANGE IN THUNDERDOME - FIRMWARE - - Signed-off-by: Dan O'Donovan - -commit 6f196e1fcdb422ca29229af27ff984eb113e3bd0 -Author: Calvin Park -Date: Thu Oct 1 22:11:13 2015 -0700 - - Updated libarc32 - -commit 4f1a71a77685e4b98a2c0345773bb5c92cbc98f4 -Author: Bogdan Pricop -Date: Fri Sep 11 08:59:45 2015 +0100 - - CDC-ACM fix flush() API - - Signed-off-by: Bogdan Pricop - -commit 0f07ea0e5dcf0039761e256a7efe7f327270124e -Author: Dan O'Donovan -Date: Thu Sep 10 13:43:13 2015 +0100 - - CDC-ACM - Fix slow write() performance and availableForWrite() logic - - - Removed delay in write() function which caused slow TX performance - - Removed timeout logic in write() function; moved to LMT side - - Fixed logic in availableForWrite() - ring-buffer capacity is at most - 1 less than actual size to avoid head index passing tail index - - Signed-off-by: Dan O'Donovan - -commit 33f4380d60a5f3fd110965f15565f3b83b57d6c9 -Author: Bogdan Pricop -Date: Tue Sep 8 10:57:00 2015 +0100 - - CDC-ACM - address review comments. - - Signed-off-by: Bogdan Pricop - -commit ddb0003c675d648f1b49ea8956e5b0f3b49d4775 -Author: Bogdan Pricop -Date: Mon Sep 7 15:36:58 2015 +0100 - - CDC-ACM using shared memory buffers - - Signed-off-by: Bogdan Pricop - -commit 6d0fc98091cedcc6c2e947878bdf7f5201592abe -Author: Dan O'Donovan -Date: Sat Sep 19 09:50:03 2015 +0100 - - ble: update libarc32drv_edu.a - - Signed-off-by: Dan O'Donovan - -commit 9314b22ff29e70c400c61d8f39c6486d8faa03ad -Author: Dan O'Donovan -Date: Sat Sep 19 09:41:46 2015 +0100 - - ble: address code review comments from Manoel Ramon - - - Added checks in example sketches for API return values - - Applying Public MAC address if present in factory data - - Applying default device name if user doesn't provide one - - Only issuing notifications/indications if enabled by peer - - Re-sync'd with latest BLE code from Thunderdome - - Added basic DTM support for use in sketch (for internal testing) - - Other minor updates, corrections and clarifications - - Signed-off-by: Dan O'Donovan - -commit a709e252eb60dec7eb7f923797814e72ffda5dcc -Author: Brian Baltz -Date: Fri Sep 18 09:47:10 2015 -0600 - - ATLEDGE-334 Update version header location in linker script - - Need to update linker script to match recent firmware change: - - JIRA: FIRE-2160 - - 1024 bytes were used to store the version header, which is only - 48 bytes big. So we wasted 976 bytes. By moving it after the vector table, - we can free this 1024 bytes space. - - Signed-off-by: Brian Baltz - -commit c33d42adca3d1fd4295e7df8f278c41089da26f6 -Author: Brian Baltz -Date: Thu Sep 17 12:58:44 2015 -0700 - - ATLEDGE-333 CLUploader script path is hard-coded - - Signed-off-by: Brian Baltz - -commit 28304b5b8ba763fe00d23cd074f23b3b8e6b97e0 -Author: Dan O'Donovan -Date: Wed Sep 16 17:51:36 2015 +0100 - - uart: fixing baud divisor calculation to add support for 230400 bps - - Added code to configure the UART fractional divisor to improve the - UART timing at higher speeds such as 230400, 460800 and 921600 bps. - - Signed-off-by: Dan O'Donovan - -commit b96562dbb3c63d5cc894f128d61de4f1bc6de3d5 -Author: Dan O'Donovan -Date: Wed Sep 16 14:45:05 2015 +0100 - - wire: adding support for I2C RESTART and some minor clean-ups - - - Added support for sending repeated-START conditions on the I2C bus - By adding an option to not send a STOP condition at the end of a - transfer, it is possible for the I2C master to hold the bus and - send additional transfers. If switching from writing to reading, - or vice-versa, the I2C master controller will automatically send - a repeated-START (RESTART) in between. For consecutive writes or - consecutive reads to the same slave, a repeated-START is not needed. - - - Cleaned up some redundant code and removed some unsupported methods - in the Wire library implementation for AtlasEdge, particularly those - related to I2C Slave-mode. AtlasEdge supports I2C Master-mode only. - - Signed-off-by: Dan O'Donovan - -commit 026afb2d00b89999b07bd7c5c6bc54cd29bbb310 -Author: Dino Tinitigan -Date: Mon Sep 14 16:11:37 2015 -0700 - - ATLEDGE-231 TFT Library - - Add missing wiring_private.h file - -commit 6b5577e058a46fcfca5ba91ccd3c9824acd941b6 -Author: Dan O'Donovan -Date: Sat Sep 12 11:26:50 2015 +0100 - - ble: adding new CurieBle Arduino library for AtlasEdge - - Added new BLE library and examples, providing access to - basic GAP/GATTS features of Intel Curie module - - Includes a port of the BLE Core Service CFW API and - UART-IPC drivers from Thunderdome code base - - Also includes a shift of CFW master role from LMT to ARC. - Requires matching commit 4d056720 or newer in thunderdome - atlaspeak_atlasedge project source tree to work correctly - - Known issues: - - A fix in Nordic BLE firmware is required to support - adding Presentation Format descriptors to characteristics. - Until that fix is available, the addPresentationMethod() - of the BleCharacteristic class should not be used. - - Due to issues with the current CDC-ACM implementation on - AtlasEdge platforms, use of Serial should be replaced with - Serial1 in the CurieBle example sketches, until CDC-ACM - issues are resolved. - - Not currently supported: - - Direct Test Mode (DTM) - - Bluetooth bonding (pairing) - - BLE Central Device role and GATT client functionality - - Signed-off-by: Dan O'Donovan - -commit 4cf249987b5da85a90025d174021824e5ce09cc6 -Author: Bogdan Pricop -Date: Mon Aug 17 22:49:26 2015 +0100 - - Port OneWire to Atlas Edge board - - * Implement platform specific macros for Intel AtlasPeak SoC. - - Signed-off-by: Bogdan Pricop - -commit 42da7aadcf2439bb4adaa5a1e112381786639486 -Author: Bogdan Pricop -Date: Fri Jul 31 16:23:55 2015 +0100 - - Add Paul Stoffregen's OneWire library version 2.3 - - * 1-Wire Github repository: https://github.com/PaulStoffregen/OneWire - tag: 2.3 - - Signed-off-by: Bogdan Pricop - -commit d439d3be7522a5d4c2adf552039b089dea0d495f -Author: Dino Tinitigan -Date: Thu Sep 10 11:13:58 2015 -0700 - - ATLEDGE-231 TFT Library - - Add AtlasEdge support to TFT library - -commit f34bda4517f1cc199d29e3fe51c220cae5b2cf4c -Author: Dan O'Donovan -Date: Wed Sep 2 12:53:49 2015 +0100 - - Updated license headers in Thunderdome-derived source files - - New license headers and other minor changes have been imported - from the Thunderdome code base. Note that no functionality has - been added/changed/removed in this commit. - - Signed-off-by: Dan O'Donovan - -commit 647e20823be90638e707fbcb66c8be4e1f9ea351 -Author: Dino Tinitigan -Date: Tue Aug 25 10:24:03 2015 -0700 - - ATLEDGE-279 F_CPU not defined - - Added F_CPU to boards.txt and platform.txt. - Fixed format of boards.txt - -commit d3bbf49643a9fdd2a19426f5818cd602e1e99e8d -Author: Dino Tinitigan -Date: Mon Aug 24 16:34:21 2015 -0700 - - ATLEDGE-228 SD Library - - Add AtlasEdge support to SD library - -commit 83a4c0213a24c32e4f2924fbbcad5dd5afca9ec3 -Author: Dino Tinitigan -Date: Fri Aug 21 13:05:14 2015 -0700 - - ATLEDGE-272 SPI broken by new clock gating feature - - Enable clock gate before configuring SPI - -commit c29233c5826e85f49173a77757400678471bd49b -Author: David Hunt -Date: Wed Aug 12 12:40:28 2015 +0100 - - Cleaned up buffer handling in CDCSerial class. - - Signed-off-by: David Hunt - -commit b9d35bdac7c27a1c407fe2e0d4f97236a980f312 -Author: David Hunt -Date: Thu Aug 6 14:28:16 2015 +0100 - - libarc32drv_edu.a: Update of pre-compiled driver library. - - Signed-off-by: David Hunt - -commit 7fa713d2ef47140a82b4b0f50ab31ec43206fada -Author: David Hunt -Date: Tue Aug 11 13:53:48 2015 +0100 - - Address review commments on cdc-acm serial - - Signed-off-by: David Hunt - -commit 511a8d76f20698813cafa1b0f7130e40f37cdaea -Author: David Hunt -Date: Tue Aug 4 12:23:24 2015 +0100 - - Changes out of code reviews. - - Signed-off-by: David Hunt - -commit d85aa9643ac15389004d05217e67d438d689916d -Author: David Hunt -Date: Wed Jul 29 14:45:44 2015 +0100 - - Added CDC-ACM serial functionality as Serial. - - Pin header pins 0 and 1 have moved to Serial1 - - Signed-off-by: David Hunt - -commit 347ded518d9731dd93460b569168f2631ad604c1 -Author: Manoel Ramon -Date: Thu Aug 13 16:28:39 2015 -0700 - - ATLEDGE-44 Creation of platform ID and platform name for Atlas Edge - -commit a9c0430563473d556a766ac7df953969363f3bc8 -Author: Krzysztof Sywula -Date: Tue Aug 11 18:33:04 2015 -0700 - - vid/pid change - - JIRA: ATLEDGE-181 - - Signed-off-by: Krzysztof Sywula - -commit 7d55eb88f2c659ca0dc3bc83ef607fbeb439bbe2 -Author: Dino Tinitigan -Date: Tue Aug 11 10:48:22 2015 -0700 - - ATLEDGE-141 Add ATN pin as a regular gpio - - Added ATN pin as a regular gpio as pin 20 - -commit e487817583d12c6ef1203ef60c14cd4882509b32 -Author: Martino Facchin -Date: Tue Aug 11 13:56:19 2015 +0200 - - import stdlib noniso functions - - try not to reinvent the wheel - solves print(*, BIN) returning "unsupported base" - -commit a03d93d5634335a96549c1c41923e03424f5d488 -Author: Martino Facchin -Date: Tue Aug 11 12:34:10 2015 +0200 - - add support for String operation with uint64_t - - fixes examples StringConstructors, StringAdditionOperator, StringAppendOperator - - only needed because millis() returns a uint64_t - -commit 2dbdd016cc9cf47649c55141b56bc7c2e64315ad -Author: Dino Tinitigan -Date: Thu Aug 6 15:38:23 2015 -0700 - - ATLEDGE-30 Port Ethernet Library - - Port of the Ethernet Library for Atlasedge. - Added missing files from cores directory needed by Ethernet, WiFI, and - other similar libraries. - Works for Arduino 1.6.5 and above - -commit 293b27908134ab79d689020dece0bf6ce8cc02a7 -Author: Bogdan Pricop -Date: Thu Aug 6 15:04:43 2015 +0100 - - Fix the build. - - Signed-off-by: Bogdan Pricop - -commit bc74b7df42ec1a9413dd044b814363c7cc51bdeb -Author: Bogdan Pricop -Date: Thu Aug 6 13:48:37 2015 +0100 - - Address code review comments - - * Correct spelling error evry => every - * Remove magic number 0xFFFFFFFF and define it as FREE_RUN_TIMER - * Remove 2 and 10 magic numbers from Print class; use BIN and DEC instead - * Add base checking inside printNumber() and printLongLong() methods - * Remove some unnecessary white spaces. - - Signed-off-by: Bogdan Pricop - -commit 3cc79807014c1f386e12017c4063ccc62db9e15c -Author: Kevin Moloney -Date: Tue Aug 4 12:21:44 2015 +0100 - - ATLEDGE-185 - String object is missing functions - - Also included Bug #2289 overloaded operators missing - Signed-off-by: Kevin Moloney - -commit e3f227ff6fe7c5530a2f99f2c42206dd08071020 -Author: Martino Facchin -Date: Mon Aug 10 15:05:26 2015 +0200 - - WStrings: add c_str function - - this fixes SD library compilation - - However, in the long term, WString, Print, IPAddress, Stream and WMath (every core file non hardware-related) should be aligned to AVR version to avoid incompatibilities with derived classes - -commit fd8b3e5e6899ed12ada55829c7557be0402dd123 -Author: Martino Facchin -Date: Mon Aug 10 14:53:57 2015 +0200 - - Add digitalPinTo* macros/functions - - these functions ensure compatibility with lots of existing libraries - -commit f3f2b0bc66b053b2cd59cee578906a2f7d83eabc -Author: Martino Facchin -Date: Tue Jul 21 18:09:38 2015 +0200 - - Improve Wire library - - still unreliable though - -commit a33835c16343c18ed75e51418ff02c72684a745b -Author: David Hunt -Date: Fri Jul 31 13:56:57 2015 +0100 - - ATLEDGE-177-char-Signed - - Char is now signed (fix of previous regression in merge) - - Signed-off-by: David Hunt - -commit 0aa51368ea4b1688aecbe2b2b0b8b1bf57058ecf -Author: David Hunt -Date: Fri Jul 31 12:50:14 2015 +0100 - - libarc32drv_edu.a: Update of pre-compiled driver library. - - Signed-off-by: David Hunt - -commit 31513f70d52408093dfbcaeeee4ec77e9c1c3dcb -Author: Bogdan Pricop -Date: Wed Jul 29 17:37:35 2015 +0100 - - Fix bug #2220: delay(150secs) only waits for approx 15secs - - Root cause: - While transforming milliseconds in clocks, the result of an uint32_t - multiplication overflows - Solution: - Cast one of the operands to uint64_t - - Signed-off-by: Bogdan Pricop - -commit b365f143e2b11346ee54a9c48f6c6b3b48e33e56 -Author: Kevin Moloney -Date: Wed Jul 29 11:14:02 2015 +0100 - - Bug#2262 String Object compile error - - Signed-off-by: Kevin Moloney - -commit da0eaa49fe58a431fdf03403355cf71ab671b9bd -Author: Kevin Moloney -Date: Wed Jul 29 14:06:08 2015 +0100 - - ATLEDGE-209 tone() bug when frequency = 0 - - Signed-off-by: Kevin Moloney - -commit bc7fbd8adbf3058f4dc3bae0c9a1568b3e98ba3f -Author: David Hunt -Date: Thu Jul 30 11:32:26 2015 +0100 - - Bug# 2265 - fixed parseInt(skipchar) Compilation error - - Signed-off-by: David Hunt - -commit 67e7f2e9843096b03110cefdc5e702d896bf5be6 -Author: David Hunt -Date: Wed Jul 29 10:07:37 2015 +0100 - - Added support for printing long long values, e.g. millis() - - Signed-off-by: David Hunt - -commit abe68dea6befe32fc4ce2951c5bb2e89c2e4bd45 -Author: Bogdan Pricop -Date: Wed Jul 29 12:14:56 2015 +0100 - - ARC init: enable FIRQ - - * Change interrupts priority from 1 to 0 (FIRQ) - * Modify linker script: add stack area for FIRQ - Define a stack memory section in SRAM and split it between run time - and FIRQ stacks. - * Replace existing generic ISR; it initialises the SP, decodes the IRQ - source and finally jumps and links to the specific ISR. - * Modify _IsrTableEntry structure: get rid of ISR parameter. - - Signed-off-by: Bogdan Pricop - -commit 47fab774f96532134ad74a8c16bcecf6c9fdefbf -Author: Bogdan Pricop -Date: Mon Jul 27 14:37:09 2015 +0100 - - ATLEDGE-169: Change interrupt routing mask - - Issue: The LMT receives an interrupt enabled by SS because the routing - mask is disabled for both cores (the interrupt is routed to both - ARC and LMT) and it masks it because it is a "spurious irq" from - its point of view. - - Fix: When the ARC enables an interrupt source, it configures the interrupt - router to route the interrupt only to ARC core. - - Signed-off-by: Bogdan Pricop - -commit ab97250c0df109b68f71983fe0046b2d16f839fc -Author: Kevin Moloney -Date: Tue Jul 28 11:58:41 2015 +0100 - - Bug #2184 Serial.begin() config not implemented - - Signed-off-by: Kevin Moloney - -commit e542703d8458e5769ab6d8aa38a9a565aaff83a3 -Author: Kevin Moloney -Date: Fri Jul 24 12:43:34 2015 +0100 - - ATLEDGE-177-char-Signed - - Char is now signed - Boolean modified to be a bool not an int - - Signed-off-by: Kevin Moloney - -commit afcd5f7932f62f7692121b9dcce8b67972a2fac6 -Author: Kevin Moloney -Date: Thu Jul 16 15:45:30 2015 +0100 - - Enable/disable_internal-pullup_with-digitalWrite - - Emulate Arduino pull-up control, by allowing a digitalWrite() on an INPUT pin to toggle the internal pull-up - Signed-off-by: Kevin Moloney - -commit 925ddb77900e4bb8ede5f59daf7656073c81bb2b -Author: Dino Tinitigan -Date: Wed Jul 29 15:01:15 2015 -0700 - - ATLEDGE-224 port avr/pgmspace.h - - many libraries fail to compile because they need avr/pgmspace.h. - Galileo/Edison had the same issue and the same code can be ported over. - -commit 6875a7ffed5d9dd038037148efccc0ef1fe2f2f6 -Author: Kevin Moloney -Date: Wed Jul 15 09:26:12 2015 +0100 - - Bug fix to allow three methods for Serial.Write() - - Signed-off-by: Kevin Moloney - -commit a50e097c7c7d217b4d0b9135a9d2e970f435edcf -Author: Bogdan Pricop -Date: Tue Jul 14 23:05:16 2015 +0100 - - Arduino core functions: pulseIn - - Change pulseIn implementation to be inline with the new time functions - which provide 64 bit timestamps. - - Signed-off-by: Bogdan Pricop - -commit 895d7b94b167cafbd6306ce79942c7f2bc811181 -Author: Dan O'Donovan -Date: Wed Jul 15 14:17:35 2015 +0100 - - Temporary fix is to compile with -O0 instead (optimisation disabled). - Further investigation required. - - Signed-off-by: Dan O'Donovan - -commit 9bf75da8684e5917d343795eb9f1156d28eb89b4 -Author: Bogdan Pricop -Date: Wed Jul 15 12:24:01 2015 +0100 - - libarc32drv_edu.a: Update of pre-compiled driver library. - - Signed-off-by: Bogdan Pricop - -commit 33342070baf9a8b5dadc26d9691499d30461be68 -Author: Bogdan Pricop -Date: Tue Jul 14 20:59:11 2015 +0100 - - Time related Arduino core functions: Re-write - - * Change Timer0 configuration according to Alexandre D'Alton suggestion: - use it as a free-run timer which delivers interrupts every 0xFFFFFFFF - clock ticks and its ISR increments a global variable; in this way a - 64-bit virtual RTC is created. The downside is the delay() function - cannot take advantage of ARc's power management features anymore. - - * Change delay() implementation to make use of 64-bit time-stamp. - - * Change delayMicroseconds to use Timer0 counter value and unsigned - arithmetic's features to handle the overflow case. - The credit goes to Dan O'Dononvan. - - * Add function to get an atomic 64-bit time-stamp. - - * Change millis() and micros() implementation to use the 64-bit time-stamp. - - Signed-off-by: Bogdan Pricop - -commit 7405797b110db61e838dc92141f7d8082b159c3a -Author: Dan O'Donovan -Date: Fri Jul 10 09:45:36 2015 +0100 - - Updates and fixes to Component Framework code for Arduino on ARC - - - Sync'd CFW code with Thunderdome code base from 01-July-2015 - - Fixed issue with mailbox interrupts halting CPU, caused by bug in scss_registers.h - - Added CFW test service client to facilitate CFW sanity check (requires LMT build running Test service) - - Signed-off-by: Dan O'Donovan - -commit cdc73f8e532be8ea3c5791fe575bc30381a6e0dc -Author: David Hunt -Date: Thu Jul 9 14:29:46 2015 +0100 - - Fixed redmine 2150 - inByte variable declaration issue - - Signed-off-by: David Hunt - -commit 4489870248153835baa05bcc6956f0f0f81ffb37 -Author: David Hunt -Date: Thu Jul 9 16:03:43 2015 +0100 - - Remove unneeded main.c from driver library. - - Signed-off-by: David Hunt - -commit ecbe76a8febfd31a8b0f1d3dd30fa6545bafafec -Author: David Hunt -Date: Thu Jul 9 14:01:45 2015 +0100 - - Fixed macro for enabling pullups, plus fixed pin# for IO8 - - Signed-off-by: David Hunt - -commit 3193ffc31ab65125c66337aadef85c6da3d22d2b -Author: Bogdan Pricop -Date: Fri Jul 10 15:52:33 2015 +0100 - - Update of pre-compiled driver library. - - Signed-off-by: Bogdan Pricop - -commit c968b172d1b0ca86936ae34793d701ac2fee778f -Author: David Hunt -Date: Wed Jul 8 17:31:48 2015 +0100 - - Reduced footprint of blink sketch from 65K to 25K by removing call to sprintf - - Signed-off-by: David Hunt - -commit 4fc372ef78d1929fc1ff12d1c1a806c1dc236bdd -Author: Kevin Moloney -Date: Wed Jul 8 15:31:45 2015 +0100 - - Remove hardware loop-back flag set in SPI.begin() - - This was added previously for internal testing, but was not fully removed prior to release - - Signed-off-by: Kevin Moloney - -commit f88353e642f8e88361a055fdecdf8fef3f41e337 -Author: David Hunt -Date: Wed Jul 8 13:54:26 2015 +0100 - - Fix for malloc(), round up to 4k Pages. - - Signed-off-by: David Hunt - -commit 13cd850d73127de56c31945a3e24f78d99ef7f2e -Author: David Hunt -Date: Tue Jul 7 16:19:38 2015 +0100 - - ATLEDGE-158 - Serial.end() not working - - Signed-off-by: David Hunt - -commit 3f3c4c207f1342ffd17e65e0025f4ab8a9e998dc -Author: Kevin Moloney -Date: Mon Jul 6 13:02:12 2015 +0100 - - Modify pin 19's pin description for EVT board - - Signed-off-by: Kevin Moloney - -commit d5bf0344ab8762b716e264eec680970b708f7f1b -Author: Kevin Moloney -Date: Mon Jul 6 12:50:20 2015 +0100 - - Modifify pin 19's pin discription for EVT board - - Signed-off-by: Kevin Moloney - -commit a1d94f84bfa3cb7fa164e79b14ba89227d24dea0 -Author: Bogdan Pricop -Date: Mon Jul 6 14:04:56 2015 +0100 - - ATLEDGE-142: noInterrupt() not working: change delay() behaviour. - - * Change delay() implementation NOT to enable interrupts before putting the - ARC core into sleep state. - * delay() still cannot be called from a "no interrupts" context, but it - doesn't overwrite the user's settings anymore. In this way, if delay() - is called in a no interrupts context, the ARC sleeps for ever. - - Signed-off-by: Bogdan Pricop - -commit de8fab5b63ea28e84055a33b5201d0d44bad0dab -Author: Kevin Moloney -Date: Mon Jul 6 11:46:10 2015 +0100 - - Include Knob example in Servo library - - Signed-off-by: Kevin Moloney - -commit ae93ed8d139f36825dcc80bb705d7066af7415c2 -Author: David Hunt -Date: Thu Jul 2 13:56:13 2015 +0100 - - Shifting out wrong bit index. Should be 7-i instead of 8-i - - Signed-off-by: David Hunt - -commit 57d3d3dae78e31623c5d60a770f90938df6c1a8d -Author: Kevin Moloney -Date: Thu Jul 2 10:02:38 2015 +0100 - - Implement Servo Library for Intel EDU - - Signed-off-by: Kevin Moloney - -commit 7ae6ecfc2fec406ea15f8af6d83fb31c3fe45b6e -Author: Dan O'Donovan -Date: Thu Jul 2 13:07:37 2015 +0100 - - SPI library implementation for Intel EDU - - The following functions/features have been implemented: - - * Standard SPI API: - - SPI.begin() - - SPI.setClockDivider() - - SPI.setDataMode() - - SPI.transfer() (single-byte and multi-byte versions) - - SPI.transfer16() - - SPI.end() - * SPI Transaction API - - SPI.beginTransaction() - - SPI.endTransaction() - - SPI.usingInterrupt() - - SPI.notUsingInterrupt() - * New Intel EDU specific API functions - - SPI.transfer24() - - SPI.transfer32() - - Known issues/limitations: - * LSBFIRST bit order not supported in hardware, requires (slower) software emulation - * SPI Transaction API has not been fully tested at time of writing - - Signed-off-by: Dan O'Donovan - -commit 1cdc4f0688be19e32396d50e731ff3cf16b7d8a6 -Author: Bogdan Pricop -Date: Tue Jun 30 15:27:49 2015 +0100 - - Update source code with WRS restrictive license headers - - * Delete arcv2_timer1.[c|h] driver - not used at this stage. - * arcv2_timer0 driver: update license header to WRS permissive license; - arcv2_timer0.h doesn't exist anymore in the latest Tiny Mountain source - code, but we use it, stick in the same WRS permissive license header. - * For linker.cmd and flsh.ld linker scripts: replace license header with - the WRS permissive one fomr the original linker.cmd files from - Tiny Mountain OS - * aux_regs.h - derived work from aux_reg.h from Tiny Mountain OS; - change license header to WRS permissive. - * remove license header as in the original files from thunderdome code - base: compiler.h, portable.h - - Signed-off-by: Bogdan Pricop - -commit c338e4b94124bb619896e8a8c80217e790717ca7 -Author: Kevin Moloney -Date: Wed Jun 17 11:02:39 2015 +0100 - - ADC Optimization (clock ratio) - - Signed-off-by: Kevin Moloney - -commit 98fdd4c83861e084c7819d08c3f90e8600675bc6 -Author: Kevin Moloney -Date: Tue Jun 30 14:22:47 2015 +0100 - - Arduino core functions: tone/noTone implementation.. - - * tone/noTone implemented using ARC's Timer1. - - Signed-off-by: Kevin Moloney - -commit 32ae6276ac86dd24961eb010297e2239b5ee8b80 -Author: Bogdan Pricop -Date: Fri Jun 26 15:43:49 2015 +0100 - - Arduino core functions: pulseIn(pin, value, timeout) - - Implementation of pulseIn() Arduino core function using GPIO interrupts - and micros() for time-stamping. - NOTES: - * The performance is not as good as on Arduino UNO. It should be - re-measured after following optimisation: - * Enable FIRQ (Fast Interrupts) on ARC. - * Optimise the GPIO interrupts - * Optimise the Timer0 interrupt - * Empirical measured accuracy is 10 microseconds. - - Signed-off-by: Bogdan Pricop - -commit cbc40d38c6cd1ef5e433e378c99cc95f19e31fc9 -Author: Dino Tinitigan -Date: Fri Jun 26 16:18:29 2015 -0700 - - Update sketchUploader version - - Updated sketchUploader version in platform.txt - -commit 875ec047d28c3059ca215e261bd28f780d0b48d5 -Author: David Hunt -Date: Fri Jun 26 13:59:13 2015 +0100 - - Change to see new VID/PID for ACM devices for baud change reset - - Must be used with firmware that presents 8087:0A9F as PID/VID - - Signed-off-by: David Hunt - -commit 11dfe699887f47f65276f880b5a4aaa01f282baa -Author: Bogdan Pricop -Date: Tue Jun 23 17:56:55 2015 +0100 - - ATLEDGE-75 - Time: micros() - - * Re-write micros() function in assembly for a 15-20% performance - increase. It should take less than a microsecond now. - - Signed-off-by: Bogdan Pricop - -commit 39eb85ad388a7324a24bb17598e2b6b745f209ab -Author: Kevin Moloney -Date: Tue Jun 23 12:44:16 2015 +0100 - - ATLEDGE-84 - Interrupt framework: make interrupt.h C++ compatible. - - Signed-off-by: Kevin Moloney - -commit 63f6a7698502e7b14798e261be1f2407e06e6a5f -Author: Bogdan Pricop -Date: Wed Jun 17 11:01:10 2015 +0100 - - ATLEDGE-82 - ARC Init: Re-enable I-CACHE - - Enable Instruction cache and invalidate it after interrupt unit device - initialisation - -commit 7f98355166f010b00a64cbf7a949b84d96bec05a -Author: David Hunt -Date: Thu Jun 18 14:13:17 2015 +0100 - - updated pre-compiled driver library. - - Signed-off-by: David Hunt - -commit 653e96c9d9b206297d5c631180c41b4cb13e2860 -Author: David Hunt -Date: Thu Jun 18 13:58:40 2015 +0100 - - ATLEDGE-27 - Wire (i2c) Library - Moving header files. - - Signed-off-by: David Hunt - -commit 31e4e972141524297a096b38d067593a72af5f6e -Author: Bogdan Pricop -Date: Wed Jun 17 10:50:00 2015 +0100 - - ATLEDGE-75 - Time : delayMicroseconds - - Implement delayMicroseconds function in Assembly and using the ARC's - instructions timing as a reference. - The instruction's timing was computed with a scope and using infinite - loops, meaning the code most likely used the advantage of ARC'c cache. - - Function's accuracy is +- 0.15 microseconds in the above stated conditions. - The accuracy can be affected by cache miss annd/or interrupts handling. - It doesn't disable interrupts and it doesn't use any of the SoC power - management features. - - Signed-off-by: Bogdan Pricop - -commit c165e1c12c3918f7dd7e10e05be9550b9fbf1777 -Author: David Hunt -Date: Thu Jun 18 10:20:57 2015 +0100 - - ATLEDGE-27 - Wire (i2c) Library - - Signed-off-by: David Hunt - -commit 648ca2ebcced299f53485e384ea590ff033aafc7 -Author: David Hunt -Date: Tue Jun 16 09:43:33 2015 +0100 - - Updated licence headers according to latest files from Intel. - - Signed-off-by: David Hunt - -commit 4c3f58a7e39ee3da55e83d104897b5abdf60c76f -Merge: c2b4f74 d7c5a80 -Author: David Hunt -Date: Tue Jun 9 16:29:48 2015 +0100 - - ATLEDGE-82 - merge in change of start address for arc code - - Signed-off-by: David Hunt - -commit d7c5a80233d7f574f9060d49f26f102634a50a64 -Author: Bogdan Pricop -Date: Tue Jun 9 15:27:14 2015 +0100 - - ATLEDGE-82 - Init: Change linker scripts - - Modify the start address and the size of the flash area allocated for - ARC core, according to ATLASEDGE/WEEKLY/WW23 tag - -commit c2b4f74efc0cafe3ad4aebd365b2457284a7dafe -Merge: b408ea9 a801dd7 -Author: David Hunt -Date: Tue Jun 9 15:16:08 2015 +0100 - - Merge branch 'fix_1999' - fix for INPUT_PULLUP - - Signed-off-by: David Hunt - -commit b408ea97cbd30aae038381f930995b0f3869702e -Merge: d45290e 539a7c2 -Author: David Hunt -Date: Mon Jun 8 14:20:29 2015 +0100 - - feat_irq_uart: Merged serialEvent() functionality. - - Signed-off-by: David Hunt - -commit 539a7c26495321edae81804e9432a5d0c7f88fbb -Author: David Hunt -Date: Mon Jun 8 13:48:55 2015 +0100 - - feat_irq_uart - Added in serialEvent() functionality - - Signed-off-by: David Hunt - -commit a801dd73b1e5eb41a0bcdb3c50b5a5691ede8f9e -Author: Dan O'Donovan -Date: Mon Jun 8 13:48:20 2015 +0100 - - INPUT_PULLUP doesn't appear to enable an internal pull-up resistor - - Incorrect register base address used by SET_PIN_PULLUP macro in - scss_registers.h to enable/disable internal pull-ups - - Signed-off-by: Dan O'Donovan - -commit d45290e31df7def5c65e1951bd8d3e69347b3843 -Author: David Hunt -Date: Fri Jun 5 13:49:06 2015 +0100 - - Update of precompiled driver library - - Signed-off-by: David Hunt - -commit 88baee7283dc174131c42b7d0256753f6ee9a906 -Merge: ac134d6 79d1ab1 -Author: David Hunt -Date: Fri Jun 5 11:22:49 2015 +0100 - - ATLEDGE-84 - Interrupt framework - - Arduino functions implemented: - * attachInterrupt(Arduino_Pin, handler, mode): - * it works for all Arduino GPIO (IO0 - IO19) - * CHANGE mode is supported only for SoC GPIOs (hardware limitation: - SS doesn't support interrupt generation on both rising and falling - edges.) - * detachInterrupt() - * interrupts() - * noInterrupts() - - Above functions behaviour is according to Arduino website description. - For details please see below references: - http://www.arduino.cc/en/Reference/AttachInterrupt - http://www.arduino.cc/en/Reference/DetachInterrupt - http://www.arduino.cc/en/Reference/Interrupts - http://www.arduino.cc/en/Reference/NoInterrupts - - This implementation uses ss_gpio and soc_gpio drivers from thunderdome. - - Signed-off-by: Bogdan Pricop - -commit 79d1ab16a6687015893a83f8bba079fff0e3be6e -Author: Bogdan Pricop -Date: Fri Jun 5 10:36:30 2015 +0100 - - ATLAEDGE-84: Interrupt framework - - Arduino functions implemented: - * attachInterrupt(Arduino_Pin, handler, mode): - * it works for all Arduino GPIO (IO0 - IO19) - * CHANGE mode is supported only for SoC GPIOs (hardware limitation: - SS doesn't support interrupt generation on both rising and falling - edges.) - * detachInterrupt() - * interrupts() - * noInterrupts() - - Above functions behaviour is according to Arduino website description. - For details please see below references: - http://www.arduino.cc/en/Reference/AttachInterrupt - http://www.arduino.cc/en/Reference/DetachInterrupt - http://www.arduino.cc/en/Reference/Interrupts - http://www.arduino.cc/en/Reference/NoInterrupts - - This implementation uses ss_gpio and soc_gpio drivers from thunderdome. - - Signed-off-by: Bogdan Pricop - -commit ac134d6f742532d9c43783b29c5d145ab8306054 -Merge: 77d7a18 d7cbbf4 -Author: David Hunt -Date: Fri Jun 5 10:09:17 2015 +0100 - - ATLEDGE-14 - Added wiring-shift functionality - - shiftIn() and shiftOut() - - Signed-off-by: David Hunt - -commit d7cbbf4f4bb3abee46f887ee8adbcb9e851594c9 -Author: davids -Date: Fri Jun 5 09:23:44 2015 +0100 - - implement wiring_shift.c() - -commit da2e44848abcb12f4f6c9a891a55425b330fdb25 -Author: davids -Date: Thu Jun 4 15:20:53 2015 +0100 - - implement wiring_shift() - -commit 77d7a180c96bb25b69cc82de14e37104dcc77707 -Merge: de3666c 941f594 -Author: David Hunt -Date: Thu Jun 4 14:44:52 2015 +0100 - - ATLEDGE-83 - Integrating Component Framework IPC with Arduino run-time lib - - Signed-off-by: David Hunt - -commit de3666c598909ffd19079a6e5390559e3435812b -Merge: 59634af 325da1d -Author: David Hunt -Date: Thu Jun 4 14:27:36 2015 +0100 - - ATLEDGE-15 - Analog In functions - -commit 941f594f9fbdc201af1539678e3cd30c9dc8b09d -Author: Dan O'Donovan -Date: Wed Jun 3 10:25:40 2015 +0100 - - cfw: Integrating Component Framework IPC with Arduino run-time lib - - Adding glue layer to initialise CFW and enable interrupt-driven - handling of received messages from LMT core - - Signed-off-by: Dan O'Donovan - -commit cdf2107957c9c8d17ee0667cb754a31d242c75a5 -Author: davids -Date: Thu Jun 4 11:35:13 2015 +0100 - - implement wiring_shift() - -commit 325da1ded53cd4a533c7cd4c2782fa3fbe1dc30c -Author: Kevin Moloney -Date: Thu Jun 4 03:35:04 2015 -0700 - - analogRead fixes - -commit 57310fed13bdf80a77a24b663925ff28b4595bc2 -Author: Kevin Moloney -Date: Thu Jun 4 03:15:40 2015 -0700 - - analogRead fixes: - - Signed-off-by: Kevin Moloney - -commit 59634aff378b89deb36041d94aed7132e5588b37 -Merge: e60cba4 530ba96 -Author: David Hunt -Date: Thu Jun 4 10:17:03 2015 +0100 - - ATLEDGE-76 - Serial functions, addition of interrupt handling - -commit 530ba96203602f7743aac12175c08e4b5ddf0209 -Author: David Hunt -Date: Thu Jun 4 09:52:07 2015 +0100 - - feat_irq_uart: minor changes after code reviews - - Signed-off-by: David Hunt - -commit f0b0954a09cf5808fa87abf8052a088f5ee5e5bd -Author: davids -Date: Wed Jun 3 17:42:21 2015 +0100 - - implement wiring_shift() - -commit 65e2c057260887613e173a274bb439c92bb8141c -Author: Kevin Moloney -Date: Wed Jun 3 07:24:48 2015 -0700 - - adc: Implement analogRead() - - Signed-off-by: Kevin Moloney - -commit acde269f698e087f6e2d23f498576c720dc91c07 -Author: David Hunt -Date: Wed Jun 3 11:19:39 2015 +0100 - - feat_irq_uart: enable UART interrupt handling - - Signed-off-by: David Hunt - -commit e60cba4bcb0e03c4fd8158d9b1226c023e016f19 -Author: David Hunt -Date: Thu May 28 13:56:49 2015 +0100 - - feat_strings: add -fno-exceptions for C++ code to remove linker errors - - Signed-off-by: David Hunt - -commit 81123d478ae1747a9f1148c0270395d95ba62ef8 -Author: David Hunt -Date: Thu May 28 12:03:33 2015 +0100 - - feat_strings: Compiler & linker flags for String builds - - Signed-off-by: David Hunt - -commit d72c26f1c38ef35556dd1faf832b0be8e9c7dd60 -Merge: 07a494f d1289bb -Author: Bogdan Pricop -Date: Wed May 27 18:05:56 2015 +0100 - - ATLEDGE-82: Init - change ARC memory layout. - - * Change start address and size of the Flash area allocated to the ARC core - according to new memory layout received from Toulouse. - - Signed-off-by: Bogdan Pricop - -commit d1289bbdbfdad34ecac16de752237aba65a942ef -Author: Bogdan Pricop -Date: Wed May 27 09:06:25 2015 +0100 - - ATLEDGE-82: Init - change ARC memory layout. - - * Change start address and size of the Flash area allocated to the ARC core - according to new memory layout received from Toulouse. - - Signed-off-by: Bogdan Pricop - -commit 07a494f00158248b1100ad4ba1e240ad0221bfc0 -Author: David Hunt -Date: Thu May 21 15:43:55 2015 +0100 - - Adding updated pre-compiled driver library. - Cleaning up after code reviews and validation of build. - - Signed-off-by: David Hunt - -commit e77ff7a37c2bd3a00199471cbc328d7bf338b87b -Author: David Hunt -Date: Thu May 21 14:08:03 2015 +0100 - - Updated due to code reviews - - * Fix delay() issue - Issue: If value of microsecond is Timer0 limit, arcv2_timer0_count_get() - microseconds condition will always be true, spinning for ever. - The main issue is that the time between 2 consecutive readings of - COUNT0 register is around 90 ticks and the Timer may overflow - before the next reafing of COUNT0 if last values read > LIMIT - 90. - Fix: Take in consideration the number of overflows. If TIMER0 overflows - just leave the loop (even if COUNT0 < microseconds) - * Restructure a bit arcv2_timer0_enable() function in order to reflect the - procedure described in chapter 3.3.76.1 of DesignWare ARCv2 ISA - Programmer's Reference Manual. - Make sure Timer0 initialisation clears the counter register as well. - * code review - added yield via hooks.c - * added back in strip stage when building - * Remove unused code in os.h, os_types.h and pf_init.h - * Uncomment call to yield() from delay() Arduino function; yield() is - added for sake of compatibility. - * Remove dead code from timer0 init function. - * Commented out enable instruction cache - * Added Copyright header to wiring.c - * Setup automatic (hardware) context saving feature for non-fast interrupts - * Serial Communication API Initial checkin of Serial.read() and Serial.write() - using header pins 0 and 1 - * Eliminated some compiler warnings. - - Signed-off-by: David Hunt - -commit c4fad8ecba577bfd28171c31b14aab47a465754a -Merge: 9ec6faf e187e5e -Author: David Hunt -Date: Tue May 19 14:05:37 2015 +0100 - - ATLEDGE82 init code - - small cleanup around interrupt init code. - - Signed-off-by: David Hunt - -commit e187e5ed742bd85ecafa6cde5dfa3ad35ec90bb9 -Author: Dan O'Donovan -Date: Tue May 19 13:42:45 2015 +0100 - - ATLEDGE-82 init code - - Minor tidy-up to interrupt init code - - Currently, timer init functions enable global interrupts. This should - be done in the interrupt setup code during the chip init sequence. - - Signed-off-by: Dan O'Donovan - Signed-off-by: David Hunt - -commit 9ec6fafc1665504fe90fc99623f1348267caeed9 -Author: David Hunt -Date: Tue May 19 13:13:45 2015 +0100 - - ATLEDGE-82 init code - - final cleanup before push. no functional changes. - -commit d37176a3b8483127244c5c72bad861ef4598d756 -Author: David Hunt -Date: Tue May 19 12:56:33 2015 +0100 - - ATLEDGE-82 init code - - Interrupt handling - add hw context saving - - * Disable instruction cache (we don't need it at this stage) - * Setup automatic (hardware) context saving feature for non-fast - interrupts. - * Set optimization to none (-O0) in Makefile. - - build: Eliminating compiler warnings - - Fix interrupt handling bug - - Issue: - A simple blink sketch having a 10 ms delay between blinks crashed - after a few seconds. - It looks like the stack got corrupted. - Root cause: - The generic assembly hardware ISR, "_do_isr", was not properly - written; the "sp" was not properly handled. - Solution: - Replace the assembly hardware ISR with a C function having - "__attribute__((interrupt("ilink")))" - - Note: - We need this generic hardware ISR because the IVT is in flash and - we cannot change it at runtime. - - Allocating more SRAM to ARC (syncing with latest Thunderdome mem allocation) - - build: Removing sdata section declaration from linker scripts - - ARC doesn't support an SDATA section bigger than 1024 bytes, and - we overflow this too easily when we link in code that hasn't been - compiled with the -mno-sdata compiler flag. So we will ensure that - we only use code compiled with -mno-sdata (including standard C lib) - and we remove this section declaration to weed out any exceptions to this. - In other words, if we link any code that tries to use the sdata section, - we will see a linker error. - - build: Adding HEAP section - - Adding heap section with start/end marker symbols to satisfy - malloc() and friends - - Signed-off-by: David Hunt - -commit d4fe5885d8e2bebd071e4e7d378d3fbf8e85a2eb -Author: Bogdan Pricop -Date: Mon May 18 11:12:35 2015 +0100 - - ATLEDGE-82 init code - - Interrupt handling - add hw context saving - - * Disable instruction cache (we don't need it at this stage) - * Setup automatic (hardware) context saving feature for non-fast - interrupts. - * Set optimization to none (-O0) in Makefile. - - Signed-off-by: Bogdan Pricop - Signed-off-by: David Hunt - - Author: Bogdan Pricop - -commit 82c3529091c7c2d1f13d1d55c3d31cdf0aa56840 -Author: Dan O'Donovan -Date: Fri May 15 16:25:07 2015 +0100 - - ATLEDGE-82 init code for arc - - Eliminating compiler warnings and cleanup. - - Signed-off-by: Dan O'Donovan - Signed-off-by: David Hunt - - Conflicts: - system/libarc32_edu/drivers/ns16550.c - system/libarc32_edu/drivers/uart.h - system/libarc32_edu/main.c - -commit 4a29f5c30fb52e433f30c1ab7ba30244953e2d05 -Author: Dan O'Donovan -Date: Fri May 15 14:46:08 2015 +0100 - - cfw: Importing Component Framework library code from Thunderdome - - Framework code extracted from the following commit ID in - Intel's thunderdome git repo: 8b198659675cd820072bdeb00d0c5de87c6f6ee2 - - This brings the necessary library code into the source tree, but not - yet integrated in the Arduino run-time environment (to follow shortly). - - Signed-off-by: Dan O'Donovan - -commit c2f3e0413c6e1c4567faedd5b2e7a8308fc8c42e -Author: Bogdan Pricop -Date: Fri May 15 14:24:10 2015 +0100 - - ATLEDGE-82 init code - Fix interrupt handling bug. - - Issue: - A simple blink sketch having a 10 ms delay between blinks crashed - after a few seconds. - It looks like the stack got corrupted. - Root cause: - The generic assembly hardware ISR, "_do_isr", was not properly - written; the "sp" was not properly handled. - Solution: - Replace the assembly hardware ISR with a C function having - "__attribute__((interrupt("ilink")))" - - Note: - We need this generic hardware ISR because the IVT is in flash and - we cannot change it at runtime. - - Signed-off-by: Bogdan Pricop - Signed-off-by: David Hunt - -commit 723be266ea682a413efca74e5b69190e17bf2a65 -Author: Dan O'Donovan -Date: Fri May 15 14:49:26 2015 +0100 - - Allocating more SRAM to ARC (syncing with latest Thunderdome mem allocation) - - Signed-off-by: Dan O'Donovan - -commit b9bc0fb221574f5f5a52abfa1d9d2b3da85fc1ba -Author: Bogdan Pricop -Date: Tue May 12 21:31:11 2015 +0100 - - .gitignore file added to repo. - - Signed-off-by: Bogdan Pricop - -commit bd205779390d879a5e866941b840e5094204c97c -Author: Dan O'Donovan -Date: Tue May 12 17:47:54 2015 +0100 - - build: Adding HEAP section - - Adding heap section with start/end marker symbols to satisfy - malloc() and friends - - Signed-off-by: Dan O'Donovan - -commit 4139a2efcdee1b210933b7abeee2bea084d1b369 -Author: David Hunt -Date: Tue May 19 12:06:17 2015 +0100 - - ATLEDGE-75 Arduino time related functions. - - A first draft for the following functions: - * delay() - * millis(); - * micros(); - Not yet implemented: - * delayMicroseconds. - - Author: Bogdan Pricop - - Signed-off-by: Bogdan Pricop - Signed-off-by: David Hunt - -commit 3689741b718ce769a50515d661a7ebf13cf733be -Author: David Hunt -Date: Tue May 19 11:58:55 2015 +0100 - - ATLEDGE-24 Serial Communication API - - Intial release of serial functionality, Serial.write, print, println, read - Also added files required, Ringbuffer (not used yet), Print, etc. - Also some small changes to make Intel toolchain work, still more work needed. - - Signed-off-by: David Hunt - -commit 57550ebb85d6f69dc52cefcf38f47a7995f708b3 -Author: David Hunt -Date: Tue May 19 11:52:19 2015 +0100 - - ATLEDGE-83 Component Framework integration into bare metal - - Author: Dan O'Donovan - Date: Fri May 15 14:46:08 2015 +0100 - - Framework code extracted from the following commit ID in - Intel's thunderdome git repo: 8b198659675cd820072bdeb00d0c5de87c6f6ee2 - - This brings the necessary library code into the source tree, but not - yet integrated in the Arduino run-time environment (to follow shortly). - - Signed-off-by: Dan O'Donovan - Signed-off-by: David Hunt - -commit ed4bf0214f53df5b8c255ed6f575fcdc6bf361d3 -Author: David Hunt -Date: Tue May 19 11:48:40 2015 +0100 - - ATLEDGE-15 basic analog functions - - Adding analogWriteResolution and analogReadResolution - - Signed-off-by: Dan O'Donovan - Signed-off-by: David Hunt - -commit 32aff42d8023cafcb6b5b86820e455b1914ecf55 -Author: David Hunt -Date: Wed May 6 17:14:51 2015 +0100 - - ATLEDGE-62 Create Initial Release of Arduino Corelibs - - Adding licence headers to those files that don't have any. - - Signed-off-by: David Hunt - -commit 09a6c2ea91c99a7f8e3aff45cb4bc7f3e501a715 -Author: David Hunt -Date: Wed May 6 14:50:40 2015 +0100 - - ATLEDGE-62 Create Initial Release of Arduino Corelibs - - Allows Arduino IDE to build Blink Sketch - Includes pinMode(), digitalWrite() and delay() - Allows download via JTAG - - Signed-off-by: David Hunt - -commit a5ca45cc6a31e8775363fa6c3f0c32e337945a43 -Author: Dino Tinitigan -Date: Thu Apr 16 14:05:33 2015 -0700 - - Initial commit of core files - - Initial commit of core files - -commit 631d399bf35241b823ae74b3b4dc6b27d303078e -Author: Calvin Park -Date: Thu Apr 16 13:29:04 2015 -0700 - - Initial commit From 6887ba3be67e6db1b0e702fa11edcf7dd7f34f0b Mon Sep 17 00:00:00 2001 From: Sandeep Mistry Date: Thu, 29 Dec 2016 16:28:35 -0500 Subject: [PATCH 44/91] Jira 872, BLE sample sketch update from Arduino, PR 375 --- .../central/led_control/led_control.ino | 17 ++- .../BatteryMonitor.ino} | 64 +++-------- .../peripheral/ButtonLED/ButtonLED.ino | 94 ++++++++++++++++ .../peripheral/CallbackLED/CallbackLED.ino | 95 ++++++++++++++++ .../CurieBLE/examples/peripheral/LED/LED.ino | 99 +++++++++++++++++ .../CurieBLE/examples/peripheral/led/led.ino | 101 ------------------ .../peripheral/led_callback/led_callback.ino | 99 ----------------- .../BatteryMonitor_Central.ino | 0 .../CentralDouble/CentralDouble.ino | 0 .../IMUBleCentral/IMUBleCentral.ino | 0 .../IMUBleNotification/IMUBleNotification.ino | 0 .../PeripheralDouble/PeripheralDouble.ino | 0 libraries/CurieBLE/keywords.txt | 2 + 13 files changed, 313 insertions(+), 258 deletions(-) rename libraries/CurieBLE/examples/peripheral/{BatteryMonitor_Notification/BatteryMonitor_Notification.ino => BatteryMonitor/BatteryMonitor.ino} (67%) create mode 100644 libraries/CurieBLE/examples/peripheral/ButtonLED/ButtonLED.ino create mode 100644 libraries/CurieBLE/examples/peripheral/CallbackLED/CallbackLED.ino create mode 100644 libraries/CurieBLE/examples/peripheral/LED/LED.ino delete mode 100644 libraries/CurieBLE/examples/peripheral/led/led.ino delete mode 100644 libraries/CurieBLE/examples/peripheral/led_callback/led_callback.ino rename libraries/CurieBLE/examples/{central => test}/BatteryMonitor_Central/BatteryMonitor_Central.ino (100%) rename libraries/CurieBLE/examples/{central => test}/CentralDouble/CentralDouble.ino (100%) rename libraries/CurieBLE/examples/{central => test}/IMUBleCentral/IMUBleCentral.ino (100%) rename libraries/CurieBLE/examples/{peripheral => test}/IMUBleNotification/IMUBleNotification.ino (100%) rename libraries/CurieBLE/examples/{peripheral => test}/PeripheralDouble/PeripheralDouble.ino (100%) diff --git a/libraries/CurieBLE/examples/central/led_control/led_control.ino b/libraries/CurieBLE/examples/central/led_control/led_control.ino index fd8ce3c2..0ef64ff6 100644 --- a/libraries/CurieBLE/examples/central/led_control/led_control.ino +++ b/libraries/CurieBLE/examples/central/led_control/led_control.ino @@ -39,7 +39,7 @@ void setup() { Serial.println("BLE Central - LED control"); // start scanning for peripherals - BLE.scan(); + BLE.scanForUuid("19b10000-e8f2-537e-4f6c-d104768a1214"); } void loop() { @@ -56,16 +56,13 @@ void loop() { Serial.print(peripheral.advertisedServiceUuid()); Serial.println(); - // see if peripheral is advertising the LED service - if (peripheral.advertisedServiceUuid() == "19b10000-e8f2-537e-4f6c-d104768a1214") { - // stop scanning - BLE.stopScan(); + // stop scanning + BLE.stopScan(); - controlLed(peripheral); + controlLed(peripheral); - // peripheral disconnected, start scanning again - BLE.scan(); - } + // peripheral disconnected, start scanning again + BLE.scanForUuid("19b10000-e8f2-537e-4f6c-d104768a1214"); } } @@ -126,6 +123,8 @@ void controlLed(BLEDevice peripheral) { } } } + + Serial.println("Peripheral disconnected"); } /* diff --git a/libraries/CurieBLE/examples/peripheral/BatteryMonitor_Notification/BatteryMonitor_Notification.ino b/libraries/CurieBLE/examples/peripheral/BatteryMonitor/BatteryMonitor.ino similarity index 67% rename from libraries/CurieBLE/examples/peripheral/BatteryMonitor_Notification/BatteryMonitor_Notification.ino rename to libraries/CurieBLE/examples/peripheral/BatteryMonitor/BatteryMonitor.ino index a44cd6b6..e898e2aa 100644 --- a/libraries/CurieBLE/examples/peripheral/BatteryMonitor_Notification/BatteryMonitor_Notification.ino +++ b/libraries/CurieBLE/examples/peripheral/BatteryMonitor/BatteryMonitor.ino @@ -4,7 +4,7 @@ */ /* - * Sketch: BatteryMonitor_Notification.ino + * Sketch: BatteryMonitor.ino * * Description: * This sketch example partially implements the standard Bluetooth @@ -13,11 +13,6 @@ * For more information: * https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx * - * Notes: - * - * - Expected to work with BatteryMonitor_Central sketch. - * You can also use an android or IOS app that supports notifications. - * */ #include @@ -25,35 +20,39 @@ BLEService batteryService("180F"); // BLE Battery Service // BLE Battery Level Characteristic" -BLEUnsignedCharCharacteristic batteryLevelChar("2A19", BLERead | BLENotify); // standard 16-bit characteristic UUID defined in the URL above - // remote clients will be able to get notifications if this characteristic changes +BLEUnsignedCharCharacteristic batteryLevelChar("2A19", // standard 16-bit characteristic UUID + BLERead | BLENotify); // remote clients will be able to +// get notifications if this characteristic changes int oldBatteryLevel = 0; // last battery level reading from analog input long previousMillis = 0; // last time the battery level was checked, in ms void setup() { - BLE.begin(); Serial.begin(9600); // initialize serial communication pinMode(13, OUTPUT); // initialize the LED on pin 13 to indicate when a central is connected + // begin initialization + BLE.begin(); + /* Set a local name for the BLE device This name will appear in advertising packets and can be used by remote devices to identify this BLE device The name can be changed but maybe be truncated based on space left in advertisement packet If you want to make this work with the BatteryMonitor_Central sketch, do not modufy the name. */ - BLE.setLocalName("BatteryMonitorSketch"); - BLE.setAdvertisedServiceUuid(batteryService.uuid()); // add the service UUID - BLE.addService(batteryService); // Add the BLE Battery service + BLE.setLocalName("BatteryMonitor"); + BLE.setAdvertisedService(batteryService); // add the service UUID batteryService.addCharacteristic(batteryLevelChar); // add the battery level characteristic + BLE.addService(batteryService); // Add the BLE Battery service batteryLevelChar.setValue(oldBatteryLevel); // initial value for this characteristic - /* Now activate the BLE device. It will start continuously transmitting BLE + /* Start advertising BLE. It will start continuously transmitting BLE advertising packets and will be visible to remote BLE central devices - until it receives a new connection - */ + until it receives a new connection */ + // start advertising BLE.advertise(); + Serial.println("Bluetooth device active, waiting for connections..."); } @@ -77,14 +76,6 @@ void loop() { if (currentMillis - previousMillis >= 200) { previousMillis = currentMillis; updateBatteryLevel(); - - static unsigned short count = 0; - count++; - // update the connection interval - if (count % 5 == 0) { - delay(1000); - updateIntervalParams(central); - } } } // when the central disconnects, turn off the LED: @@ -104,36 +95,11 @@ void updateBatteryLevel() { if (batteryLevel != oldBatteryLevel) { // if the battery level has changed Serial.print("Battery Level % is now: "); // print it Serial.println(batteryLevel); - batteryLevelChar.writeUnsignedChar(batteryLevel); // and update the battery level characteristic + batteryLevelChar.setValue(batteryLevel); // and update the battery level characteristic oldBatteryLevel = batteryLevel; // save the level for next comparison } } -void updateIntervalParams(BLEDevice central) { - // read and update the connection interval that peer central device - static unsigned short interval = 0x60; - ble_conn_param_t m_conn_param; - // Get connection interval that peer central device wanted - //central.getConnParams(m_conn_param); - Serial.print("min interval = " ); - Serial.println(m_conn_param.interval_min ); - Serial.print("max interval = " ); - Serial.println(m_conn_param.interval_max ); - Serial.print("latency = " ); - Serial.println(m_conn_param.latency ); - Serial.print("timeout = " ); - Serial.println(m_conn_param.timeout ); - - //Update connection interval - Serial.println("set Connection Interval"); - central.setConnectionInterval(interval, interval); - - interval++; - if (interval < 0x06) - interval = 0x06; - if (interval > 0x100) - interval = 0x06; -} /* Copyright (c) 2016 Intel Corporation. All rights reserved. diff --git a/libraries/CurieBLE/examples/peripheral/ButtonLED/ButtonLED.ino b/libraries/CurieBLE/examples/peripheral/ButtonLED/ButtonLED.ino new file mode 100644 index 00000000..72a88a5e --- /dev/null +++ b/libraries/CurieBLE/examples/peripheral/ButtonLED/ButtonLED.ino @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2016 Intel Corporation. All rights reserved. + * See the bottom of this file for the license terms. + */ + +#include + +const int ledPin = 13; // set ledPin to on-board LED +const int buttonPin = 4; // set buttonPin to digital pin 4 + +BLEService ledService("19B10010-E8F2-537E-4F6C-D104768A1214"); // create service + + +// create switch characteristic and allow remote device to read and write +BLECharCharacteristic ledCharacteristic("19B10011-E8F2-537E-4F6C-D104768A1214", BLERead | BLEWrite); +// create button characteristic and allow remote device to get notifications +BLECharCharacteristic buttonCharacteristic("19B10012-E8F2-537E-4F6C-D104768A1214", BLERead | BLENotify); // allows remote device to get notifications + +void setup() { + Serial.begin(9600); + pinMode(ledPin, OUTPUT); // use the LED on pin 13 as an output + pinMode(buttonPin, INPUT); // use button pin 4 as an input + + // begin initialization + BLE.begin(); + + // set the local name peripheral advertises + BLE.setLocalName("BtnLED"); + // set the UUID for the service this peripheral advertises: + BLE.setAdvertisedService(ledService); + + // add the characteristics to the service + ledService.addCharacteristic(ledCharacteristic); + ledService.addCharacteristic(buttonCharacteristic); + + // add the service + BLE.addService(ledService); + + ledCharacteristic.setValue(0); + buttonCharacteristic.setValue(0); + + // start advertising + BLE.advertise(); + + Serial.println("Bluetooth device active, waiting for connections..."); +} + +void loop() { + // poll for BLE events + BLE.poll(); + + // read the current button pin state + char buttonValue = digitalRead(buttonPin); + + // has the value changed since the last read + boolean buttonChanged = (buttonCharacteristic.value() != buttonValue); + + if (buttonChanged) { + // button state changed, update characteristics + ledCharacteristic.setValue(buttonValue); + buttonCharacteristic.setValue(buttonValue); + } + + if (ledCharacteristic.written() || buttonChanged) { + // update LED, either central has written to characteristic or button state has changed + if (ledCharacteristic.value()) { + Serial.println("LED on"); + digitalWrite(ledPin, HIGH); + } else { + Serial.println("LED off"); + digitalWrite(ledPin, LOW); + } + } +} + +/* + Copyright (c) 2016 Intel Corporation. All rights reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110- + 1301 USA +*/ + \ No newline at end of file diff --git a/libraries/CurieBLE/examples/peripheral/CallbackLED/CallbackLED.ino b/libraries/CurieBLE/examples/peripheral/CallbackLED/CallbackLED.ino new file mode 100644 index 00000000..c0d02e3e --- /dev/null +++ b/libraries/CurieBLE/examples/peripheral/CallbackLED/CallbackLED.ino @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2016 Intel Corporation. All rights reserved. + * See the bottom of this file for the license terms. + */ + +#include + +const int ledPin = 13; // set ledPin to use on-board LED + +BLEService ledService("19B10000-E8F2-537E-4F6C-D104768A1214"); // create service + +// create switch characteristic and allow remote device to read and write +BLECharCharacteristic switchChar("19B10001-E8F2-537E-4F6C-D104768A1214", BLERead | BLEWrite); + +void setup() { + Serial.begin(9600); + pinMode(ledPin, OUTPUT); // use the LED on pin 13 as an output + + // begin initialization + BLE.begin(); + + // set the local name peripheral advertises + BLE.setLocalName("LEDCB"); + // set the UUID for the service this peripheral advertises + BLE.setAdvertisedService(ledService); + + // add the characteristic to the service + ledService.addCharacteristic(switchChar); + + // add service + BLE.addService(ledService); + + // assign event handlers for connected, disconnected to peripheral + BLE.setEventHandler(BLEConnected, blePeripheralConnectHandler); + BLE.setEventHandler(BLEDisconnected, blePeripheralDisconnectHandler); + + // assign event handlers for characteristic + switchChar.setEventHandler(BLEWritten, switchCharacteristicWritten); + // set an initial value for the characteristic + switchChar.setValue(0); + + // start advertising + BLE.advertise(); + + Serial.println(("Bluetooth device active, waiting for connections...")); +} + +void loop() { + // poll for BLE events + BLE.poll(); +} + +void blePeripheralConnectHandler(BLEDevice central) { + // central connected event handler + Serial.print("Connected event, central: "); + Serial.println(central.address()); +} + +void blePeripheralDisconnectHandler(BLEDevice central) { + // central disconnected event handler + Serial.print("Disconnected event, central: "); + Serial.println(central.address()); +} + +void switchCharacteristicWritten(BLEDevice central, BLECharacteristic characteristic) { + // central wrote new value to characteristic, update LED + Serial.print("Characteristic event, written: "); + + if (switchChar.value()) { + Serial.println("LED on"); + digitalWrite(ledPin, HIGH); + } else { + Serial.println("LED off"); + digitalWrite(ledPin, LOW); + } +} + +/* + Copyright (c) 2016 Intel Corporation. All rights reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110- + 1301 USA +*/ diff --git a/libraries/CurieBLE/examples/peripheral/LED/LED.ino b/libraries/CurieBLE/examples/peripheral/LED/LED.ino new file mode 100644 index 00000000..258cb455 --- /dev/null +++ b/libraries/CurieBLE/examples/peripheral/LED/LED.ino @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2016 Intel Corporation. All rights reserved. + * See the bottom of this file for the license terms. + */ + +/* + * Sketch: led.ino + * + * Description: + * This is a Peripheral sketch that works with a connected Central. + * It allows the Central to write a value and set/reset the led + * accordingly. + */ + +#include + +BLEService ledService("19B10000-E8F2-537E-4F6C-D104768A1214"); // BLE LED Service + +// BLE LED Switch Characteristic - custom 128-bit UUID, read and writable by central +BLEUnsignedCharCharacteristic switchCharacteristic("19B10001-E8F2-537E-4F6C-D104768A1214", BLERead | BLEWrite); + +const int ledPin = 13; // pin to use for the LED + +void setup() { + Serial.begin(9600); + + // set LED pin to output mode + pinMode(ledPin, OUTPUT); + + // begin initialization + BLE.begin(); + + // set advertised local name and service UUID: + BLE.setLocalName("LED"); + BLE.setAdvertisedService(ledService); + + // add the characteristic to the service + ledService.addCharacteristic(switchCharacteristic); + + // add service + BLE.addService(ledService); + + // set the initial value for the characeristic: + switchCharacteristic.setValue(0); + + // start advertising + BLE.advertise(); + + Serial.println("BLE LED Peripheral"); +} + +void loop() { + // listen for BLE peripherals to connect: + BLEDevice central = BLE.central(); + + // if a central is connected to peripheral: + if (central) { + Serial.print("Connected to central: "); + // print the central's MAC address: + Serial.println(central.address()); + + // while the central is still connected to peripheral: + while (central.connected()) { + // if the remote device wrote to the characteristic, + // use the value to control the LED: + if (switchCharacteristic.written()) { + if (switchCharacteristic.value()) { // any value other than 0 + Serial.println("LED on"); + digitalWrite(ledPin, HIGH); // will turn the LED on + } else { // a 0 value + Serial.println(F("LED off")); + digitalWrite(ledPin, LOW); // will turn the LED off + } + } + } + + // when the central disconnects, print it out: + Serial.print(F("Disconnected from central: ")); + Serial.println(central.address()); + } +} + +/* + Copyright (c) 2016 Intel Corporation. All rights reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ diff --git a/libraries/CurieBLE/examples/peripheral/led/led.ino b/libraries/CurieBLE/examples/peripheral/led/led.ino deleted file mode 100644 index 4cbb25dd..00000000 --- a/libraries/CurieBLE/examples/peripheral/led/led.ino +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright (c) 2016 Intel Corporation. All rights reserved. - * See the bottom of this file for the license terms. - */ - -/* - * Sketch: led.ino - * - * Description: - * This is a Peripheral sketch that works with a connected Central. - * It allows the Central to write a value and set/reset the led - * accordingly. - */ - -#include - -// LED pin -#define LED_PIN 13 - -// create service -BLEService ledService("19b10000e8f2537e4f6cd104768a1214"); - -// create switch characteristic -BLECharCharacteristic switchCharacteristic("19b10001e8f2537e4f6cd104768a1214", BLERead | BLEWrite); - -BLEDescriptor switchDescriptor("2901", "switch"); - -void setup() { - Serial.begin(9600); - - // set LED pin to output mode - pinMode(LED_PIN, OUTPUT); - - // begin initialization - BLE.begin(); - Serial.println(BLE.address()); - - // set advertised local name and service UUID - BLE.setLocalName("LED"); - BLE.setAdvertisedServiceUuid(ledService.uuid()); - - switchCharacteristic.addDescriptor(switchDescriptor); - ledService.addCharacteristic(switchCharacteristic); - - // add service and characteristic - BLE.addService(ledService); - - BLE.advertise(); - - Serial.println(F("BLE LED Peripheral")); -} - -void loop() { - BLEDevice central = BLE.central(); - - if (central) { - // central connected to peripheral - Serial.print(F("Connected to central: ")); - Serial.println(central.address()); - - while (central.connected()) { - // central still connected to peripheral - if (switchCharacteristic.written()) { - // central wrote new value to characteristic, update LED - if (switchCharacteristic.value()) { - Serial.println(F("LED on")); - digitalWrite(LED_PIN, HIGH); - } else { - Serial.println(F("LED off")); - digitalWrite(LED_PIN, LOW); - } - } - } - - // central disconnected - Serial.print(F("Disconnected from central: ")); - Serial.println(central.address()); - } -} - - -/* - Arduino BLE Peripheral LED example - Copyright (c) 2016 Arduino LLC. All right reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ - - diff --git a/libraries/CurieBLE/examples/peripheral/led_callback/led_callback.ino b/libraries/CurieBLE/examples/peripheral/led_callback/led_callback.ino deleted file mode 100644 index 54a5c659..00000000 --- a/libraries/CurieBLE/examples/peripheral/led_callback/led_callback.ino +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (c) 2016 Intel Corporation. All rights reserved. - * See the bottom of this file for the license terms. - */ - -// Import libraries -#include - -// LED pin -#define LED_PIN 13 - -// create service -BLEService ledService("19b10000e8f2537e4f6cd104768a1214"); - -// create switch characteristic -BLECharCharacteristic switchCharacteristic("19b10001e8f2537e4f6cd104768a1214", BLERead | BLEWrite); - -void setup() { - Serial.begin(9600); - - // set LED pin to output mode - pinMode(LED_PIN, OUTPUT); - - // begin initialization - BLE.begin(); - - // set advertised local name and service UUID - BLE.setLocalName("LED"); - BLE.setAdvertisedServiceUuid(ledService.uuid()); - - ledService.addCharacteristic(switchCharacteristic); - - // add service - BLE.addService(ledService); - - // assign event handlers for connected, disconnected to peripheral - BLE.setEventHandler(BLEConnected, bleDeviceConnectHandler); - BLE.setEventHandler(BLEDisconnected, bleDeviceDisconnectHandler); - - // assign event handlers for characteristic - switchCharacteristic.setEventHandler(BLEWritten, switchCharacteristicWritten); - - BLE.advertise(); - - Serial.println(F("BLE LED Peripheral")); -} - -void loop() { - // poll peripheral - BLE.poll(); -} - -void bleDeviceConnectHandler(BLEDevice central) { - // central connected event handler - Serial.print(F("Connected event, central: ")); - Serial.println(central.address()); -} - -void bleDeviceDisconnectHandler(BLEDevice central) { - // central disconnected event handler - Serial.print(F("Disconnected event, central: ")); - Serial.println(central.address()); -} - -void switchCharacteristicWritten(BLEDevice central, BLECharacteristic characteristic) { - // central wrote new value to characteristic, update LED - Serial.print(F("Characteristic event, writen: ")); - - if (switchCharacteristic.value()) { - Serial.println(F("LED on")); - digitalWrite(LED_PIN, HIGH); - } else { - Serial.println(F("LED off")); - digitalWrite(LED_PIN, LOW); - } -} - - - -/* - Arduino BLE Peripheral LED callback example - Copyright (c) 2016 Arduino LLC. All right reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ - - diff --git a/libraries/CurieBLE/examples/central/BatteryMonitor_Central/BatteryMonitor_Central.ino b/libraries/CurieBLE/examples/test/BatteryMonitor_Central/BatteryMonitor_Central.ino similarity index 100% rename from libraries/CurieBLE/examples/central/BatteryMonitor_Central/BatteryMonitor_Central.ino rename to libraries/CurieBLE/examples/test/BatteryMonitor_Central/BatteryMonitor_Central.ino diff --git a/libraries/CurieBLE/examples/central/CentralDouble/CentralDouble.ino b/libraries/CurieBLE/examples/test/CentralDouble/CentralDouble.ino similarity index 100% rename from libraries/CurieBLE/examples/central/CentralDouble/CentralDouble.ino rename to libraries/CurieBLE/examples/test/CentralDouble/CentralDouble.ino diff --git a/libraries/CurieBLE/examples/central/IMUBleCentral/IMUBleCentral.ino b/libraries/CurieBLE/examples/test/IMUBleCentral/IMUBleCentral.ino similarity index 100% rename from libraries/CurieBLE/examples/central/IMUBleCentral/IMUBleCentral.ino rename to libraries/CurieBLE/examples/test/IMUBleCentral/IMUBleCentral.ino diff --git a/libraries/CurieBLE/examples/peripheral/IMUBleNotification/IMUBleNotification.ino b/libraries/CurieBLE/examples/test/IMUBleNotification/IMUBleNotification.ino similarity index 100% rename from libraries/CurieBLE/examples/peripheral/IMUBleNotification/IMUBleNotification.ino rename to libraries/CurieBLE/examples/test/IMUBleNotification/IMUBleNotification.ino diff --git a/libraries/CurieBLE/examples/peripheral/PeripheralDouble/PeripheralDouble.ino b/libraries/CurieBLE/examples/test/PeripheralDouble/PeripheralDouble.ino similarity index 100% rename from libraries/CurieBLE/examples/peripheral/PeripheralDouble/PeripheralDouble.ino rename to libraries/CurieBLE/examples/test/PeripheralDouble/PeripheralDouble.ino diff --git a/libraries/CurieBLE/keywords.txt b/libraries/CurieBLE/keywords.txt index 2db97095..a98db39d 100644 --- a/libraries/CurieBLE/keywords.txt +++ b/libraries/CurieBLE/keywords.txt @@ -104,6 +104,8 @@ setTxPower KEYWORD2 setConnectable KEYWORD2 setDeviceName KEYWORD2 addService KEYWORD2 +addCharacteristic KEYWORD2 +addDescriptor KEYWORD2 advertise KEYWORD2 stopAdvertise KEYWORD2 central KEYWORD2 From 2daed478047ff734551afcaddffb27debc352be3 Mon Sep 17 00:00:00 2001 From: Dino Tinitigan Date: Thu, 16 Mar 2017 15:27:03 -0700 Subject: [PATCH 45/91] Make sure LED is not lit on sketch start -The LED retains the last state it was in after a sketch upload -We need to make sure its is not lit on sketch startup so that behavior is consistent --- variants/arduino_101/variant.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/variants/arduino_101/variant.cpp b/variants/arduino_101/variant.cpp index 9e9b52ce..d352e4c2 100644 --- a/variants/arduino_101/variant.cpp +++ b/variants/arduino_101/variant.cpp @@ -180,6 +180,8 @@ void variantGpioInit(void) SET_PIN_MODE(p->ulSocPin, p->ulPinMode); pinmuxMode[pin] = GPIO_MUX_MODE; } + //make sure the led is not lit on sketch start + digitalWrite(LED_BUILTIN, LOW); } void variantPwmInit(void) From 6b33e736a7ba9c5038c1a14fb7e6fb5bc099be71 Mon Sep 17 00:00:00 2001 From: Dino Tinitigan Date: Tue, 21 Mar 2017 14:17:08 -0700 Subject: [PATCH 46/91] Set all pins to INPUT on sketch startup --- variants/arduino_101/variant.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/variants/arduino_101/variant.cpp b/variants/arduino_101/variant.cpp index d352e4c2..31473536 100644 --- a/variants/arduino_101/variant.cpp +++ b/variants/arduino_101/variant.cpp @@ -179,9 +179,8 @@ void variantGpioInit(void) PinDescription *p = &g_APinDescription[pin]; SET_PIN_MODE(p->ulSocPin, p->ulPinMode); pinmuxMode[pin] = GPIO_MUX_MODE; + pinMode(pin, INPUT); } - //make sure the led is not lit on sketch start - digitalWrite(LED_BUILTIN, LOW); } void variantPwmInit(void) From 07fce54fc33e42db69e626e979a03debf4f3ffab Mon Sep 17 00:00:00 2001 From: Sandeep Mistry Date: Thu, 16 Mar 2017 11:38:50 -0400 Subject: [PATCH 47/91] Set characteristic value internally if it not associated with a service yet --- libraries/CurieBLE/src/BLECharacteristic.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libraries/CurieBLE/src/BLECharacteristic.cpp b/libraries/CurieBLE/src/BLECharacteristic.cpp index 278eb1d4..1416cef3 100644 --- a/libraries/CurieBLE/src/BLECharacteristic.cpp +++ b/libraries/CurieBLE/src/BLECharacteristic.cpp @@ -283,6 +283,10 @@ bool BLECharacteristic::writeValue(const byte value[], int length, int offset) characteristicImp->valueLength()); BLEDeviceManager::instance()->startAdvertising(); } + } else { + // not associated with a service yet + _setValue(value, length); + retVar = true; } return retVar; } From 33df47d4f855250cffe4e0211198121b18dda851 Mon Sep 17 00:00:00 2001 From: lianggao Date: Mon, 27 Feb 2017 15:18:23 +0800 Subject: [PATCH 48/91] Implement the block call for descriptor read method --- .../CurieBLE/src/internal/BLEDescriptorImp.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/libraries/CurieBLE/src/internal/BLEDescriptorImp.cpp b/libraries/CurieBLE/src/internal/BLEDescriptorImp.cpp index 42ca6a24..d773f63c 100644 --- a/libraries/CurieBLE/src/internal/BLEDescriptorImp.cpp +++ b/libraries/CurieBLE/src/internal/BLEDescriptorImp.cpp @@ -172,6 +172,7 @@ bool BLEDescriptorImp::read() { int retval = 0; bt_conn_t* conn = NULL; + bool ret_bool = true; if (true == BLEUtils::isLocalBLE(_bledev)) { @@ -209,6 +210,13 @@ bool BLEDescriptorImp::read() { _reading = true; } + + // Block the read + while (_reading == true && ret_bool) + { + delay(5); + ret_bool = _bledev.connected(); + } return _reading; } @@ -219,6 +227,12 @@ bool BLEDescriptorImp::writeValue(const byte value[], bool ret = true; int total_length = length + offset; int write_len = length; + + if (_reading) + { + _reading = false; + } + if (total_length > BLE_MAX_ATTR_DATA_LEN) { return false; From d72f2bd191c35b57d1a4e2f558d3441420fb3d06 Mon Sep 17 00:00:00 2001 From: Sandeep Mistry Date: Wed, 15 Mar 2017 13:40:51 -0400 Subject: [PATCH 49/91] Correct | to &, and swap order of write vs write without response --- .../src/internal/BLECharacteristicImp.cpp | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/libraries/CurieBLE/src/internal/BLECharacteristicImp.cpp b/libraries/CurieBLE/src/internal/BLECharacteristicImp.cpp index 35567130..a7098e96 100644 --- a/libraries/CurieBLE/src/internal/BLECharacteristicImp.cpp +++ b/libraries/CurieBLE/src/internal/BLECharacteristicImp.cpp @@ -697,15 +697,7 @@ bool BLECharacteristicImp::write(const unsigned char value[], } // Send write request - if (_gatt_chrc.properties | BT_GATT_CHRC_WRITE_WITHOUT_RESP) - { - retval = bt_gatt_write_without_response(conn, - _value_handle, - value, - length, - false); - } - else if (_gatt_chrc.properties | BT_GATT_CHRC_WRITE) + if (_gatt_chrc.properties & BT_GATT_CHRC_WRITE) { _gattc_writing = true; retval = bt_gatt_write(conn, @@ -718,6 +710,13 @@ bool BLECharacteristicImp::write(const unsigned char value[], { delay(2); } + } else if (_gatt_chrc.properties & BT_GATT_CHRC_WRITE_WITHOUT_RESP) + { + retval = bt_gatt_write_without_response(conn, + _value_handle, + value, + length, + false); } bt_conn_unref(conn); return (0 == retval); From 98c1746d912bbcc7f59c119a92a9a4f008f769a5 Mon Sep 17 00:00:00 2001 From: lianggao Date: Mon, 13 Mar 2017 16:08:25 +0800 Subject: [PATCH 50/91] Fix Jira876 BLE scanForName() device from previous scan is picked up Root cause: 1. The buffer doesn't cleared. The scanned data is not the latest. Changed files: BLEDeviceManager.cpp a. Clear the buffered data when start scan. b. Invalid scan response when buffer timeout or disconnected. --- .../src/internal/BLEDeviceManager.cpp | 41 +++++++++++++++---- .../CurieBLE/src/internal/BLEDeviceManager.h | 1 + 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/libraries/CurieBLE/src/internal/BLEDeviceManager.cpp b/libraries/CurieBLE/src/internal/BLEDeviceManager.cpp index 56e2e960..6ed15e2d 100644 --- a/libraries/CurieBLE/src/internal/BLEDeviceManager.cpp +++ b/libraries/CurieBLE/src/internal/BLEDeviceManager.cpp @@ -101,8 +101,6 @@ BLEDeviceManager::BLEDeviceManager(): memset(&_available_for_connect_peripheral_adv_data, 0, sizeof(_available_for_connect_peripheral_adv_data)); memset(&_available_for_connect_peripheral_scan_rsp_data, 0, sizeof(_available_for_connect_peripheral_scan_rsp_data)); - - memset(&_wait_for_connect_peripheral, 0, sizeof(_wait_for_connect_peripheral)); memset(&_service_uuid, 0, sizeof(_service_uuid)); memset(&_service_solicit_uuid, 0, sizeof(_service_solicit_uuid)); @@ -576,10 +574,32 @@ BLEDevice BLEDeviceManager::peripheral() return temp; } +void BLEDeviceManager::_clearAdvertiseBuffer() +{ + + // Clear the previous found ADV + memset(_peer_temp_adv_buffer, 0, sizeof(_peer_temp_adv_buffer)); + memset(_peer_temp_adv_data, 0, sizeof(_peer_temp_adv_data)); + memset(_peer_temp_adv_data_len, 0, sizeof(_peer_temp_adv_data_len)); + memset(_peer_temp_adv_connectable, 0, sizeof(_peer_adv_connectable)); + + memset(_peer_adv_buffer, 0, sizeof(_peer_adv_buffer)); + memset(_peer_adv_mill, 0, sizeof(_peer_adv_mill)); + memset(_peer_adv_data, 0, sizeof(_peer_adv_data)); + memset(_peer_adv_data_len, 0, sizeof(_peer_adv_data_len)); + memset(_peer_scan_rsp_data, 0, sizeof(_peer_scan_rsp_data)); + memset(_peer_scan_rsp_data_len, 0, sizeof(_peer_scan_rsp_data_len)); + memset(_peer_adv_rssi, 0, sizeof(_peer_adv_rssi)); + +} + bool BLEDeviceManager::startScanning() { _adv_duplicate_filter_enabled = false; _scan_param.filter_dup = BT_HCI_LE_SCAN_FILTER_DUP_ENABLE; + + _clearAdvertiseBuffer(); + int err = bt_le_scan_start(&_scan_param, ble_central_device_found); if (err) { @@ -594,6 +614,8 @@ bool BLEDeviceManager::startScanningWithDuplicates() _adv_duplicate_filter_enabled = true; memset(_peer_duplicate_address_buffer, 0, sizeof(_peer_duplicate_address_buffer)); _duplicate_filter_header = _duplicate_filter_tail = 0; + + _clearAdvertiseBuffer(); _scan_param.filter_dup = BT_HCI_LE_SCAN_FILTER_DUP_ENABLE; int err = bt_le_scan_start(&_scan_param, ble_central_device_found); @@ -896,11 +918,6 @@ int BLEDeviceManager::advertisedServiceUuidCount(const BLEDevice* device) const return service_cnt; } - if ((len + 1) > adv_data_len) { // Sid. KW, can't be (adv_data_len < 2) - pr_info(LOG_MODULE_BLE, "AD malformed\n"); - return service_cnt; - } - /* Sid, 2/15/2017. Sandeep reported that Apple devices may use BT_DATA_UUID16_SOME and BT_DATA_UUID128_SOME in addition to ALL. Practically, these types are same as ALL. */ @@ -1067,6 +1084,11 @@ bool BLEDeviceManager::connect(BLEDevice &device) uint64_t timestamp = millis(); uint64_t timestampcur = timestamp; bool ret = true; + if (_available_for_connect_peripheral_connectable == false) + { + return false; + } + bt_addr_le_copy(&_wait_for_connect_peripheral, device.bt_le_address()); // Buffer the ADV data memcpy(_wait_for_connect_peripheral_adv_data, _available_for_connect_peripheral_adv_data, BLE_MAX_ADV_SIZE); @@ -1247,6 +1269,8 @@ void BLEDeviceManager::handleDisconnectEvent(bt_conn_t *conn, uint8_t reason) memset(_peer_peripheral_adv_data[i], 0, BLE_MAX_ADV_SIZE); _peer_peripheral_adv_data_len[i] = 0; _peer_peripheral_adv_rssi[i] = 0; + memset(_peer_peripheral_scan_rsp_data[i], 0, BLE_MAX_ADV_SIZE); + _peer_peripheral_scan_rsp_data_len[i] = 0; break; } } @@ -1406,7 +1430,10 @@ bool BLEDeviceManager::setAdvertiseBuffer(const bt_addr_le_t* bt_addr, { max_delta = timestamp_delta; if (max_delta > 2000) // expired + { index = i; + _peer_scan_rsp_data_len[index] = 0; // Invalid the scan response + } } if (bt_addr_le_cmp(temp, bt_addr) == 0) diff --git a/libraries/CurieBLE/src/internal/BLEDeviceManager.h b/libraries/CurieBLE/src/internal/BLEDeviceManager.h index 118c4c11..06accd2f 100644 --- a/libraries/CurieBLE/src/internal/BLEDeviceManager.h +++ b/libraries/CurieBLE/src/internal/BLEDeviceManager.h @@ -358,6 +358,7 @@ class BLEDeviceManager const uint8_t* data, uint8_t length); BLE_STATUS_T _advDataInit(void); + void _clearAdvertiseBuffer(); bool advertiseDataProc(uint8_t type, const uint8_t *dataPtr, uint8_t data_len); From 82eb1be749a10ef8be97ab847cdc6ef2e11a58ba Mon Sep 17 00:00:00 2001 From: Sidney Leung Date: Tue, 21 Mar 2017 23:26:19 -0700 Subject: [PATCH 51/91] Jira 896, merged to 01org/master Commit error: Committed files contained code mods for another ticket in addition to the those for Jira 896. --- libraries/CurieBLE/src/BLEDevice.cpp | 18 +--- libraries/CurieBLE/src/BLEDevice.h | 101 +++++++++--------- .../src/internal/BLEDeviceManager.cpp | 8 +- .../CurieBLE/src/internal/BLEDeviceManager.h | 2 +- 4 files changed, 54 insertions(+), 75 deletions(-) diff --git a/libraries/CurieBLE/src/BLEDevice.cpp b/libraries/CurieBLE/src/BLEDevice.cpp index 2c5a3189..5306d871 100644 --- a/libraries/CurieBLE/src/BLEDevice.cpp +++ b/libraries/CurieBLE/src/BLEDevice.cpp @@ -247,38 +247,22 @@ bool BLEDevice::startScan(bool withDuplicates) } else { - return BLEDeviceManager::instance()->startScanning(); + return BLEDeviceManager::instance()->startScanningNewPeripherals(); } } - -void BLEDevice::scan() -{ - scan(false); -} - void BLEDevice::scan(bool withDuplicates) { BLEDeviceManager::instance()->clearAdvertiseCritical(); startScan(withDuplicates); } -void BLEDevice::scanForName(String name) -{ - scanForName(name, false); -} - void BLEDevice::scanForName(String name, bool withDuplicates) { BLEDeviceManager::instance()->setAdvertiseCritical(name); startScan(withDuplicates); } -void BLEDevice::scanForUuid(String uuid) -{ - scanForUuid(uuid, false); -} - void BLEDevice::scanForUuid(String uuid, bool withDuplicates) { BLEService service_temp(uuid.c_str()); diff --git a/libraries/CurieBLE/src/BLEDevice.h b/libraries/CurieBLE/src/BLEDevice.h index 76e94f14..6b8ae72d 100644 --- a/libraries/CurieBLE/src/BLEDevice.h +++ b/libraries/CurieBLE/src/BLEDevice.h @@ -361,83 +361,78 @@ class BLEDevice //void scanForAddress(String address); // Not include in baseline. Add here as feature for feature release. /** - * @brief Start scanning for peripherals without filter + * @brief Start scanning for peripherals with the option of accepting all detectable + * Peripherals or just the newly detected. * - * @param none - * - * @return none - * - * @note none - */ - void scan(); - - /** - * @brief Start scanning for peripherals with filter - * - * @param[in] withDuplicates true - with duplicate filter - * false- without duplicate filter - * - * @return none - * - * @note option to filter out duplicate addresses for Arduino. - * The current only support fileter duplicate mode. - */ - void scan(bool withDuplicates); - - /** - * @brief Start scanning for peripherals and filter by device name in ADV - * - * @param name The device's local name. + * @param[in] withDuplicates true - return all detectable Peripherals. + * false- return a detected Peripheral only once. * * @return none * - * @note option to filter out duplicate addresses for Arduino. - * The current only support fileter duplicate mode. + * @note When, withDuplicates = true, accept all detectable Peripherals. + * No Peripheral filtering process applied to the scan result. + * By default, withDuplicates = false, a detected Peripheral is + * reported once. */ - void scanForName(String name); + void scan(bool withDuplicates = false); /** - * @brief Start scanning for peripherals and filter by device name in ADV + * @brief Start scanning for peripherals and filter by device name in ADV and + * the option of accepting all detectable Peripherals or just the + * newly detected. * * @param[in] name The device's local name. * - * @param[in] withDuplicates true - with duplicate filter - * false- without duplicate filter + * @param[in] withDuplicates true - return all detectable Peripherals. + * false- return a detected Peripheral only once. * * @return none * - * @note option to filter out duplicate addresses for Arduino. - * The current only support fileter duplicate mode. + * @note When, withDuplicates = true, accept all detectable Peripherals. + * No Peripheral filtering process applied to the scan result. + * By default, withDuplicates = false, a detected Peripheral is + * reported once. */ - void scanForName(String name, bool withDuplicates); + void scanForName(String name, bool withDuplicates = false); /** - * @brief Start scanning for peripherals and filter by service in ADV + * @brief Start scanning for peripherals and filter by service in ADV and + * the option of accepting all detectable Peripherals or just the + * newly detected. * - * @param service The service + * @param[in] service The service + * + * @param[in] withDuplicates true - return all detectable Peripherals. + * false- return a detected Peripheral only once. * * @return none * - * @note none + * @note When, withDuplicates = true, accept all detectable Peripherals. + * No Peripheral filtering process applied to the scan result. + * By default, withDuplicates = false, a detected Peripheral is + * reported once. */ - void scanForUuid(String uuid); + void scanForUuid(String uuid, bool withDuplicates = false); /** - * @brief Start scanning for peripherals and filter by service in ADV + * @brief Start scanning for peripherals and filter by MAC address and + * the option of accepting all detectable Peripherals or just the + * newly detected. * - * @param[in] service The service + * @param[in] macaddr The Peripheral MAC address * - * @param[in] withDuplicates true - with duplicate filter - * false- without duplicate filter + * @param[in] withDuplicates true - return all detectable Peripherals. + * false- return a detected Peripheral only once. * * @return none * - * @note option to filter out duplicate addresses for Arduino. - * The current only support fileter duplicate mode. + * @note When, withDuplicates = true, accept all detectable Peripherals. + * No Peripheral filtering process applied to the scan result. + * By default, withDuplicates = false, a detected Peripheral is + * reported once. */ - void scanForUuid(String uuid, bool withDuplicates); - - void scanForAddress(String macaddr, bool withDuplicates = true); + void scanForAddress(String macaddr, bool withDuplicates = false); + /** * @brief Stop scanning for peripherals * @@ -679,15 +674,15 @@ class BLEDevice void preCheckProfile(); /** - * @brief Start scanning for peripherals with/without duplicate filter + * @brief Start scanning for peripherals with the option of accepting all + * detectable Peripherals or just the newly detected. * - * @param[in] withDuplicates true - with duplicate filter - * false- without duplicate filter + * @param[in] withDuplicates true - return all detectable Peripherals. + * false- return a detected Peripheral only once. * * @return none * - * @note option to filter out duplicate addresses for Arduino. - * The current only support fileter duplicate mode. + * @note When, withDuplicates = true, accept all detectable Peripherals. */ bool startScan(bool withDuplicates); diff --git a/libraries/CurieBLE/src/internal/BLEDeviceManager.cpp b/libraries/CurieBLE/src/internal/BLEDeviceManager.cpp index 6ed15e2d..2b7f929d 100644 --- a/libraries/CurieBLE/src/internal/BLEDeviceManager.cpp +++ b/libraries/CurieBLE/src/internal/BLEDeviceManager.cpp @@ -593,7 +593,7 @@ void BLEDeviceManager::_clearAdvertiseBuffer() } -bool BLEDeviceManager::startScanning() +bool BLEDeviceManager::startScanningWithDuplicates() { _adv_duplicate_filter_enabled = false; _scan_param.filter_dup = BT_HCI_LE_SCAN_FILTER_DUP_ENABLE; @@ -609,7 +609,7 @@ bool BLEDeviceManager::startScanning() return true; } -bool BLEDeviceManager::startScanningWithDuplicates() +bool BLEDeviceManager::startScanningNewPeripherals() { _adv_duplicate_filter_enabled = true; memset(_peer_duplicate_address_buffer, 0, sizeof(_peer_duplicate_address_buffer)); @@ -1096,8 +1096,8 @@ bool BLEDeviceManager::connect(BLEDevice &device) _wait_for_connect_peripheral_adv_data_len = _available_for_connect_peripheral_adv_data_len; _wait_for_connect_peripheral_scan_rsp_data_len = _available_for_connect_peripheral_scan_rsp_data_len; _wait_for_connect_peripheral_adv_rssi = _available_for_connect_peripheral_adv_rssi; - - startScanning(); + + startScanningWithDuplicates(); pr_debug(LOG_MODULE_BLE, "%s-%d", __FUNCTION__, __LINE__); // Wait for the connection diff --git a/libraries/CurieBLE/src/internal/BLEDeviceManager.h b/libraries/CurieBLE/src/internal/BLEDeviceManager.h index 06accd2f..3a7aede2 100644 --- a/libraries/CurieBLE/src/internal/BLEDeviceManager.h +++ b/libraries/CurieBLE/src/internal/BLEDeviceManager.h @@ -310,7 +310,7 @@ class BLEDeviceManager void setAdvertiseCritical(String name); void setAdvertiseCritical(BLEService& service); void setAdvertiseCritical(const char* macaddress); - bool startScanning(); // start scanning for peripherals + bool startScanningNewPeripherals(); // start scanning for new peripherals, don't report the detected ones bool startScanningWithDuplicates(); // start scanning for peripherals, and report all duplicates bool stopScanning(); // stop scanning for peripherals From bb5b7b4939e3e486d012298b7a7b831c17eb2877 Mon Sep 17 00:00:00 2001 From: lianggao Date: Wed, 8 Feb 2017 20:48:43 +0800 Subject: [PATCH 52/91] Jira 671, Support Connection Interval updating. Description: This feature enables a sketch to change the Connection Interval, Timeout, and Latency. The feature is applicable to both Central and Peripheral mode. A change in the interval in the midst of a connection will terminate the connection. A re-connection is required. File mods: 1. BLEDeviceManager.cpp: - Application facing Connection Interval updating APIs. 2. BLEDevice.cpp: - The execution of the interval changing command. File addition: 1. connupdateperipheral.ino: - A demo sketch to show how a peripheral can change the Connection Interval. --- .../connupdateperipheral.ino | 138 ++++++++++++++++++ libraries/CurieBLE/src/BLEDevice.cpp | 48 +++++- libraries/CurieBLE/src/BLEDevice.h | 14 +- .../src/internal/BLEDeviceManager.cpp | 28 +++- .../CurieBLE/src/internal/BLEDeviceManager.h | 23 +-- 5 files changed, 218 insertions(+), 33 deletions(-) create mode 100644 libraries/CurieBLE/examples/test/connupdateperipheral/connupdateperipheral.ino diff --git a/libraries/CurieBLE/examples/test/connupdateperipheral/connupdateperipheral.ino b/libraries/CurieBLE/examples/test/connupdateperipheral/connupdateperipheral.ino new file mode 100644 index 00000000..f8605f25 --- /dev/null +++ b/libraries/CurieBLE/examples/test/connupdateperipheral/connupdateperipheral.ino @@ -0,0 +1,138 @@ +/* + * Copyright (c) 2017 Intel Corporation. All rights reserved. + * See the bottom of this file for the license terms. + */ + +/* + * Sketch: connupdateperipheral.ino + * + * Description: + * This is a Peripheral sketch that is based on the Arduino LED + * control sketch. The purpose of this sketch is to exercise + * the changing of Connection Interval as a Peripheral. The Central + * writes to the Characteristic to turn the LED on and off similar + * to the original sketch. However, when the LED is turned off, + * this sketch will change the connection interval to a new + * value and, thus, forcing a re-connection. + * + * Notes: + * + * - This sketch is based on the Arduino BLE Peripheral LED example. + * Please refer to licensing info at the bottom of this file. + */ + +#include + +// LED pin +#define LED_PIN 13 + +// create service +BLEService ledService("19b10000e8f2537e4f6cd104768a1214"); + +// create switch characteristic +BLECharCharacteristic switchCharacteristic("19b10001e8f2537e4f6cd104768a1214", BLERead | BLEWrite); + +BLEDescriptor switchDescriptor("2901", "switch"); + + +void bleCentralConnectionParameterUpdateHandler(BLEDevice central) { + Serial1.println("Updated connection parameter"); + Serial1.println("-----------------------"); + + // print address + Serial1.print("Address: "); + Serial1.println(central.address()); + + Serial1.print("Interval: "); + Serial1.println(central.getConnectionInterval()); + Serial1.print("Timeout: "); + Serial1.println(central.getConnectionTimeout()); + Serial1.print("Latency: "); + Serial1.println(central.getConnectionLatency()); + + //Serial1.println(); +} + +void setup() { + Serial.begin(9600); + Serial1.begin(115200); + + // set LED pin to output mode + pinMode(LED_PIN, OUTPUT); + + // begin initialization + BLE.begin(); + Serial1.println(BLE.address()); + + // set advertised local name and service UUID + BLE.setLocalName("LED"); + BLE.setAdvertisedServiceUuid(ledService.uuid()); + + switchCharacteristic.addDescriptor(switchDescriptor); + ledService.addCharacteristic(switchCharacteristic); + + // add service and characteristic + BLE.addService(ledService); + + //Register callbacks + BLE.setEventHandler(BLEConParamUpdate, bleCentralConnectionParameterUpdateHandler); + + BLE.advertise(); + + Serial1.println(F("BLE LED Peripheral")); +} + +void loop() { + BLEDevice central = BLE.central(); + + if (central) { + // central connected to peripheral + Serial1.print(F("Connected to central: ")); + Serial1.println(central.address()); + static int connection_interval = 15; + + while (central.connected()) { + // central still connected to peripheral + if (switchCharacteristic.written()) { + // central wrote new value to characteristic, update LED + if (switchCharacteristic.value()) { + Serial1.println(F("LED on")); + digitalWrite(LED_PIN, HIGH); + connection_interval++; + } else { + Serial1.println(F("LED off")); + digitalWrite(LED_PIN, LOW); + delay(100); + // The peripheral update the connection interval + // If want central update the connection interval + // comment the below line + central.setConnectionInterval(connection_interval, connection_interval); + } + } + } + + // central disconnected + Serial1.print(F("Disconnected from central: ")); + Serial1.println(central.address()); + } +} + +/* + Arduino BLE Peripheral LED example + Copyright (c) 2016 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + diff --git a/libraries/CurieBLE/src/BLEDevice.cpp b/libraries/CurieBLE/src/BLEDevice.cpp index 5306d871..b894e3c1 100644 --- a/libraries/CurieBLE/src/BLEDevice.cpp +++ b/libraries/CurieBLE/src/BLEDevice.cpp @@ -19,6 +19,8 @@ #include "CurieBLE.h" #include "BLEDevice.h" +#include "./internal/ble_client.h" + #include "./internal/BLEUtils.h" #include "./internal/BLEProfileManager.h" @@ -51,6 +53,7 @@ BLEDevice::BLEDevice(const bt_addr_le_t* bleaddress): BLEDevice() { memcpy(&_bt_addr, bleaddress, sizeof(_bt_addr)); + BLEDeviceManager::instance()->getConnectionInterval(this, &_conn_param); } BLEDevice::BLEDevice(const BLEDevice* bledevice) @@ -154,11 +157,54 @@ void BLEDevice::setAdvertisingInterval(float advertisingInterval) BLEDeviceManager::instance()->setAdvertisingInterval(advertisingInterval); } +void BLEDevice::setConnectionInterval(int minInterval, + int maxInterval, + uint16_t latency, + uint16_t timeout) +{ + uint16_t minVal = (uint16_t)MSEC_TO_UNITS(minInterval, UNIT_1_25_MS); + uint16_t maxVal = (uint16_t)MSEC_TO_UNITS(maxInterval, UNIT_1_25_MS); + uint16_t timeoutVal = MSEC_TO_UNITS(timeout, UNIT_10_MS); + _conn_param.interval_min = minVal; + _conn_param.interval_max = maxVal; + _conn_param.timeout = timeoutVal; + _conn_param.latency = latency; + BLEDeviceManager::instance()->setConnectionInterval(this); +} + void BLEDevice::setConnectionInterval(int minimumConnectionInterval, int maximumConnectionInterval) { - // TODO: Update the connection interval need more discussion + uint16_t minVal = (uint16_t)MSEC_TO_UNITS(minimumConnectionInterval, UNIT_1_25_MS); + uint16_t maxVal = (uint16_t)MSEC_TO_UNITS(maximumConnectionInterval, UNIT_1_25_MS); + _conn_param.interval_min = minVal; + _conn_param.interval_max = maxVal; + + BLEDeviceManager::instance()->setConnectionInterval(this); +} + +int BLEDevice::getConnectionInterval() +{ + bt_le_conn_param_t conn_param; + + BLEDeviceManager::instance()->getConnectionInterval(this, &conn_param); + return UNITS_TO_MSEC((int)conn_param.interval_max, UNIT_1_25_MS); +} + +int BLEDevice::getConnectionTimeout() +{ + bt_le_conn_param_t conn_param; + + BLEDeviceManager::instance()->getConnectionInterval(this, &conn_param); + return UNITS_TO_MSEC(conn_param.timeout, UNIT_10_MS);; +} +int BLEDevice::getConnectionLatency() +{ + bt_le_conn_param_t conn_param; + + BLEDeviceManager::instance()->getConnectionInterval(this, &conn_param); + return conn_param.latency; } bool BLEDevice::setTxPower(int txPower) diff --git a/libraries/CurieBLE/src/BLEDevice.h b/libraries/CurieBLE/src/BLEDevice.h index 6b8ae72d..23279446 100644 --- a/libraries/CurieBLE/src/BLEDevice.h +++ b/libraries/CurieBLE/src/BLEDevice.h @@ -232,10 +232,10 @@ class BLEDevice * * @note none */ - //void setConnectionInterval(int minimumConnectionInterval, - // int maximumConnectionInterval, - // uint16_t latency, - // uint16_t timeout); + void setConnectionInterval(int minimumConnectionInterval, + int maximumConnectionInterval, + uint16_t latency, + uint16_t timeout); /** * @brief Set the min and max connection interval and send connection @@ -252,6 +252,10 @@ class BLEDevice void setConnectionInterval(int minimumConnectionInterval, int maximumConnectionInterval); + int getConnectionInterval(); + int getConnectionTimeout(); + int getConnectionLatency(); + /** * @brief Set TX power of the radio in dBM * @@ -689,7 +693,7 @@ class BLEDevice private: bt_addr_le_t _bt_addr; - bt_le_conn_param _conn_param; + bt_le_conn_param_t _conn_param; }; #endif diff --git a/libraries/CurieBLE/src/internal/BLEDeviceManager.cpp b/libraries/CurieBLE/src/internal/BLEDeviceManager.cpp index 2b7f929d..7b3276ce 100644 --- a/libraries/CurieBLE/src/internal/BLEDeviceManager.cpp +++ b/libraries/CurieBLE/src/internal/BLEDeviceManager.cpp @@ -283,17 +283,31 @@ void BLEDeviceManager::setAdvertisingInterval(float advertisingInterval) _adv_param.interval_max = interval; } -void BLEDeviceManager::setConnectionInterval(float minimumConnectionInterval, - float maximumConnectionInterval, - uint16_t latency, - uint16_t timeout) +void BLEDeviceManager::getConnectionInterval(BLEDevice *device, + bt_le_conn_param* conn_param) { + bt_conn_t* conn = bt_conn_lookup_addr_le(device->bt_le_address()); + if (NULL != conn) + { + conn_param->interval_max = conn->le.interval; + conn_param->interval_min = conn->le.interval; + conn_param->latency = conn->le.latency; + conn_param->timeout = conn->le.timeout; + bt_conn_unref(conn); + } } -void BLEDeviceManager::setConnectionInterval(float minimumConnectionInterval, - float maximumConnectionInterval) +int BLEDeviceManager::setConnectionInterval(BLEDevice *device) { - + bt_conn_t* conn = bt_conn_lookup_addr_le(device->bt_le_address()); + int ret = 0; + if (NULL != conn) + { + ret = bt_conn_le_param_update(conn, device->bt_conn_param()); + pr_debug(LOG_MODULE_BLE, "%s-ret:%d",__FUNCTION__, ret); + bt_conn_unref(conn); + } + return ret; } bool BLEDeviceManager::setTxPower(int txPower) diff --git a/libraries/CurieBLE/src/internal/BLEDeviceManager.h b/libraries/CurieBLE/src/internal/BLEDeviceManager.h index 3a7aede2..38930eb4 100644 --- a/libraries/CurieBLE/src/internal/BLEDeviceManager.h +++ b/libraries/CurieBLE/src/internal/BLEDeviceManager.h @@ -181,26 +181,9 @@ class BLEDeviceManager * * @note none */ - void setConnectionInterval(float minimumConnectionInterval, - float maximumConnectionInterval, - uint16_t latency, - uint16_t timeout); - - /** - * @brief Set the min and max connection interval and send connection - * update request in both BLE peripheral and central - * - * @param[in] intervalmin Minimum Connection Interval (ms) - * - * @param[in] intervalmax Maximum Connection Interval (ms) - * - * @return none - * - * @note none - */ - void setConnectionInterval(float minimumConnectionInterval, - float maximumConnectionInterval); - + int setConnectionInterval (BLEDevice *device); + void getConnectionInterval(BLEDevice *device, + bt_le_conn_param* conn_param); /** * @brief Set TX power of the radio in dBM * From d2cc6721b63280d212033fa87f52a1cdd9d0a65f Mon Sep 17 00:00:00 2001 From: Sandeep Mistry Date: Fri, 24 Mar 2017 15:28:04 -0400 Subject: [PATCH 53/91] Remove comment about BatteryMonitor_Central sketch As it has been moved to the test folder for now. --- .../examples/peripheral/BatteryMonitor/BatteryMonitor.ino | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/CurieBLE/examples/peripheral/BatteryMonitor/BatteryMonitor.ino b/libraries/CurieBLE/examples/peripheral/BatteryMonitor/BatteryMonitor.ino index e898e2aa..8535a697 100644 --- a/libraries/CurieBLE/examples/peripheral/BatteryMonitor/BatteryMonitor.ino +++ b/libraries/CurieBLE/examples/peripheral/BatteryMonitor/BatteryMonitor.ino @@ -38,7 +38,6 @@ void setup() { This name will appear in advertising packets and can be used by remote devices to identify this BLE device The name can be changed but maybe be truncated based on space left in advertisement packet - If you want to make this work with the BatteryMonitor_Central sketch, do not modufy the name. */ BLE.setLocalName("BatteryMonitor"); BLE.setAdvertisedService(batteryService); // add the service UUID From d6afd8bb3a8701feafbc1dcb39d5c59645126e54 Mon Sep 17 00:00:00 2001 From: Sandeep Mistry Date: Fri, 24 Mar 2017 15:23:26 -0400 Subject: [PATCH 54/91] Remove unnecessary delays from peripheral explorer example --- .../central/peripheral_explorer/peripheral_explorer.ino | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/libraries/CurieBLE/examples/central/peripheral_explorer/peripheral_explorer.ino b/libraries/CurieBLE/examples/central/peripheral_explorer/peripheral_explorer.ino index 4c558922..e9511f48 100644 --- a/libraries/CurieBLE/examples/central/peripheral_explorer/peripheral_explorer.ino +++ b/libraries/CurieBLE/examples/central/peripheral_explorer/peripheral_explorer.ino @@ -125,7 +125,7 @@ void exploreCharacteristic(BLECharacteristic characteristic) { if (characteristic.canRead()) { // read the characteristic value characteristic.read(); - delay(1000); + if (characteristic.valueLength() > 0) { // print out the value of the characteristic @@ -150,7 +150,6 @@ void exploreDescriptor(BLEDescriptor descriptor) { // read the descriptor value descriptor.read(); - delay(1000); // print out the value of the descriptor Serial.print(", value 0x"); From b28d4c8c37fa0c1c20d9915ce384269ee21426f4 Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Wed, 1 Feb 2017 12:36:46 +0100 Subject: [PATCH 55/91] Move drivers in core --- drivers/amd64/WdfCoInstaller01009.dll | Bin 0 -> 1721576 bytes drivers/amd64/winusbcoinstaller2.dll | Bin 0 -> 1002728 bytes drivers/dpinst-amd64.exe | Bin 0 -> 1047632 bytes drivers/dpinst-x86.exe | Bin 0 -> 922176 bytes drivers/intc_composite.cat | Bin 0 -> 10637 bytes drivers/intc_composite.inf | 46 +++++++ drivers/intc_libusb.cat | Bin 0 -> 12495 bytes drivers/intc_libusb.inf | 174 ++++++++++++++++++++++++++ drivers/intc_serial.cat | Bin 0 -> 10631 bytes drivers/intc_serial.inf | 73 +++++++++++ drivers/x86/WdfCoInstaller01009.dll | Bin 0 -> 1461992 bytes drivers/x86/winusbcoinstaller2.dll | Bin 0 -> 851176 bytes post_install.bat | 10 ++ 13 files changed, 303 insertions(+) create mode 100644 drivers/amd64/WdfCoInstaller01009.dll create mode 100644 drivers/amd64/winusbcoinstaller2.dll create mode 100644 drivers/dpinst-amd64.exe create mode 100644 drivers/dpinst-x86.exe create mode 100644 drivers/intc_composite.cat create mode 100644 drivers/intc_composite.inf create mode 100644 drivers/intc_libusb.cat create mode 100644 drivers/intc_libusb.inf create mode 100644 drivers/intc_serial.cat create mode 100644 drivers/intc_serial.inf create mode 100644 drivers/x86/WdfCoInstaller01009.dll create mode 100644 drivers/x86/winusbcoinstaller2.dll create mode 100644 post_install.bat diff --git a/drivers/amd64/WdfCoInstaller01009.dll b/drivers/amd64/WdfCoInstaller01009.dll new file mode 100644 index 0000000000000000000000000000000000000000..1731b962d68d52030b32b19d6f0f913cbc47729e GIT binary patch literal 1721576 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 Klzz?tk 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

    0v`NG^!@ZSy$l}m$ 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%0D9%%AEONBG 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 vAme>BDLi_|HxqhV{QD}8*`&NUP!T_QgcBq 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
    5O)#^$Xh8V-wcRmEQRs!Tp12@C^ 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 z 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
    +-RabWQwMR z!r!o!peU-u%g(aj`s%?lcpVC6Qsh|u1#*({Fn8BjY1cwqk8p5=0=aaTC88|^Y4IMW zS2dJbGzB=nWgq{5Mvb8QKv_kViIWUXjoiCmKCQB3wQy1P5XgAH9=3;pqC^WNukH~c z6g^7t?ZWik8x!;m3(ZwuLml8w3%I-TWf??MEWlap7t$2AFyWet^d+V>mI_cR=%{OA z?fs|koI>x82i-mVkVNBN5J#c1ufMC4sWOSDnZ<00iCJ-9@OHYutP=&Vkwi65K{Sta z0(sCkW|pxfC1y&`q@I>^gH9#Ly3d|r=`~Y896`vyyU%7hTH=dCK!UfipODfnMa~sR zSr{0y1IJ<1i!LrW*>fSr&{Ev5de#?*OM#=JG@~WXc8hMbYms5 zG=vAl1#A$1OgoYm-BtJ;Yn5py!+)Ymkd$e-z%v4I?ngO$92Kxj8Q$<_b?Ev%+0hxw zo7|tqYGRTxPIj0qp;HPf4RLaVkkAs-Hf_+x!%k0_&kcOC#a$FQO5BlRDVEBqTPW-$ zVJyiBuT>{Q`~|n6Rz+BFu>O+evG;}iQ}-?;{K>EU`>Ro<;79eqB7;XleNs>9>rhFF z&MprB1__ zjXrIh9K#*(!3S|Rn~p`4rwt^79SAPxUZZA3SW=5vIW z+@4V8J;}WgIMb!sF2re^32nCd*erL?SbW2=vSM5qLR2aDZo`p3v)GlX-EOPI`PL#K zE*aTtk=yT*$BOJ!O2ZRWR;xCQr+1^oC##NA9j=|3`p!~KR*X<$i;cgpDQI-0GVA$L zM9`W_boA@o*&$8v^N#Mk8CI5H=MGh;mIbJtpdCrtU20H%d^!m3Y%G#FmNh_j35`}4 z_jX^MEO5_}+x#Ngbxr@%p2Jdf*Vx2{VKxo5Zn%2G=o?4i@?Snvy%0MoMqf3kt$}!r zLu?yn>rjBB7#t()us5a_aWxICY;ZC(8*$#KT}J>M z$KV-Zl)W*vjjN<+>~L%&fExzgH~7Kv01a%-oy80t!)zOI-l$zih#fX()p9^b3?1WZ z8)Moy-o|k^jlFgF!r_k;8)x0P4#zgensE!-H9D+eaE*p%Gstt}xEsdaI{e}Aa|Z5d z5?OjU*BHjeaW;*$Z@hy;rtCD-(MUui9gc6rg@d~qY{7TK0UB+sw`IQ$X}v!RS^o1YmX5(Bkr!U@C*joZG3Qppc@9>H~7Kv01cy& zH9D+eaE*p%GstY?fExzgH}Jo~2#)(|Y>{t6m>b63H};$1%iJ1S&)|>^#%DL+zJdG= zLvRd1ryF&Fe3e6O8*<*T`i2oW{nxbb_)*UZ3z1b8ud$d7Lv0&!-mvPC_`H=^!Q-J`lkc8`@EU(3BN7qT`8&L?ctwFO1>a`#*8bU~6g z?At%6MtwNo{&zbG;}qJTf^_5oz*slpu&v#;wYa=Z9klZlm$tXYS9w4s@=0?I@PMfA1?ka$;x)49V)T7Rv9rX$#UC>;kDg{cp`|TLwJj)garS5sTYN0{4O+e{Q4^UhGR55)q01bWR{Hdpw4uGX895H;tEr0jOV!*! zo?2U^dDD7rZlPb!2i>7<(slLS*|Jab$LP0NV)TlR&0{;umX_=DRQk9435wZiZh7ob zMN8(Zpao_d)ng(vA>dZoJIn80;)a@gt+E%v!~^pdmc8!hUdt_ie_sPGE~SO=K)Jt` z7Q>f!XNXsaErpqX*DWoYn2W_Omd&*LC3h9IW{K-Ym9ipPC1*puQoJ||Og8z~BK~#ZZvB#9;|x#sR5Wz7a73jm z(Y%o@ELhWq{n!7Rfc@Srz zW$0$QWxbc1L~Tek~QRay%!Ehu)z=3CZl*}*a0`~6oW)2(qfVo02$x&DB(;3Cx9DLi^Jd+`3)f~}J?~1< zLX{29bYOA@>e#lWi`6~=SU{)0eoI?yNo~V68(WTOJ(joOqJlJZ+On=~hj$w-v`hB` zEpTBW8(VN^F~T?Z*VocY9lV!gjUlbVbm`5ky}Z-72CwwC{o@A5r-}om9F|8Tw7LJPAyxk3k4{8*ltr=USbcnS`2RhXyh^hQXV=0fTD%57A-|| zaVoZKF-0qL*NQG%Ja%5zS=|D9hS-}D#v$Kn*vQ?tL!D87ljL5#awQzwE8ntWI zBCfNn6*3aU+(WPVT!a_8w>+t>F3|<7a;7YnOY%%?`EbH<` zs<5f&78Oq&)%R^l!0@-5K5>r8+CR#7@p#fc%G2rp&G*G^>gZVis@^8>qX`^9iMCG- z*6yFI@sqFrU!HxaL-}_cL|LmIi#Y8`(~^>+mFRv#<&rW2y*N`@wV$-=+ao7bE`&N% zDCH(bJ;n^_RQt!#wo^Kv*S5LdAUgVGx~j8vO4-0e9-UTHc<5D5QX(j?HzYwB;N zqE^y=XS5(Sdt8&hR*J?IoiwAU^OpfVGne!y8S+HAuPe2;lr3pdnaJl~nqSKI4>#I4 zU?b~mfM%JR3v@7UA|zYD=o9Jkr?`cvct@MRuOQu$=ag*z8!2fJJYUv09+Q$*gYL_6 zas>tvtP)Pd$VM57U@HD6S7jqDKrtg5jg<^9bH@p51>Z#UEVKZ-1!ZDhA`oYkaAQve zbE)8$W;0=~hmp<5E74N9D`>P7{NL;V>V-C1%M*|}$tOCn#Mn;=f}@2NEpCm$M|x52 zPNgi^V4~O89g%|Y`feFlwoK6_so)e16T#MO!8-1#Jan2L^Ur zYUiN*_##e;n0%)UDj6s0-JwdeT{s;kc_b&{!QyD>WEM#O8~bgbqp^s=Pmo~A61Flm zDXODRfISlgM|>4k`k=;RS89~j2HA-15|IN9Ha`X@M{HsuxUD)o6*3WQp#ewC^6o*r z7@{*9KXaI2mZgNJ^u>b;y)e8s=i4&C{A48p;QQ%xSHS z^r&^TxvePuQD4Lp&(bRzE*pSLB*(gYg1*p&0_G-j*L0PhCREZeMd_eUa^&ykBO;g3 z=Ns0^EfdVGJ#eT!7d5Ke;JriGW1VrYVlRnX+u^7wmEg7^%;}jlvKqLZo|1nvQ8kG_ zo#O#=n8XbP-wRE_QHm^ynQG3LNPwhy+wDyz_r{D3R>)66h-QOosRcJxd(M(lJ}a@b zdR(DSX}dtjtA(_ZFXOhH8<2w{)&S&Mb0xNRFu-znLd^%%ZU}vH9fB?z1UTwWQ0VrC z&aa_~`1KfMO#x!BR*waWOk8juu?il|>s3wp#4W_HR=mf3cR|wC~bR zOeIE1-7^8IU0p6(4agmETm|90v53d+*Q!6n?7=8?fq?hvk&L09gTs*S@K zvm9mIRHe#-hr%qyW%H6JiKiNG+$D1)4XrKqyUJpe|kxv z)~QLyLWNY4IL(`6$(Ww!$irfFNEis#l|+z!_x}DAG$(lHwC^QDn~7zDc1*s~^s_`j zW(nCMgRL@IB|I!9VmrbE&61BA@yI5KoEp@cO65fXj`*zRnLGE4?_%c}z zMrb2haYs5RZ@$7CO|mFNS54F@e@SBv203L``yFbmq!dJnM4@e4K>_Y$7_f|DPb0g)rK4cXMY2J`|Hw)3W;8MH ze4w#lP9wIjq379WVboM^iHS#HJQj`U0nL{JA5NEqEs)DVhs-9n@TB0V=iIBUg{%@F z$220#gj(5(*Cpnm1}$p&h9jX2fThv`dVA=dN><`&lbR-tEQTp&o$)~ZSL%q*7vxTA ziRxXlQ^awlNY5)-q+o(hajx!IZ2et8*sJD$;5S;|^=J7C{>C1iwkNh6$GTJ&LmN zaXC@hmX9o2V^nE4O_rngl6XNcQ;rZ*r&cJq=%LoN9w{k#Ny}Wf--O*$Z;L7vs}=E+ zFRhQs-%v%>gv+(j_>og}8cft{#H$U++fzExbNVYr@~IbU0Q@?TassDzP)!L5++a&# zcOkndP_}NywYros4$CXZ9I>&f+b3iqTMZ|r@JL{bc7v1IJI7@PF|*}NB&$xmq02j1 ziz7j}Y2XCBtCvSaf{smsxr$QAowofnNdQ$FO|@%L6k@ ze6$Kj;ykM;_`)&o2wEI2psz!h3(DiaH|R;rp74+XKSr*T;cSC%2rW-S8L@H_7Cvnu`kUk|$McCj#Xk{^mqEvu zmok=0Br#_(8dC;v3vgxgqjE8O_-c;SA-9}rH-lLBJrw>!$%IV#$}-#l6*Dt3Ne4QV z1nQnaPB&j57s3inYC-DE%sZm=d5%XDTbB`{BrcO16x(S%b>xN@r9)SmRdS=H22V5* z9Dq$X!MsVt)chI9;wYz-nKH|yoLt`uT%uYqPQnnJ86@h9e~Gk$?q}pC^6})*aVnre zqRSrPL?XS?;(}iJ22j}?9HXIZDlYO3V|qd`li-Z58xU1U`n6wnl%tN~Q`xCpTxG^A zlW`)j5>F1-naqJ5l?h>V9I7AC)rs@_BVvAyT z6}lAqQB653p30bd4TLVE47)n66a^b5C1hX=?5p(5(BUAHOjOiON@3P=HYq0TBbY%IU;iuyHJf%15(d`aS-Qo*qh{z?#$ti*-;Vv ztX!^w94*9-C2Z8qG6eLZO$=Vy<7-Ib^_pfv3^nO~;&$G%32GshtRRzb!(ga<0Gl#W z)Hh~B6{v6G$_9K`X85@1Y_p|?JfUk${cjmqmS_PY6-e35qFHt~P;2&3)vqDq)L`e; zs8TNnXRZ1X;|WyNDu!zVX?RuQgjQ?Nd1p(B?T>Kcr@sViSELt=pQ^M& z%r|M$THPZe`DrDp7XgmA))-(# z*v-4H19-PR8p)mO%5}0mVgQM3=ipU)r%QyM(#e<-35mp)5ky~Uvy(H}CPgD{U~kxO zOyLb)*7ynCI46m05_THi$7`j_L`ZgIxzIMA=Uu~P*`3$JLSVC_h{W1wM#6ZHJ@b*Z zXhR>`e!Zl$CNc@G{e~j0Op~}Hd>J-_k1~P;R3*i3!3FsJ3pz7l3NW@phoq%4+bQ=dy zZl$54!4Gc7U5iFULGI&TaySOmm847$ah#CJ$?ey|%6}SaBL_I-xpSjv*qnShLpd5k zNxnN&iIVryC}$c;zR8di0kBOH-bt^Vpe>K-CMyT>a&wwG1>$hgGOW3C6ms-+B2$X; z?TJbEQ;p~c#x%(i=M-kcl!;~mc{)N$noIe=j!v-58s2~{{CO@DB~{EOUY5M{h&y#r z6G}|M@dKPD+)Sl90y>A4oCu7jlcq@a>8PS6PjYcmz#`7IaT2B`QDxs_@6&H7gFc;W8DO-js zJq+tIS-IZi=p6o3ZY@@X68th+r~I0t9MCf6BKB|;)b6X{jpnlt5qu<4%!;w-(^gNW z(iSU81LDlU=KavIjfOKy*zol(5RztIE~7HiP&cN*7dEd1j|y#X-ezRb#aYJWil~kO zVV4p~eCm?1R6~c(F6Cm@p!)(RDAxeEt$NgI4vCsVR(`t8 zqGDJ~7pk?Hbn#n(PN!l@U&it}$iaOKq1Lj|C_Q9|BhqJuGC)(%j5KARhNYl<6*IVs zO2<^_Lb_{L8qAIk>XCj(qNq5vj=)RSBqn!N!NE#)+?5I|U6S~&V7VXY`E(qwWQ-jd z=0wvzbsLZu>#>G$d0;6@0mZ%aLk$b@UovnV?PA+Dm_7z4RLqsfIWb|LVl`h$8L4=WKVxl^pV!9#x;SyCM0a8zrwMo~V;ETx?**WP>5pobpPe zQIdLVCuT8A0!qY)Z!%Zx(OC1{w=_;6fKvTU-M>M)lTR>G^=9aUTC0QsjyS%6Ba01> zR@|EeqU+dLX=+o!|Ce#FIwpgaum*(>W)gkkyiLSfPeGLu^sZb^e*FwZ$^ss(pQ7Cg zWSQlbc`3PFyEwjH23^-1wS|E<&V(`C=WZgfB06iN^l?&>Iq9BeaMnQcY^<1eCBzD? z6t;Xm5?@)dL`tx-l&fVa?7&!@sC7>cSgD~LB$+Mv`aPU=fLK3`>SB1`d z4N8L~$HC6KcrLsO3ZnqO;nHwGx3h-a!{+?W9P4`A7yQ3yqP&zXqn%i%`Y0nR zPIOaPg1$*;Fd6`#IzgmCvr1>g$7W2JdA&-3=!zXErd+itUnP2 z;@d=0;)v;C&-u9=q}&OSBleceP8mSFYJ9geQ1bGctVP38<}IefN9IDu<5M1NFxp&j zH!RXsUm8gLeNE1TV8fh+W;YE*o!>)m3V9Fx&IK>g1i`+BEs%5vZ+OH>D#<3JCx#=C z%`&AWL6X^D3DzcVnv+{;(8g(v{3l2w^9y*)L62Dpo_P|2vg7k9CBK=apUpsAPIMX6 z7|aba0gQ+8gg@*#G}F+l$5~^XC+Dr=B6yX$#93nkL=?h^yinwc1{F2 zXx#1=eXL9XT`ZjQN)fat9m<{d29QsTpvkhR?HRIFK8bcGT=FVbE(s3iUf|WAVW?dj z%=*0eAt#8V*UB5B%9B|J4x~*D>f_?Va`BtS29;l&VA%Q-4zr1T8;DMOGW;1_Zletw z*Cm*RJb`94YR`hauYUtV$jPf(=cO*TU}2e?9c16+Azu9s6E8Jvm8t>B^T z)QIz(x2DWm%O-xBb+96&@ZJn>hPekbc-HJ)Od|X)F2@^7JDb4`Q4r&y%f!XNu*eA( zX8@w2cYmT!#O1kF*+ZbCZM{j6i-8iNoR38S<4r03sbuvBCNcmD3E2Z7$AW^an7}4N^pQdZ`n;-}n*Wpc_S-%3cPV%P$kn{`> z-W0kFGrjwP7|%0w?aG?UWbjxk4E};pIs-CGTfgq_Y zDNi_6Z{s&QiRy;Pe#G@RfyS!S0#*1nt0I=05LH{x>%l?9HHlYgw4G>Hyl$e_-iSIH z`nE?kl=$NGh%VdsMD`mcqpk0n;EdCqh>HSCtzV|m4KB(JeOr&^H)op8aKwF&i|zty zy@oI8ZZ8)G1Qo&u>H83PsN$^lPk1xZz;ei##0pZeJ3LEr6xK3Wb~1-{PK9`AVnmzp zei3(S$9Is1in}Kz+(;k!Q;j$i%~UM9xlk1=d?y?>8L@7J4iT|@Tiz&F>|HrHjNZW6 z3U1%8Y!$u4s>Hm?*uG`WO9&k?3;L;vN#9P1Z552^cRwRy#*b(0@oE1j6Y$>^zyiX3 zC0+%aCL6)Y#4>~L;9N$33Udu0la+4P>p>rh$Kk)V;#Ct7zoWF+sVa^X6msFeggqY_1nqoVE)10lDSgS0*MtHt@gn+fn9DQxQFAD})ECPu zLz2pL@Bt{RnVQ77NNE&Y^c%ib&gGZqm8Rf{Wx#RKA zE*Uq3AX#Z_L;;RjyaAI)M8%-N$%dVxIA9GHQw2d4)kWygFrSgh6JlN!)PExIv(j&VGqbPtc^7 zY0LnW5LDSAEN7XyksENL*bwJqQVT_t!4#I4TK}%(5#)BGd&L2Ca zB75>d!Y*HC4O^y?nNeK}FJQ6R74Xuixt;-HRWRnOYnUPve?E7Gm;7uq8eT#P6*Q=s zCL2_tLdK(;5{Q{v%OZS+Q&(&98%ykcgwRloG4BK{c}p~IsYDHt_khPrcJlBzOqPC-Qy)zI;< zh1}jwB60E)K-HW>qq22&y%(<%E#sh|*xcA?r3H65XJEOFI4*fTVHpOjn=XwW1c=0f z>=HtSU^ZiF_I4VQL!vV{sycKmB%Cbv$!l!;^;SknE)T*TRZI6LZbZ%yobCnA(= zDp)3V{m63JJhA6*CV7PeGF^ml-!B7RgDU-K;}2`5_k=lr=Ny+5tO1V8FOPIP1($)w zl#maq7eSwb_wh@g(}%*u!ILhtW&+Rn(7Zw>TTgOXIN>H(N)!$Yo`_XWGo>8(hh@xH zz?!3=N$p9P_!Z5PItP7fa47<=N^{h;C*7~ykpCKbBiI?-DO{8f#-3cX2|j`{5$qCy zgXKFnZ2^9N8c_o9h`T1b64Z&IkYW3LugX+c!i<%fj&m=53F2H8JXGj2zXP>3&rc%* zVWQ2CZA8$l-*ZVQ2Fno7Id%#pBlt)4l?jwyH)h_xFeZJF!X}vs7B`WYMAE7!g_H&v zizZBM`u7uJl<5%`EigMtP24g;oH->KGfs$^1d)~akz%D&P(0I7yEkl?XiASJeKXC% zOgzij1~YLz;gW`#pc&mBu&HKSo_jL61!uBh@h^jmQ(>r^Rk5PQZ-q2)F6D|6=4Vya zF`67wNw`!vGszr5kqX97WE09bF9|wLS&q820~77>6*OWl&(?U}9v6ECJeBvaB4zh3 z5s7?SG|8kUgL{`) zX4{v;lqY$9P{}eR^MP!v?)dYqj*OKPRSrhfpcov&>*k-VW!{nU%Fii~vHvbA!%KwT z%fw8x)Wb^}(jsvVl`l@=2JAF5)eFnQo10~eNj$%lO2|tSb6k9{wcr+7m1H7KvPvN& z&gIeK711juQ&cd653Fa@LdEFfKcf7zPjr;70L=$LPe_?pDZsyF%kU+@a|(M@Ni{jl zmMM~`NLU2A44IZ`Ejeg+k{W9jrbNwZu#ZM&N=#t#@hL}^sLZSgabL^5VeC{i9L!6^ zc~h|kr1`;ACzyjUlR#X-WXhgtWf3tx_r#SN{(mm9Dpv3$(DM4kTZv$dc1XnT5D4kt zOhnm}F${s|VfK~GMDi%(01~R9yOIO0(0~l}D$y7+s8p67&s@0+HR>_A`EHqThcFbh z$`nZjpqd3G?9uRdYCHE5jiQ@irkMCm!$zvW7u7`NnK{IL0z6tVc+SM=Dx;k7GLtlO z@jzh2=pqPcB$(-BR-@qZXuc?B6}78F8qzudFa;j8R%Ogw+3hm~FBjt@=wv%-Zs!e0 z+mu&{;pwEA$UM6jO_fjdDb_Z?>keLjf|1HB4*lY+#CYoHD6GLIn<}TkQ}%ESdYx0X zP^Mt9!&Hli8@xQ&0h~q0;J3{FA_@s{~_V3f41OWrQhO)22oZ9Q~Ny#Y{ZS z>HiV91nrbAdJS$b=s$?Bhb?rPkd;kau-|Z+1?B5#d6bbn0cunx_{HpbKA2UP$-rl4 za&8ZX?{zj;4V7ugDYHFX#2(&j&)k(0+H(J7jY%DZhz56?CuCybG6zY;;#q?V+kkGC zA-4b2NO}mi?Gjfz(34pr2@QKkx?xLMx54KRYHn8voHp;z^tZx8SlmI}Ix`!D-@Ut( zsLIV4;KPATb0qx8nVT!3to|J@V%=`w^WINF5eEKE{M}cT2Z<5l?x0sC5h3=KVEiDF zGH*6*`>p7DTgWYtTcYdtX)9&_;%1`S``|SXWlWn0;cq4Z6%_e>*90j`8BnI+fv}Fx zgpGd86m`95m9bQcur{o4kz&OGcKnHRtjnn2L;WO=UTDONfPI0=RM#OiDD%AhS2Z%PNIY>Kmv7Mf4D7FP6e(+HjrE z$V3IMF7OR0R|Y^{TVTU7StVbf)Ej80P(_?9xo;U*_InY0(F%oE8F~|ddQWAtvQ7(l z8{xGVe9mC2_+oPQGWcYnEsd^Q)ZcKz1qcqnTs``v5^51!!r&Ugvx%{7pxr|JN*GT# z6V9?{8Rt;Ugv(ck4_4*{4JdSBys}vTvfvrR-gE{_GVFt9P{z}w6A zas7r-Cb<;@3^3GD_AxIdBqeAOzrQXZ-^2^_`MhNq6EXVb1Ku7rCX%yh|!|q{k~6L zQOYvxJ>{!xaJKi{#Pk~yOGN+@gcj?XLuKWS?+RFA+h15_51&=`eN6ywV3U^8szW%s z+%RUuDDD$pVu1R`8ZR--DR3&Gw$<>QIY~$<c{qMMNc7iJm3gae(fu<%&33cE6uySU6i zQe^$9AQUJiy>li|E)SlE)g$&wwvg;H9wyDW$;(gyq4E-9G|o716P%&>!O2qP1tSa@ zC5Y4mm9s8F%d*e0V$2(-g!W|A{Cy@T z7heWL59bt-E3tAwGl0Cx8Cv{p5PZXj6;`ZJAoQqr(Vhr=L`*chyMb7T zxhrNzq2={iOlTSXq~a|?^ie>FRh5)ls|w-`VI^9An< zGMmNNzZKAy$b=-hWZaqX0?;}H!d7Jkg4?A~gQ&t9yM{DIbr$bJ4s4AANJpQ@MwS_kay@YLf_ZazNEC_znOk`? zA(q(CCh(Qn@->n9^>!4J4QiDGJTj$QP6OdQYWSPyP}HEgb9pdmLrjkfH~^nH^$;7g zQ`yuLgK!x7`NM1&gxFHT_S~w0vS)3N|XM5bF|?(Vm4Ca#CFwD-s=|!G$A62(oJs z)~RsG_q~F|5)zoAe~a4KAmUDpo6@xrOmP`{Rzkl~e}DRE)XT)DY+8k28_~BgV_-qK zXB3)v%gd@iksk*~RSODkmEiiba6--(cu&Y+L4}8F7A;qrbX^!4T-$KX#qkShOaH(F zP~j?v_#C0W(NUO>wouW*1!>va~2-*k}_Wh6*7M^G(or z^izc^CSo#1yt?3|8D>MN9~Mc0#7*`0-mji_3M+=|8!>l#$au*S?TT#Jwl z9CIZ^NfqxBJ?w>v?J8_(EyTDu13gfmq~o8C*ko3t1VShJZf;s!G8_D2gF0?}Ui%E- z+A;&H27B#6=Js6Suvx$n=m%IS3Ye~-TA@(I){LUG_-vnwS8SdTC*T+|0LwOJl$-zASG{@=1rY@J}+snC%%)zLUM#815_yc#Nwtb>_wRbaprbRrXLVD$|-4bi^UeSQxmU;Q}8sPPEVqK2l^L5VO)N;cEkGnQd-YYfYJaH$Byc~YL z2<-5jLYBE6tRD0ee9oY`{ohI~f!#8WiGs>D!f`K%CIFE_H_E&fY)j!8JiJD^T7QN zHydouzWkd2TlU?sj{@Pg2N|Cmw4PNKdbQbp6c6NL5@U(u4qbcE{`Vd-@CoO8_~)u< zLHq=*hdMA|qP8 zT85Jj3wR?Oh&oYd#$-~;+CnU`5@0p7bBLU+!?Z`nR6tIGjV?f3TfHm9s>Wr>xzZX) zS*CUgFh`c)~JF`Q<7+G|`_!0G$?PwJ*pKTd<_RQ{I zRu{7tLpFkHVXi~MikVloiS~HQ**l;{m56s2XH_x>^7dh;!k9&#HrqLU<=!Ei4&c#)#r)>&2ZKUr+(EHiOm=Oq?Vf-0NUe;#{t= z0%n$iPa4SEK&=JPjqh7QT2G1n+%h2htcI9tvUwIL1-7zHluAI4q|ZIO=OGGGT$MJ-d^NDirVUWaH_>^%S z@>;0ju#-il?uM%lYc0~_PiQyZ_H7D8;qzpI?t3atCFb_R2fdH5Ov`<;;k)}S!Qg4u znlkrG$AQkjr_M!M0TJH@w!Vozqy8B#{mQ(T6jA#Yg!DJbSPjt;@W62c z*Fdg1L`M^%;K&-m!7;>v5?jL1lHg7ZZV9j~JaIy+IA1;g6KoA6P`KKMcsio3S71lt za2z74i8FCQEF}6zO^b>HoPtEmjS8qD(^FWf--qlZ&zr7hHa5G?v8MB%s3re->(5$1 zo#SCZG%pLb4P@KEND=@c4P*@a04eY@X9Y!*6=?zCrq5uW$ijJWC!FvHgQ`UNfLOrW zDoks^9G4Jg9*@U&pMSRVb>v?b_apx8J~O@lzf8e3d_B+@(w!f$d}59`OY?b+BLrc1 zE*XvCm03{`RRGqbe)gDUw<&G0-uTIE>5b_{^xe--3a4%;!M$5g!q`+Sl5j%B>N^dF zVD?+05G$Bl3xr7lob?q0DnOduGO7T8%|41OLLp=7l6S|jV~o`v5Br)3L2<3InKl(GtA^e=A08i<{$xSJcs}QLVrl?|A+(t0IG-#0E&d-%8SUu zh{Oj6a>#^?ADY9WeW$)Sp`$e@)DpeP_AlG_-$MMjfJ~^mr?1lSUa8sCh)4fp!E~{# zZ9_(Uw$%bu&Frwx!G;ewqR7%vZSFW8Q-AhNjBN8SOVnMlio`vAtd>T@WhvR0!i{{OEp0bn@2lbpefs58dV!_Al zlV@OlC3juWDY6GTBE=r!cTZC_)vihwZ*OsSUS8xVHRD>R6N9IESH9K=n;$Sn#~xaI z44I(F=XMvrO*5a*5*YJFcotX?3vZTB9xsnT-^qfmLTNrniRX07}HN!rwzj;9{nGJ*n zc9hmMT4^2J#GZONzP-B$9(6j&=hTNdKBwU2-cK@sB=B^@LRn!Fs30}}4x|aOh6}AmMoBhH%>M_mjebZ$8^gdYY zBz2w1U0Tb>Na1fh`QsknAx$LTZWgIR>R~bM+XVlJ736Ry^(2p?u)jGX*T)KvuOEbX zlEm7PI%Hc>Hl;@2QSHRC70+5XO)!pR~a+)}Y-^!tzz1V6rB!#wuB&;?5 z;A!l_0uSm~F7(w(o-?7O4wfsx7vyKvoYAxu+F>!e#wTx3a>}}+YhtH^%eEJn{Aj*Ij}T4*$aH8mULM}{4vjmrgTfNEmc?JRg9lqL@})lSs2K{HhvkSc^fc!q zy*LL*cyr{Lv{8K+tb7fgldSq0K<(oH!A<}Zsn3-7FZ6SLX2M|?5oXdfSxuMv@OmXG z*E40)Xfd9~_+I|<>K^OADe{{Rh7r@OC!e->UqaP|R*|sj31lY;%nzhwane&dRAk$J zeX*q$sX@ggHeA#v8Z3DFY9&vZP)CM03~C+y$lZ_`+O3Xm!;v^Aod?9h8C={*I7@~h z+@|WE7fuC$Hl@Zs9Pjx+2XFeG`2@6J3?YhaY`frOgR ztXVpsDoq*s@CbUK(kzSp5Uly&2dyDwVV4p&NH7nr`Co%xSSPa!6d`|N9f9jr!Pr}* zW%1>FB;E*|%m=vN=0%B%M)_OJ))l##O?^H0a6?*o@D!s^RGqYx;P3AnI&~9t{q61xuom_=R0n(p749vNDa?b-^6V%ayBL~9$1S4ALh8!c1@t#X zuYvzlP}tg5j7a-;Az=V>*E=TK%$nWlC^V-jd*Cl7G5T@rScZP>BaS?ZiM!D~;9LL1 zNBQ=0Cz)Eh28ms%A=Pa)!lfdn(Jc&q^1t|VXgTxOz@ERYV_0v;#%i@5bjjT0%x#04 zd7SwHA8dNwk1Bd^C2?wkECyeHRs=TUH4O`5cp|3j6Ize4K^wJ}hINRpXs^)zVqKr!owlrwK43%6}uKlrSZi4e66i9ftkJ+$Rd=PsMD|tH&|^8zi4x^ef=bAPNXHP!rnb=_-IL*eg#gcZU?JJ`A>sf|6XG02p;vY zm{KK*DzP6c@ck)7K7hZdstil_6UX?D&KUmYNIHrBB1d%(A&q1M$!(^@`jhG*(KvVA z=<~2Ne}ObUSNL~&71S!&M0Jdz`2IUcmTC0W4e!8Na4KVD6kG1idEhL47REPn+d0|F zo(3zXhb%bFiERd9?PG7$(uv%(o(c3SsJZmTY2I{LGQQt%W@Ir*LJS_wgvzB= zStYpBjjLgYM70XH&@F?DHDt*s!(L6cQaAR8C{jo;Km3g#={J9@-sOi?IIPxNl7zJ? zH0N!mwo+gx?e9mHo!^gSG{OF@8E;iVT}OBE$lWjnOipHG$>sJTupB4w0Z zGUMIjC_xwG{fl+OBELLoA}|lLWlfZ|qCLx{VV0YjvLcre#4}N|7n+ws^py28B_+9g zTI&aX4sv`~3)IWinU0NOj`j8QtkI5Hj!?GLnlW`9E!y-0lKiPs`f%ZnO%(|z^>3b+ z4f8bKDP`HcyuTgh!dy#I-b>8J`*MwCk*vqS|1vjpdMMda^s-uZm*k8b3j?2+8XHqj zW%5J$+&+ahIDic%Wy_+~f+GS8VQvWbjz)ylXTYj{H&<=(U1p_ya#z~jh1o_j@kYf< z7dQI0e7D9r$&1&-PqPC48g>INXxEmnx|6KPkm~k5Ln`Jh!@Mz5ur_!Js36`y^AJ@sWRh%X*3vQ_rPLjt| z>>N~I7vtj)C$03yF>r?0c;hcT#3j0*E}8GBMS7#0#Y3HxS%KfV?{Dbnms(svZioB- zNBXQjzL`2;2hY&1JsNB6hDX@((wBPqAdrI76Y?R_@3|A6?K+XUKLy9&Frv-pKkuyN z^2thlo{$oTwx!PkS)Cbv**mF%r|C}EkNpjgUq7pMQ;D$g$rm#Wh)b(K++_1(8$|!nIVr-}pOzX`h}@|vuL~tr9=54GKa9;#H)9?% z56GKcZL+=t6(W(Ds~U(Xf@|;dJ+eUUXpRkRrt$C+}0ewf3zsE#gMmePNv;rqdP#=c8PNn`=<0();8v&gp z_w2)6cy4<4O}i)}kO&&ysj*h?3UoD@z&phAXP-?p$4>ICJ#`$Hnx(c)xuIPVcA?wA zr-D~L(npGs#kT9T{leT$82Z{1#n1Zdj_p#tv!H6UN)YAG{*EkNFI~ayKjrYfX**nr zjU4Xh&-9)bBJx>jP|6(8_8_H^_m^h|#=bVzOhw6PzEB}+MJsoW4Q_rJ{U90Qopt<0 z>4b+9BjzM{XSjD_NcNwUrky|gQBTgW9&}6l zITysj#wC4Vt^l8n5rg5WZevEUK;)^waY>dcz*F*ckM^h@^AE%;{02Y`>0p^^!U+?Y z#XyS}rI8dK;^sTkALIuC+ao@Kum5DrltZLzcj^e~sc=~>?3L!@7L$0P`yG#J|3>X9 z$&i{}drD$Q4W^1%dS%kYjhqz?N$N+4FALw?6RMtdQVXZ$!sSoC-#5-R`PD9@=uhp# zy12hJH|a&;C{~vOzSU+rncV56dqLk%4&D9t?YvN>n)nJFV;~g>$2(CRpqiDZ|*OJ6Z6!Z@+ylZYJv!q{5l?*8WO{+qI@oU)AAz9?O z9LVlf1$QTr-Ei1W)L~gLCy}0Bgp-AWVvLO?wX zzHrV>)T+S9HiG*1ld~K9UiHQTjoNfpm-EMF% zshHv>eVW*~%S5wqT$))|*VvT^UGVN zjjTPk)iQH85_5$%YxzTB?R1TTIPQ<%3~sNEWXx!lKKrd4m8EOnCgfBE-ORPW;d$h4 z5n`EM5bG??$tx$bO>vj|BUuFcs?>FRDIiPH*}O_)KRkP~)5W^CNeB1qKW$fYM8n@+ zmI3|TJH1`{YbGPKPjFJQLPxH1iIW!ykgsHVwOm!JIN8_PY9BM-QIC#bKG?M4Zc%$GV^?f+yzOdz;lekB?&8kZWvm6k9C~u&?;hzVv28OK% z?8?L7h8qmBm=N~eMlcivpf>cHP{f466fZz%J1w_QAs+VfanClCUi7`OA|!#0v1tS<-mzVE;D3PMaq7b$q(|fwK z()B#RPE;B9L6RkZ((7uQjLnE=@qHH8ybzr!Da2|( z44~-r1X4DCd$fHF#I`}A0~hMJFt7!OjP7}C8~n{)iuiLkdlB2GtJ%*Y!8(RF6A9RUhpRl~}Iak73hu z>5r$r<~%lik3K5r1`FT$e)JxD;Chud@tlW+Z6_YL5b^_i+64Y1ocS$Vm0k~g^WJ{& ztiaA%czeFMJI~t_9?*mWtIe3jx{Py*%b!p*r!jjK#8fX)b6^@dZqdHp-r%lDS$Nxme!DNDIBg0Wz?ggpVZ(F#sub}Go#bq()T`-0(^ z_XOlHz%IZHz}ydIf%&Mq=s$%jcj2p_E0Wm(m>7V70W%oW8zy<20TAoh6gfwBG;k?` zC|+QqDJjO+;vg)}tyqgeS}d?&LHG*6Zwg)@=+O!eIk#MHDx+IAwKJObIFS)}&M+}i z7r_KJImcAxz0=4}2beBwGYh7jSip+#6@uR!yg04ES&k~ijUg%pPdM;0=mG{4e4C)q z1i&Q;qIiMirKt$$U7o#q-b{0I4qXosyt2;M7_ zI3l~T8bq#zCCJD$e?t6jPEU^gi0(uC>E+*1Yo8V6U8p9{84}@}>AxC8dyoMz==1P$ z7%D`iH5GQ2kZl!&E{8&nC8USgGCA)T=GM)rY9kqyU221Q4qt|%!Pdizyig?AFJD#dInk~x()bCRM`a-6eP-dK@$rDQ&GrJRrGwKAvurBtR7O8DNxQMT~#SNH&rp2GS-~w<%$_|XiKFul35jEb4gSw zSS8BY_vCjdZ)(wvYVP)g$W{!0y90lybdX4ZI59F@I96bQV8`PWS`~b z(RnoP`$?INSKp0RfGqhgmjLrUc2H39N45i*BXpj-mP^ivWD=1C)%?IpUrYQCe>SZh z4plhlr3>I{+2lhlYO96 z*!oPQzp4R;1!8vq8~+A3-~3)cEtBGmM8**lYCRbh*`8{jZf1>kZ&&aExc+P?ZPB*n zlO7JSldXVj89ezOkEa1tcmw~(wp0ouBI>fgz0B;5@e4`*snWxp`D_cq@~wi-DWViM&4oNZF2*^krn_hi|1 z#J{_Y(5TchJe@@J+kZ34-+ss}AnkZ-P$6eB8j#gU*iqxjDcsR%O+(8xq+~R0#VdtA z+l*0`V%)_H07pQ$zxnZU>>1bh%IvZTxe&$}Sw!l!PcT;bj-v#{F}i0fVVY`PaaO-O z8$vpm&#HDHg6Fw=x9KwA?w&L$1D>GymQ3^oTG4T@S4Eo_N0sWPcHZ7| zWYOKxrISXt@uLy2M92AJSsSyqM$mifKYo;>aHJ5P0Du613|9tUcXBTIPbT?@^lv#% zmkxNewV>Wa7kbf%@u8yQP5D`x?x$!_s_a8|OxosEdDb-4XvB#BwiH?HqL+&ztjkyW zAL()piF+h(F=>8X6V?68kYcuvjCFZFuY zY20M~b=kIFJ%z1b2P(XbE^|R0*UA&AK|RBp5Zn8>Y0~0ilb4iAFcQ1D%j)6a{pYq+ zjxqIPWla-4TBjQyy3>1c$=JJCdw6NNBskfPwTzdqPx!|lAI(z16UT)mT5);Cr zx-Mi>PjRW-9nCB}Vd9dp`vRATj0^^s%A54qt)Z@uNn^e4D&PFIR>^8} z5UucfK@@K7i=hp)!zJSSk+ym53!x3O8z}WiDCPcR@6A;z454GHu1!6LG$!>i|Lxiq zvWB`re&dQZ+I7SJZAEr#H%=tz>vF2=hEOrCxf$HHHg56JP@K+&%_82pj$QQMzi#Mm z)K2NJ<6AvZ+jXtbWNjICY(xEhp=*z<$2@Y3UGJb5A27o|kM1k*umkzvtg`nH@VBg? zBUEwAgJiL z6aXF<00q$}un}%3&A4uZHo+q3{xQJV18zcXY;S&qNPGNmN|ak63y29Sy9o_dfz1Fg zOA?ZbAXz;PAeT^(?{Oc8%}_wsdt1)n;S8Nc>k?d|T}57a%dZE$5UbXR*1daR*48y> z-|wKg7#n;9_=(XOW-5?Ls-pX=0R0$^0001u!65=tAwv`TpCpGK`=NZsNr=xRTCI+n zz6NG>v|Vl5x-fZL3k^zmSPzKv;=ITM<2|wd9^vId_!DLyb}gR?=cjtI;2;9oIq<<5 zmGuW+3gG?g%NPQ#kTD?|*Z_I}D{l9oU`9O|$@0*2M*h;H&)d=Y|FpVwL=9g2 zL!)tBWcY(F*ZEgR5B#6yA6@@V?~3@H0P8m&p!_}DL-p2^bJT2|?-*ItUN7o&AQ1e% zz-|K!oBo2%0E0Zh*43ae(#stWOWsC5w>QwXzTm#U@RX@7t;}cs?_S@X%+OEYJoCS6 z467~5&|4evxpakL9wT;^Oo<@JTS|Ly6Morh^Po%PdrxLt*h>Pw57kh{D3C`0Mjk)BYV+xG51<_Y8Ni;zQs z0~&Yg7_n(wsr&c5`m!}eV@;}f zNu7ST(n;K_!5VH0MDE}R@+WlkW52A=+SKZt-Jw+GC%ZeiN z=vj2lT6Ck!*IIL{-C4|xb)>tUFL(Vc zTt{>Oe2?a7*10{Q+_@Qm|B+{bhU#_l13V4^?Nc4S4%p`XnuIk{XE*BzLP-i=^9n&?_#?nwM8-H@s$%caq!?FKl`rRp^!hnwWF;g7+VPESZkbf_!7@{^uT)+C|1w914;R37TQjXR z1n-Veo#}Vd_W6{+chfLY)$GBQW@-PII>yz?zNTF$NAcvor2wsUcJFU_{dbAxr!N7M zOCxog(l0+Lw;8y?e93((wZp)~es?)!+G$zSf7#i;!Dciz02x2q?LzNu$CwF&eW=Y# zhx3Z$;}BJ1;h&rBr0LwJHuR~R9Y|Z)7Ph+I!3=z~XTIXMYC)4U!QMBCbnOn%>***x zG;{V%9V807b7c6O5@z?-HsnSn#Xr}`tkQnStWFz3_mIOw{(t4Op;q z!k^8*$-~d?<;)A> zVrO@8-?pa)I$pC~8+8Ve16Z@ZE~#?)iQmQ^D}lYjo{5H7+UF}1_pXb*AhZ;^i|7J~ z5UKZU+?wt6p03voovxZotYO+rkAEiiW>2N2F_ky3i;_u5^|8%Hd)sU|qu92oAM!^v zxmCOzV|bl^Ve9(l41y}$`2U;-%a59neNn#wh3?CU15LIqw;~a3$TJb0iB%bV5DWa% zM>IwKhG~4#?AIZtD-6GsY)1FZ_dZ~Kn%A$tGn?_OQXle;Yx+JMy5DIATRuQmkU*K^r;>{DzMxb1ER;HI`5 z_hmkLd9O_fo@ui)U1s>U8lGC3AFSbwmDk%7z(%Oumv!)P-CDfw4lilUxSH<%l70Es z5%XrTRVKNjU7MoM{RdzV>U5ot4er3vd2G(zMr^FH72plU`7hu8rDo62-MMCqR~m!rfd0T(9Wvvs;}nY0P=mExD5E_fy_- zP~;?PyUu2Z`B^RPy}>QDfR-MO*V+TNtWlk5WdRz8<-~*GZW6EelQ+t)vLEO>-Toc! zBH$-)|J8(`Gwepg{>q<5G5GBntgfDDstsyAvsjLNYkh)i^M#M-zZ<_=_cULzrw!u2 z4+tIAbD&BI{C#%sc>kob!2bR7os;*96CHa)cWHlRT2}Fgn=D!Mr+S|B+S|X8dDcG_ zB3fpQhEHAJp8)5b8KmRufyCeI`^~b>A&`U`7b?pr2mJyF$gwanTd2IWLOy$5-lzVv z0D!F9Enx;6IQ>f^o4o+}3T{FQhzXj~!K4qob5J>|`4=GtZ;X#eZYJFkP(sgiIjy4^ zLDIZSEgDnqSNSMa73xk99ZP=)4lpdu!k71X`97^7!W*x?gu%=xHzOxK2&*S|HY8&W z7OoY5HoAx+nB8i^lM>3=FQi{MhKg93V$@i_>MT|-j8)Rd|D%~kSV7iL@xDG`%zB|n zcQdZ}bjDVCRC%U8_Lva`F#R-GX&O7TAe(y_^{nB?yCDC-H>7r|Pou2f4YQ|H!u)Y0 zRl8wL+TRZr zOo7>cA?qHuns3*%HnPsVCNs^!=1uUWoHb5m%4pigE%U2c)McSy=`5xO)rE%)3)pCW z2yrP-rEKVsCDTchgC8M~sSEb7VAo!Crwt!(B5YBeA=p#`k>TKmsLwK@eGka5h$u_n zb6>B0e6_XoclG+(#K01TBx*?HCy7VGABh4b0!X`MDp0C;paO?G5_d7~Yuxv^4suQ8 zo4q!CwSSPuBJV|BjJz6oIr4+#7s8WeF*ZwQU<~B$dnW~u6N4xW zzCB9WdIa z--~xrD!=2f>_vyH4I<4IQI+CwgOF3%2oCzb9BdmngDFE%LErGMCu)17bn_Bw{y)wD zAjWRkhLQZxel&zcK21Ivpo&$WI}+O(2R5G`TO-P5ARK@a^lwaI$k4(^<(E65(ei{v z-HFnJk3o*o$g$lho2@+TAtJ`&XV*XoL>hnnGOd8y5GGQXl3@@%^pQwXLPiN=B(-dX z7)ed!B=y=8_(u{rX<#55wA_e}y6(NBk1XO44@vQ;BTpjCvQVcxJP|~Fbds^beU1SFF<>LVvG29mr#40QpCky>no6-cnid-S77 zeB7i*J^BqmMFmQE-6m(cdlSfK)bT$77{2*A#v&}X;Fpb-Cuq1h8CJ52dW>4$PgnL2@#@9M2oOpqO*=iA-=@vkC0HQ zBoBXuj7my@5r_*aNm7~(Bu9>uQi-XKOD9StOPu;(G?jDl-{qjo0x!stmPC@F2wreW zOHzic7zRmdaeyR;u9yghbr_UMgRu{$)Fd!}#DGl-hESP8nhfCPK~r*(7a>SdGQQy= z7uAs^ICbNTqv?;P@+4{gr~#i88v<+!UNVGeBA|hi4Oupfl+?2oHmH>3&>;iascwZs zr=k*vUx%Gdcs79FgL~-BZgymJJ8sx~+tp0vz2=cp1PD30grjE1yY!MZZ7bDyU$h;F zVxXa~up*Ly2j3NZMpt5CABv4Iz>CVto)zd5FIg_x=YK3o%|-S z%*@w+yR?->Q5-4C=}11Wa`^q4*Iak#yH5T8piALWzoJD%MStLUCL@y5@Dc9AYtrt! zk*r?`>NfZ-b5!WfC@ch>#}|vBH$t6kf^;U^CdHF&@{gM_sAQjS?FLb4qtZj7qQugB z?VgT^I*Pmks2ObLMWkgj6crddL=n2!WFr&RCObYIuzDBbwDh0>EYT&|jzk2>Hc56T z#YS<6U>ig9Cn7UZM6|JdXHCQgIMS9vWBmg&h^j0r6B`Yt|Dk}#`GVp_b7da}(zQlf}A}h>c*i9Ds*a;@H z>!$673)GYs7txFHZxd71FhJlRQ~_;(>Wzxvp!iOjiky*4*i7Kq27z=v00S_<0}SZ^ z4S@r^4G;y8VFTTC!p}W;;czqa5!VLO7tGTVutdfh?@Ig=6dcoz9vJ|>f%{;92N;-O z5F^`Bp)Vr!XQ9zo11S{sc_ndWd@8ZBDdN3WET-xqb}NPd-L3Ln3lBWDKF`q@hZ)+` zz`SKCbX}%Uc?BG!Skri!Z<#1lY6d^;d<_q0+0?CQ!^eiO)t}bzt&BgjuZXi?cFG({ zg#ilTU6nWkHN#R{nzej(3ca16vyWNU0{=4)=!-y{Zs?ZN^W3g^1T6*2*~T_-4t`47 zb@}JcFDtCnxLQ}4Fe$26GR}4kMV|HKczrqdX3^St>oshpm_OO3k1eJ5>rCFY(z`6- z6ga>695IZl$CztiIkzD%8)Kt)%&OexTP|GPTKOtt4^Ku&w3=i&ml=Wt{@pX|;=Tu&U|kX~hn46Hh06;w%g=Mbxzl zrviI9>EYI|=xVD*gO*+;Qe|K5z_%Bzv#fIyEUgvM`BaZven!e|GR|v^RsC9oFCEJX zJo%nISnH8vmvq(q+h)O`{R1omrE7D>jn3tFZCvRV1AwfKeDLy3L|wa7&K6j4_FBh+ zxPN`soj#w^8NmYv&y`2`vrL3@wvCq9uecEl! zw^9`VQ~J7ydDH0G_QeKkgnyTQ;Jh{M4(RtHL62aa=-|xp4V|<5w_M74+ud+^mbG zypv>7c*HUxdaEI2oHZ-gZ21mO{kWMvFRobRd^H3xL59MZ$ucbPJ~r<$ zuQH=!;;Q!U*E+!^ZdG#wNz#UiO7#e1sfK~A!hRhuzH^py99oW{#f2|fR`wEl7kClq z*dn;65w4ii!svdWVv|aQ6RySl{8$^qQg*7XC1O)kTCAE&U>8qPhXs6_ z`Y+G#^-ptKy5kD@^KGY#I$CC0lRj=Qc~GazRL)oC!(5Yk8_%99EK&r#>g_&x+rcZa zxl7}Q6U%O!v_8$#Xt>HGR4+?R=bALmX=EbT zCZt|@^GU&>GfZChG&9V!E7HOVDc5S!%W0QglbWR8yBRH2#lm`sA`&>i%DjpB`wS_i zFvgnX_VcGZ?mkC)PeZ(I^_L7i;(8}P+RV;fb@@jto7|**l&t?)-r-Ec0(BHb!r=0)_pIz zt7$>tzTn$}1J$F=tz?!h|A_$~yMQNQUb##HmY>&{4!CJv=ENK;lC?Wet>P4wVe7+% z%q=mD%kj4^fG$TpHGw05#eKbqSXs=iY_F4CIVOt7zV2Td6 znkYu+QKji!w$1-lFQM9v7HjmR=6fqLV)_-zk!+ zTaJ4#@#sobff5ZoNG{>v&^L-(Z`mW16|97Ljp&8{<7=MyRRNo)E65hpyEwM>bo-GT zdw>(OuESuo^=;CN`;zk1{oa{KZe&$;hME0PVdAh%ua{l$SO!t^W+@;L;b}*FPz>Yk zdp|qFDu_4VmTg+kPpikuBKldBL0@YD6oCZG>7F|Vr`5?6lxS3eao=ilG}*TjB?NGB z#8MW}1G6ozXILf*-Dh3`Mhk|KzFh)Pc)0!S^EUW?nZ>nuHFI@VO}e($rGSLz;kELaH?i%c-TEaLCN{sM^Km#HdbBCVCrePJqN62wRReT*O_ zbCVp|@Tus+>NR-9g~-IgmzSaXv>^)&DL&^Z%2U9zVf zYxK!e*9(a+&AId|8T7Wgxe9rTzO{GpG#rt|Q#yb^U}i6;<5Paupi;WT=A@rw#~r6P zO1+lcP^u?1CF)szaUpZ4Y}Os$&obg1=o?PBNe)-WE3%px=5md1m9Jw{$E&q0yXH|< zv*qS2|8BlEZC&Q{e>t2F-jglxyK=%MrlL&!mJyO;dDKT6Kt+;n9q_9h?Le{WdPr~( z0FF63z7F&%0D#l!un^rebIviza;Ph~JLRL10WAD9zmiDf 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 }LBUVFB02*2`gNOnv!i2iIaOhx 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