@@ -92,14 +92,20 @@ impl<'data> QrSetupPayload<'data> {
92
92
) -> Self {
93
93
const DEFAULT_VERSION : u8 = 0 ;
94
94
95
- QrSetupPayload {
95
+ let mut result = QrSetupPayload {
96
96
version : DEFAULT_VERSION ,
97
97
flow_type : CommissionningFlowType :: Standard ,
98
98
discovery_capabilities,
99
99
dev_det,
100
100
comm_data,
101
101
optional_data : BTreeMap :: new ( ) ,
102
+ } ;
103
+
104
+ if !dev_det. serial_no . is_empty ( ) {
105
+ result. add_serial_number ( SerialNumber :: String ( dev_det. serial_no . clone ( ) ) ) ;
102
106
}
107
+
108
+ result
103
109
}
104
110
105
111
fn is_valid ( & self ) -> bool {
@@ -157,7 +163,7 @@ impl<'data> QrSetupPayload<'data> {
157
163
& self . optional_data
158
164
}
159
165
160
- pub fn add_serial_number ( & mut self , serial_number : SerialNumber ) -> Result < ( ) , Error > {
166
+ pub fn add_serial_number ( & mut self , serial_number : SerialNumber ) {
161
167
match serial_number {
162
168
SerialNumber :: String ( serial_number) => self . add_optional_extension_data (
163
169
SERIAL_NUMBER_TAG ,
@@ -168,6 +174,7 @@ impl<'data> QrSetupPayload<'data> {
168
174
QRCodeInfoType :: UInt32 ( serial_number) ,
169
175
) ,
170
176
}
177
+ . expect ( "can not add serial number" ) ;
171
178
}
172
179
173
180
fn check_payload_common_constraints ( & self ) -> bool {
@@ -311,7 +318,9 @@ fn estimate_struct_overhead(first_field_size: usize) -> usize {
311
318
}
312
319
313
320
pub ( super ) fn print_qr_code ( qr_data : & str ) {
314
- let code = QrCode :: with_version ( qr_data, Version :: Normal ( 2 ) , qrcode:: EcLevel :: M ) . unwrap ( ) ;
321
+ let needed_version = compute_qr_version ( qr_data) ;
322
+ let code =
323
+ QrCode :: with_version ( qr_data, Version :: Normal ( needed_version) , qrcode:: EcLevel :: M ) . unwrap ( ) ;
315
324
let image = code
316
325
. render :: < unicode:: Dense1x2 > ( )
317
326
. dark_color ( unicode:: Dense1x2 :: Light )
@@ -320,6 +329,15 @@ pub(super) fn print_qr_code(qr_data: &str) {
320
329
info ! ( "\n {}" , image) ;
321
330
}
322
331
332
+ fn compute_qr_version ( qr_data : & str ) -> i16 {
333
+ match qr_data. len ( ) {
334
+ 0 ..=38 => 2 ,
335
+ 39 ..=61 => 3 ,
336
+ 62 ..=90 => 4 ,
337
+ _ => 5 ,
338
+ }
339
+ }
340
+
323
341
fn populate_bits (
324
342
bits : & mut [ u8 ] ,
325
343
offset : & mut usize ,
@@ -543,22 +561,18 @@ mod tests {
543
561
const QR_CODE : & str = "MT:-24J0AFN00KA064IJ3P0IXZB0DK5N1K8SQ1RYCU1-A40" ;
544
562
545
563
let comm_data = CommissioningData {
546
- passwd : 20202021 ,
564
+ verifier : VerifierData :: new_with_pw ( 20202021 ) ,
547
565
discriminator : 3840 ,
548
- ..Default :: default ( )
549
566
} ;
550
567
let dev_det = BasicInfoConfig {
551
568
vid : 65521 ,
552
569
pid : 32769 ,
570
+ serial_no : "1234567890" . to_string ( ) ,
553
571
..Default :: default ( )
554
572
} ;
555
573
556
574
let disc_cap = DiscoveryCapabilities :: new ( true , false , false ) ;
557
- let mut qr_code_data = QrSetupPayload :: new ( & dev_det, & comm_data, disc_cap) ;
558
- qr_code_data
559
- . add_serial_number ( SerialNumber :: String ( "1234567890" . to_string ( ) ) )
560
- . expect ( "Failed to add serial number" ) ;
561
-
575
+ let qr_code_data = QrSetupPayload :: new ( & dev_det, & comm_data, disc_cap) ;
562
576
let data_str = payload_base38_representation ( & qr_code_data) . expect ( "Failed to encode" ) ;
563
577
assert_eq ! ( data_str, QR_CODE )
564
578
}
@@ -574,21 +588,18 @@ mod tests {
574
588
const OPTIONAL_DEFAULT_INT_VALUE : i32 = 65550 ;
575
589
576
590
let comm_data = CommissioningData {
577
- passwd : 20202021 ,
591
+ verifier : VerifierData :: new_with_pw ( 20202021 ) ,
578
592
discriminator : 3840 ,
579
- ..Default :: default ( )
580
593
} ;
581
594
let dev_det = BasicInfoConfig {
582
595
vid : 65521 ,
583
596
pid : 32769 ,
597
+ serial_no : "1234567890" . to_string ( ) ,
584
598
..Default :: default ( )
585
599
} ;
586
600
587
601
let disc_cap = DiscoveryCapabilities :: new ( true , false , false ) ;
588
602
let mut qr_code_data = QrSetupPayload :: new ( & dev_det, & comm_data, disc_cap) ;
589
- qr_code_data
590
- . add_serial_number ( SerialNumber :: String ( "1234567890" . to_string ( ) ) )
591
- . expect ( "Failed to add serial number" ) ;
592
603
593
604
qr_code_data
594
605
. add_optional_vendor_data (
0 commit comments