Skip to content

Commit 378b38c

Browse files
committed
Improve BLE. To POP value from write_values
1 parent ac1448d commit 378b38c

File tree

6 files changed

+65
-55
lines changed

6 files changed

+65
-55
lines changed

mrbgems/picoruby-ble/example/peripheral-central/peripheral/app.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ def initialize
5858
def heartbeat_callback
5959
@counter += 1
6060
temperature = ((27 - (@adc.read * 3.3 / (1<<12) - 0.706) / 0.001721) * 100).to_i
61-
set_read_value(@temperature_handle, Utils.int16_to_little_endian(temperature))
61+
push_read_value(@temperature_handle, Utils.int16_to_little_endian(temperature))
6262
if @counter == 10
6363
if @notification_enabled
6464
debug_puts "request_can_send_now_event"
@@ -70,7 +70,7 @@ def heartbeat_callback
7070
@led_on = !@led_on
7171
@led.write(@led_on ? 1 : 0)
7272
end
73-
if write_value = get_write_value(@configuration_handle)
73+
if write_value = pop_write_value(@configuration_handle)
7474
@notification_enabled = ( write_value == "\x01\x00" )
7575
end
7676
end

mrbgems/picoruby-ble/sig/ble.rbs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,8 @@ class BLE
8686
def heartbeat_callback: () -> void
8787
def blink_led: () -> void
8888
def gap_local_bd_addr: () -> String
89-
def get_write_value: (Integer handle) -> (String|nil)
90-
def set_read_value: (Integer handle, String value) -> void
89+
def pop_write_value: (Integer handle) -> (String|nil)
90+
def push_read_value: (Integer handle, String value) -> void
9191
def gap_connect: (String addr, Integer addr_time) -> Integer
9292

9393
class Utils

mrbgems/picoruby-ble/src/ble.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,18 @@
55

66
#include "../../picoruby-machine/include/machine.h"
77

8+
/*
9+
* Workaround: To avoid deadlock
10+
* TODO: Maybe we need a critical section instead of these simple mutex
11+
*/
12+
static bool packet_mutex = false;
13+
static bool write_values_mutex = false;
14+
static bool heatbeat_flag = false;
15+
static bool packet_flag = false;
16+
17+
static uint8_t *packet = NULL;
18+
static uint16_t packet_size = 0;
19+
820
#if defined(PICORB_VM_MRUBY)
921

1022
#include "mruby/ble.c"

mrbgems/picoruby-ble/src/mruby/ble.c

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -7,34 +7,25 @@ static mrb_state *_mrb = NULL;
77
static mrb_value write_values;
88
static mrb_value read_values;
99

10-
/*
11-
* Workaround: To avoid deadlock
12-
*/
13-
static bool mutex_locked = false;
14-
static bool heatbeat_flag = false;
15-
static bool packet_flag = false;
16-
static uint8_t *packet = NULL;
17-
static uint16_t packet_size = 0;
18-
1910
void
2011
BLE_push_event(uint8_t *data, uint16_t size)
2112
{
22-
if (mutex_locked) return;
23-
mutex_locked = true;
13+
if (packet_mutex) return;
14+
packet_mutex = true;
2415
packet_flag = true;
2516
packet_size = size;
2617
if (packet != NULL) {
2718
mrb_free(_mrb, packet);
2819
}
2920
packet = mrb_malloc(_mrb, packet_size);
3021
memcpy(packet, data, packet_size);
31-
mutex_locked = false;
22+
packet_mutex = false;
3223
}
3324

3425
void
3526
BLE_heartbeat(void)
3627
{
37-
if (mutex_locked) return;
28+
if (packet_mutex) return;
3829
heatbeat_flag = true;
3930
}
4031

@@ -45,7 +36,9 @@ BLE_write_data(uint16_t att_handle, const uint8_t *data, uint16_t size)
4536
return -1;
4637
}
4738
mrb_value write_value = mrb_str_new(_mrb, (const char *)data, size);
39+
write_values_mutex = true;
4840
mrb_hash_set(_mrb, write_values, mrb_fixnum_value(att_handle), write_value);
41+
write_values_mutex = false;
4942
return 0;
5043
}
5144

@@ -75,26 +68,27 @@ static mrb_value
7568
mrb_pop_packet(mrb_state *mrb, mrb_value self)
7669
{
7770
mrb_value packet_value = mrb_nil_value();
78-
if (mutex_locked || !packet_flag) return packet_value;
79-
mutex_locked = true;
71+
if (packet_mutex || !packet_flag) return packet_value;
72+
packet_mutex = true;
8073
packet_flag = false;
8174
packet_value = mrb_str_new(mrb, (const char *)packet, packet_size);
8275
mrb_free(mrb, packet);
8376
packet = NULL;
84-
mutex_locked = false;
77+
packet_mutex = false;
8578
return packet_value;
8679
}
8780

8881
static mrb_value
89-
mrb_get_write_value(mrb_state *mrb, mrb_value self)
82+
mrb_pop_write_value(mrb_state *mrb, mrb_value self)
9083
{
84+
if (write_values_mutex) return mrb_nil_value();
9185
mrb_int handle;
9286
mrb_get_args(mrb, "i", &handle);
93-
return mrb_hash_get(mrb, write_values, mrb_fixnum_value(handle));
87+
return mrb_hash_delete_key(mrb, write_values, mrb_fixnum_value(handle));
9488
}
9589

9690
static mrb_value
97-
mrb_set_read_value(mrb_state *mrb, mrb_value self)
91+
mrb_push_read_value(mrb_state *mrb, mrb_value self)
9892
{
9993
mrb_int handle;
10094
mrb_value read_value;
@@ -174,8 +168,8 @@ mrb_picoruby_ble_gem_init(mrb_state* mrb)
174168
mrb_define_method_id(mrb, class_BLE, MRB_SYM(_init), mrb__init, MRB_ARGS_REQ(1));
175169
mrb_define_method_id(mrb, class_BLE, MRB_SYM(hci_power_control), mrb_hci_power_control, MRB_ARGS_REQ(1));
176170
mrb_define_method_id(mrb, class_BLE, MRB_SYM(gap_local_bd_addr), mrb_gap_local_bd_addr, MRB_ARGS_NONE());
177-
mrb_define_method_id(mrb, class_BLE, MRB_SYM(get_write_value), mrb_get_write_value, MRB_ARGS_REQ(1));
178-
mrb_define_method_id(mrb, class_BLE, MRB_SYM(set_read_value), mrb_set_read_value, MRB_ARGS_REQ(2));
171+
mrb_define_method_id(mrb, class_BLE, MRB_SYM(pop_write_value), mrb_pop_write_value, MRB_ARGS_REQ(1));
172+
mrb_define_method_id(mrb, class_BLE, MRB_SYM(push_read_value), mrb_push_read_value, MRB_ARGS_REQ(2));
179173
mrb_define_method_id(mrb, class_BLE, MRB_SYM(pop_heartbeat), mrb_pop_heartbeat, MRB_ARGS_NONE());
180174
mrb_define_method_id(mrb, class_BLE, MRB_SYM(pop_packet), mrb_pop_packet, MRB_ARGS_NONE());
181175

mrbgems/picoruby-ble/src/mrubyc/ble.c

Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,34 +4,25 @@ static mrbc_value read_values = {.tt = MRBC_TT_NIL};
44
#define NODE_BOX_SIZE 10
55
#define VM_REGS_SIZE 110 // can be reduced?
66

7-
/*
8-
* Workaround: To avoid deadlock
9-
*/
10-
static bool mutex_locked = false;
11-
static bool heatbeat_flag = false;
12-
static bool packet_flag = false;
13-
static uint8_t *packet = NULL;
14-
static uint16_t packet_size = 0;
15-
167
void
178
BLE_push_event(uint8_t *data, uint16_t size)
189
{
19-
if (mutex_locked) return;
20-
mutex_locked = true;
10+
if (packet_mutex) return;
11+
packet_mutex = true;
2112
packet_flag = true;
2213
packet_size = size;
2314
if (packet != NULL) {
2415
mrbc_raw_free(packet);
2516
}
2617
packet = mrbc_raw_alloc(packet_size);
2718
memcpy(packet, data, packet_size);
28-
mutex_locked = false;
19+
packet_mutex = false;
2920
}
3021

3122
void
3223
BLE_heartbeat(void)
3324
{
34-
if (mutex_locked) return;
25+
if (packet_mutex) return;
3526
heatbeat_flag = true;
3627
}
3728

@@ -41,7 +32,9 @@ BLE_write_data(uint16_t att_handle, const uint8_t *data, uint16_t size)
4132
if (att_handle == 0 || size == 0 || write_values.tt == MRBC_TT_NIL) {
4233
return -1;
4334
}
35+
write_values_mutex = true;
4436
mrbc_value write_value = mrbc_string_new(NULL, (const void *)data, size);
37+
write_values_mutex = false;
4538
return mrbc_hash_set(&write_values, &mrbc_integer_value(att_handle), &write_value);
4639
}
4740

@@ -73,29 +66,33 @@ c_pop_heartbeat(mrbc_vm *vm, mrbc_value *v, int argc)
7366
static void
7467
c_pop_packet(mrbc_vm *vm, mrbc_value *v, int argc)
7568
{
76-
if (mutex_locked || !packet_flag) {
69+
if (packet_mutex || !packet_flag) {
7770
SET_NIL_RETURN();
7871
return;
7972
}
80-
mutex_locked = true;
73+
packet_mutex = true;
8174
packet_flag = false;
8275
mrb_value packet_value = mrbc_string_new(vm, (const char *)packet, packet_size);
8376
mrbc_raw_free(packet);
8477
packet = NULL;
85-
mutex_locked = false;
78+
packet_mutex = false;
8679
SET_RETURN(packet_value);
8780
}
8881

8982
static void
90-
c_get_write_value(mrbc_vm *vm, mrbc_value *v, int argc)
83+
c_pop_write_value(mrbc_vm *vm, mrbc_value *v, int argc)
9184
{
85+
if (write_values_mutex) {
86+
SET_NIL_RETURN();
87+
return;
88+
}
9289
mrb_value handle = GET_ARG(1);
93-
mrbc_value write_value = mrbc_hash_get(&write_values, &handle);
90+
mrbc_value write_value = mrbc_hash_remove(&write_values, &handle);
9491
SET_RETURN(write_value);
9592
}
9693

9794
static void
98-
c_set_read_value(mrbc_vm *vm, mrbc_value *v, int argc)
95+
c_push_read_value(mrbc_vm *vm, mrbc_value *v, int argc)
9996
{
10097
if (argc != 2) {
10198
mrbc_raise(vm, MRBC_CLASS(ArgumentError), "wrong number of arguments");
@@ -169,8 +166,8 @@ mrbc_ble_init(mrbc_vm *vm)
169166
mrbc_define_method(vm, class_BLE, "_init", c__init);
170167
mrbc_define_method(vm, class_BLE, "hci_power_control", c_hci_power_control);
171168
mrbc_define_method(vm, class_BLE, "gap_local_bd_addr", c_gap_local_bd_addr);
172-
mrbc_define_method(vm, class_BLE, "get_write_value", c_get_write_value);
173-
mrbc_define_method(vm, class_BLE, "set_read_value", c_set_read_value);
169+
mrbc_define_method(vm, class_BLE, "pop_write_value", c_pop_write_value);
170+
mrbc_define_method(vm, class_BLE, "push_read_value", c_push_read_value);
174171
mrbc_define_method(vm, class_BLE, "pop_heartbeat", c_pop_heartbeat);
175172
mrbc_define_method(vm, class_BLE, "pop_packet", c_pop_packet);
176173

mrbgems/picoruby-shell/shell_executables/nmble.rb

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,11 @@ class WifiConfigPeripheral < BLE
2222
CHARACTERISTIC_COUNTRY = 0x2AAD
2323
CHARACTERISTIC_WATCHDOG = 0x2AAE
2424

25-
def initialize
25+
def initialize(name = "R2P2 BLE")
2626
# Setup BLE advertising data
2727
@adv_data = BLE::AdvertisingData.build do |a|
2828
a.add(BLUETOOTH_DATA_TYPE_FLAGS, APP_AD_FLAGS)
29-
a.add(BLUETOOTH_DATA_TYPE_COMPLETE_LOCAL_NAME, "R2P2 BLE")
29+
a.add(BLUETOOTH_DATA_TYPE_COMPLETE_LOCAL_NAME, name)
3030
a.add(BLUETOOTH_DATA_TYPE_COMPLETE_LIST_OF_16_BIT_SERVICE_CLASS_UUIDS, WIFI_CONFIG)
3131
end
3232

@@ -63,26 +63,27 @@ def initialize
6363
def heartbeat_callback
6464
blink_led if @led_blink
6565

66-
if (ssid_value = get_write_value(@ssid_handle)) && ssid_value != @ssid
66+
if (ssid_value = pop_write_value(@ssid_handle)) && ssid_value != @ssid
6767
@ssid = ssid_value
6868
debug_puts "Received SSID: #{ssid_value}"
6969
end
70-
if (password_value = get_write_value(@password_handle)) && password_value != @password
70+
if (password_value = pop_write_value(@password_handle)) && password_value != @password
7171
@password = password_value
7272
debug_puts "Received Password: ******"
7373
end
74-
if (country_value = get_write_value(@country_handle)) && country_value != @country
74+
if (country_value = pop_write_value(@country_handle)) && country_value != @country
7575
@country = country_value
7676
debug_puts "Received Country Code: #{country_value}"
7777
end
78-
if (watchdog_value = get_write_value(@watchdog_handle)) && watchdog_value != @watchdog
78+
if (watchdog_value = pop_write_value(@watchdog_handle)) && watchdog_value != @watchdog
7979
@watchdog = watchdog_value
8080
debug_puts "Received Watchdog: #{watchdog_value}"
8181
end
8282

8383
if @ssid && @password #&& @country && @watchdog
8484
save_wifi_config
8585
@ssid = @password = @country = @watchdog = nil
86+
puts "\nConfiguration saved. Please reboot the device.\n"
8687
end
8788
end
8889

@@ -96,7 +97,10 @@ def save_wifi_config
9697
"watchdog" => (@watchdog == 'y')
9798
}
9899
}
99-
File.open(ENV['WIFI_CONFIG_PATH'], "w") do |f| f.write YAML.dump(doc) end end
100+
File.open(ENV['WIFI_CONFIG_PATH'], "w") do |f|
101+
f.write YAML.dump(doc)
102+
end
103+
end
100104

101105
def encrypt_password(password)
102106
cipher = MbedTLS::Cipher.new("AES-256-CBC")
@@ -138,8 +142,11 @@ def packet_callback(event_packet)
138142
puts "Open https://picoruby.github.io/wifi in a web browser\n"
139143

140144
# Start BLE Peripheral
141-
peri = WifiConfigPeripheral.new
145+
require 'rng'
146+
name = "R2P2 BLE #{RNG.random_int.abs.to_s[0,4]}"
147+
peri = WifiConfigPeripheral.new(name)
142148
peri.debug = true
143-
puts "\nOpen https://picoruby.github.io/wifi\n"
149+
puts "\nOpen https://picoruby.github.io/wifi"
150+
puts "and find the device with name: '#{name}'\n"
144151
peri.start
145152

0 commit comments

Comments
 (0)