aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2024-06-25 23:56:59 +0200
committerDario Nieuwenhuis <[email protected]>2024-06-25 23:56:59 +0200
commitb870e7f2577781c4d68f61de6ff0e2755267ac1c (patch)
tree8d0d9759fbf62fa8fdc886f5f900477cbd24f924
parent1ce9418bca64b0783f6837256bef451312922717 (diff)
tests/nrf: generalize buffereduart tests for all chips.
-rw-r--r--tests/nrf/Cargo.toml19
-rw-r--r--tests/nrf/src/bin/buffered_uart.rs26
-rw-r--r--tests/nrf/src/bin/buffered_uart_full.rs32
-rw-r--r--tests/nrf/src/bin/buffered_uart_halves.rs27
-rw-r--r--tests/nrf/src/bin/buffered_uart_spam.rs32
-rw-r--r--tests/nrf/src/common.rs47
6 files changed, 108 insertions, 75 deletions
diff --git a/tests/nrf/Cargo.toml b/tests/nrf/Cargo.toml
index 2faee70e3..49e464a90 100644
--- a/tests/nrf/Cargo.toml
+++ b/tests/nrf/Cargo.toml
@@ -30,14 +30,15 @@ panic-probe = { version = "0.3", features = ["print-defmt"] }
30portable-atomic = { version = "1.6.0" } 30portable-atomic = { version = "1.6.0" }
31 31
32[features] 32[features]
33nrf51422 = ["embassy-nrf/nrf51", "portable-atomic/unsafe-assume-single-core"] 33nrf51422 = ["embassy-nrf/nrf51", "portable-atomic/unsafe-assume-single-core"]
34nrf52832 = ["embassy-nrf/nrf52832", "easydma"] 34nrf52832 = ["embassy-nrf/nrf52832", "easydma"]
35nrf52833 = ["embassy-nrf/nrf52833", "easydma"] 35nrf52833 = ["embassy-nrf/nrf52833", "easydma", "two-uarts"]
36nrf52840 = ["embassy-nrf/nrf52840", "easydma"] 36nrf52840 = ["embassy-nrf/nrf52840", "easydma", "two-uarts"]
37nrf5340 = ["embassy-nrf/nrf5340-app-s", "easydma"] 37nrf5340 = ["embassy-nrf/nrf5340-app-s", "easydma", "two-uarts"]
38nrf9160 = ["embassy-nrf/nrf9160-s", "easydma"] 38nrf9160 = ["embassy-nrf/nrf9160-s", "easydma", "two-uarts"]
39 39
40easydma = [] 40easydma = []
41two-uarts = []
41 42
42[profile.release] 43[profile.release]
43codegen-units = 1 44codegen-units = 1
@@ -53,22 +54,22 @@ overflow-checks = false
53[[bin]] 54[[bin]]
54name = "buffered_uart" 55name = "buffered_uart"
55path = "src/bin/buffered_uart.rs" 56path = "src/bin/buffered_uart.rs"
56required-features = [ "nrf52840",] 57required-features = [ "easydma",]
57 58
58[[bin]] 59[[bin]]
59name = "buffered_uart_full" 60name = "buffered_uart_full"
60path = "src/bin/buffered_uart_full.rs" 61path = "src/bin/buffered_uart_full.rs"
61required-features = [ "nrf52840",] 62required-features = [ "easydma",]
62 63
63[[bin]] 64[[bin]]
64name = "buffered_uart_halves" 65name = "buffered_uart_halves"
65path = "src/bin/buffered_uart_halves.rs" 66path = "src/bin/buffered_uart_halves.rs"
66required-features = [ "nrf52840",] 67required-features = [ "two-uarts",]
67 68
68[[bin]] 69[[bin]]
69name = "buffered_uart_spam" 70name = "buffered_uart_spam"
70path = "src/bin/buffered_uart_spam.rs" 71path = "src/bin/buffered_uart_spam.rs"
71required-features = [ "nrf52840",] 72required-features = [ "two-uarts",]
72 73
73[[bin]] 74[[bin]]
74name = "ethernet_enc28j60_perf" 75name = "ethernet_enc28j60_perf"
diff --git a/tests/nrf/src/bin/buffered_uart.rs b/tests/nrf/src/bin/buffered_uart.rs
index 89314bfc9..04f32832f 100644
--- a/tests/nrf/src/bin/buffered_uart.rs
+++ b/tests/nrf/src/bin/buffered_uart.rs
@@ -1,19 +1,17 @@
1// required-features: nrf52840 1// required-features: easydma
2#![no_std] 2#![no_std]
3#![no_main] 3#![no_main]
4teleprobe_meta::target!(b"nrf52840-dk");
5 4
6use defmt::{assert_eq, *}; 5#[path = "../common.rs"]
6mod common;
7
8use defmt::{panic, *};
7use embassy_executor::Spawner; 9use embassy_executor::Spawner;
8use embassy_futures::join::join; 10use embassy_futures::join::join;
9use embassy_nrf::buffered_uarte::{self, BufferedUarte}; 11use embassy_nrf::buffered_uarte::{self, BufferedUarte};
10use embassy_nrf::{bind_interrupts, peripherals, uarte}; 12use embassy_nrf::{peripherals, uarte};
11use {defmt_rtt as _, panic_probe as _}; 13use {defmt_rtt as _, panic_probe as _};
12 14
13bind_interrupts!(struct Irqs {
14 UARTE0_UART0 => buffered_uarte::InterruptHandler<peripherals::UARTE0>;
15});
16
17#[embassy_executor::main] 15#[embassy_executor::main]
18async fn main(_spawner: Spawner) { 16async fn main(_spawner: Spawner) {
19 let mut p = embassy_nrf::init(Default::default()); 17 let mut p = embassy_nrf::init(Default::default());
@@ -27,14 +25,14 @@ async fn main(_spawner: Spawner) {
27 // test teardown + recreate of the buffereduarte works fine. 25 // test teardown + recreate of the buffereduarte works fine.
28 for _ in 0..2 { 26 for _ in 0..2 {
29 let u = BufferedUarte::new( 27 let u = BufferedUarte::new(
30 &mut p.UARTE0, 28 &mut peri!(p, UART0),
31 &mut p.TIMER0, 29 &mut p.TIMER0,
32 &mut p.PPI_CH0, 30 &mut p.PPI_CH0,
33 &mut p.PPI_CH1, 31 &mut p.PPI_CH1,
34 &mut p.PPI_GROUP0, 32 &mut p.PPI_GROUP0,
35 Irqs, 33 irqs!(UART0_BUFFERED),
36 &mut p.P1_03, 34 &mut peri!(p, PIN_A),
37 &mut p.P1_02, 35 &mut peri!(p, PIN_B),
38 config.clone(), 36 config.clone(),
39 &mut rx_buffer, 37 &mut rx_buffer,
40 &mut tx_buffer, 38 &mut tx_buffer,
@@ -65,7 +63,9 @@ async fn main(_spawner: Spawner) {
65 let buf = unwrap!(rx.fill_buf().await); 63 let buf = unwrap!(rx.fill_buf().await);
66 64
67 for &b in buf { 65 for &b in buf {
68 assert_eq!(b, i as u8); 66 if b != i as u8 {
67 panic!("mismatch {} vs {}, index {}", b, i as u8, i);
68 }
69 i = i + 1; 69 i = i + 1;
70 } 70 }
71 71
diff --git a/tests/nrf/src/bin/buffered_uart_full.rs b/tests/nrf/src/bin/buffered_uart_full.rs
index a7d9a3717..09353bbe8 100644
--- a/tests/nrf/src/bin/buffered_uart_full.rs
+++ b/tests/nrf/src/bin/buffered_uart_full.rs
@@ -1,19 +1,17 @@
1// required-features: nrf52840 1// required-features: easydma
2#![no_std] 2#![no_std]
3#![no_main] 3#![no_main]
4teleprobe_meta::target!(b"nrf52840-dk"); 4
5#[path = "../common.rs"]
6mod common;
5 7
6use defmt::{assert_eq, *}; 8use defmt::{assert_eq, *};
7use embassy_executor::Spawner; 9use embassy_executor::Spawner;
8use embassy_nrf::buffered_uarte::{self, BufferedUarte}; 10use embassy_nrf::buffered_uarte::{self, BufferedUarte};
9use embassy_nrf::{bind_interrupts, peripherals, uarte}; 11use embassy_nrf::{peripherals, uarte};
10use embedded_io_async::{Read, Write}; 12use embedded_io_async::{Read, Write};
11use {defmt_rtt as _, panic_probe as _}; 13use {defmt_rtt as _, panic_probe as _};
12 14
13bind_interrupts!(struct Irqs {
14 UARTE0_UART0 => buffered_uarte::InterruptHandler<peripherals::UARTE0>;
15});
16
17#[embassy_executor::main] 15#[embassy_executor::main]
18async fn main(_spawner: Spawner) { 16async fn main(_spawner: Spawner) {
19 let p = embassy_nrf::init(Default::default()); 17 let p = embassy_nrf::init(Default::default());
@@ -21,18 +19,18 @@ async fn main(_spawner: Spawner) {
21 config.parity = uarte::Parity::EXCLUDED; 19 config.parity = uarte::Parity::EXCLUDED;
22 config.baudrate = uarte::Baudrate::BAUD1M; 20 config.baudrate = uarte::Baudrate::BAUD1M;
23 21
24 let mut tx_buffer = [0u8; 1024]; 22 let mut tx_buffer = [0u8; 500];
25 let mut rx_buffer = [0u8; 1024]; 23 let mut rx_buffer = [0u8; 500];
26 24
27 let u = BufferedUarte::new( 25 let u = BufferedUarte::new(
28 p.UARTE0, 26 peri!(p, UART0),
29 p.TIMER0, 27 p.TIMER0,
30 p.PPI_CH0, 28 p.PPI_CH0,
31 p.PPI_CH1, 29 p.PPI_CH1,
32 p.PPI_GROUP0, 30 p.PPI_GROUP0,
33 Irqs, 31 irqs!(UART0_BUFFERED),
34 p.P1_03, 32 peri!(p, PIN_A),
35 p.P1_02, 33 peri!(p, PIN_B),
36 config.clone(), 34 config.clone(),
37 &mut rx_buffer, 35 &mut rx_buffer,
38 &mut tx_buffer, 36 &mut tx_buffer,
@@ -42,22 +40,22 @@ async fn main(_spawner: Spawner) {
42 40
43 let (mut rx, mut tx) = u.split(); 41 let (mut rx, mut tx) = u.split();
44 42
45 let mut buf = [0; 1024]; 43 let mut buf = [0; 500];
46 for (j, b) in buf.iter_mut().enumerate() { 44 for (j, b) in buf.iter_mut().enumerate() {
47 *b = j as u8; 45 *b = j as u8;
48 } 46 }
49 47
50 // Write 1024b. This causes the rx buffer to get exactly full. 48 // Write 500b. This causes the rx buffer to get exactly full.
51 unwrap!(tx.write_all(&buf).await); 49 unwrap!(tx.write_all(&buf).await);
52 unwrap!(tx.flush().await); 50 unwrap!(tx.flush().await);
53 51
54 // Read those 1024b. 52 // Read those 500b.
55 unwrap!(rx.read_exact(&mut buf).await); 53 unwrap!(rx.read_exact(&mut buf).await);
56 for (j, b) in buf.iter().enumerate() { 54 for (j, b) in buf.iter().enumerate() {
57 assert_eq!(*b, j as u8); 55 assert_eq!(*b, j as u8);
58 } 56 }
59 57
60 // The buffer should now be unclogged. Write 1024b again. 58 // The buffer should now be unclogged. Write 500b again.
61 unwrap!(tx.write_all(&buf).await); 59 unwrap!(tx.write_all(&buf).await);
62 unwrap!(tx.flush().await); 60 unwrap!(tx.flush().await);
63 61
diff --git a/tests/nrf/src/bin/buffered_uart_halves.rs b/tests/nrf/src/bin/buffered_uart_halves.rs
index ae1021f04..bdf5ad726 100644
--- a/tests/nrf/src/bin/buffered_uart_halves.rs
+++ b/tests/nrf/src/bin/buffered_uart_halves.rs
@@ -1,20 +1,17 @@
1// required-features: nrf52840 1// required-features: two-uarts
2#![no_std] 2#![no_std]
3#![no_main] 3#![no_main]
4teleprobe_meta::target!(b"nrf52840-dk"); 4
5#[path = "../common.rs"]
6mod common;
5 7
6use defmt::{assert_eq, *}; 8use defmt::{assert_eq, *};
7use embassy_executor::Spawner; 9use embassy_executor::Spawner;
8use embassy_futures::join::join; 10use embassy_futures::join::join;
9use embassy_nrf::buffered_uarte::{self, BufferedUarteRx, BufferedUarteTx}; 11use embassy_nrf::buffered_uarte::{self, BufferedUarteRx, BufferedUarteTx};
10use embassy_nrf::{bind_interrupts, peripherals, uarte}; 12use embassy_nrf::{peripherals, uarte};
11use {defmt_rtt as _, panic_probe as _}; 13use {defmt_rtt as _, panic_probe as _};
12 14
13bind_interrupts!(struct Irqs {
14 UARTE0_UART0 => buffered_uarte::InterruptHandler<peripherals::UARTE0>;
15 UARTE1 => buffered_uarte::InterruptHandler<peripherals::UARTE1>;
16});
17
18#[embassy_executor::main] 15#[embassy_executor::main]
19async fn main(_spawner: Spawner) { 16async fn main(_spawner: Spawner) {
20 let mut p = embassy_nrf::init(Default::default()); 17 let mut p = embassy_nrf::init(Default::default());
@@ -29,16 +26,22 @@ async fn main(_spawner: Spawner) {
29 for _ in 0..2 { 26 for _ in 0..2 {
30 const COUNT: usize = 40_000; 27 const COUNT: usize = 40_000;
31 28
32 let mut tx = BufferedUarteTx::new(&mut p.UARTE1, Irqs, &mut p.P1_02, config.clone(), &mut tx_buffer); 29 let mut tx = BufferedUarteTx::new(
30 &mut peri!(p, UART1),
31 irqs!(UART1_BUFFERED),
32 &mut peri!(p, PIN_A),
33 config.clone(),
34 &mut tx_buffer,
35 );
33 36
34 let mut rx = BufferedUarteRx::new( 37 let mut rx = BufferedUarteRx::new(
35 &mut p.UARTE0, 38 &mut peri!(p, UART0),
36 &mut p.TIMER0, 39 &mut p.TIMER0,
37 &mut p.PPI_CH0, 40 &mut p.PPI_CH0,
38 &mut p.PPI_CH1, 41 &mut p.PPI_CH1,
39 &mut p.PPI_GROUP0, 42 &mut p.PPI_GROUP0,
40 Irqs, 43 irqs!(UART0_BUFFERED),
41 &mut p.P1_03, 44 &mut peri!(p, PIN_B),
42 config.clone(), 45 config.clone(),
43 &mut rx_buffer, 46 &mut rx_buffer,
44 ); 47 );
diff --git a/tests/nrf/src/bin/buffered_uart_spam.rs b/tests/nrf/src/bin/buffered_uart_spam.rs
index 906723229..e8fca452e 100644
--- a/tests/nrf/src/bin/buffered_uart_spam.rs
+++ b/tests/nrf/src/bin/buffered_uart_spam.rs
@@ -1,26 +1,23 @@
1// required-features: nrf52840 1// required-features: two-uarts
2#![no_std] 2#![no_std]
3#![no_main] 3#![no_main]
4teleprobe_meta::target!(b"nrf52840-dk"); 4
5#[path = "../common.rs"]
6mod common;
5 7
6use core::mem; 8use core::mem;
7use core::ptr::NonNull; 9use core::ptr::NonNull;
8 10
9use defmt::{assert_eq, *}; 11use defmt::{assert_eq, *};
10use embassy_executor::Spawner; 12use embassy_executor::Spawner;
11use embassy_nrf::buffered_uarte::{self, BufferedUarte}; 13use embassy_nrf::buffered_uarte::{self, BufferedUarteRx};
12use embassy_nrf::gpio::{Level, Output, OutputDrive}; 14use embassy_nrf::gpio::{Level, Output, OutputDrive};
13use embassy_nrf::ppi::{Event, Ppi, Task}; 15use embassy_nrf::ppi::{Event, Ppi, Task};
14use embassy_nrf::uarte::Uarte; 16use embassy_nrf::uarte::UarteTx;
15use embassy_nrf::{bind_interrupts, pac, peripherals, uarte}; 17use embassy_nrf::{pac, peripherals, uarte};
16use embassy_time::Timer; 18use embassy_time::Timer;
17use {defmt_rtt as _, panic_probe as _}; 19use {defmt_rtt as _, panic_probe as _};
18 20
19bind_interrupts!(struct Irqs {
20 UARTE0_UART0 => buffered_uarte::InterruptHandler<peripherals::UARTE0>;
21 UARTE1 => uarte::InterruptHandler<peripherals::UARTE1>;
22});
23
24#[embassy_executor::main] 21#[embassy_executor::main]
25async fn main(_spawner: Spawner) { 22async fn main(_spawner: Spawner) {
26 let mut p = embassy_nrf::init(Default::default()); 23 let mut p = embassy_nrf::init(Default::default());
@@ -28,23 +25,20 @@ async fn main(_spawner: Spawner) {
28 config.parity = uarte::Parity::EXCLUDED; 25 config.parity = uarte::Parity::EXCLUDED;
29 config.baudrate = uarte::Baudrate::BAUD1M; 26 config.baudrate = uarte::Baudrate::BAUD1M;
30 27
31 let mut tx_buffer = [0u8; 1024];
32 let mut rx_buffer = [0u8; 1024]; 28 let mut rx_buffer = [0u8; 1024];
33 29
34 mem::forget(Output::new(&mut p.P1_02, Level::High, OutputDrive::Standard)); 30 mem::forget(Output::new(&mut peri!(p, PIN_A), Level::High, OutputDrive::Standard));
35 31
36 let mut u = BufferedUarte::new( 32 let mut u = BufferedUarteRx::new(
37 p.UARTE0, 33 peri!(p, UART0),
38 p.TIMER0, 34 p.TIMER0,
39 p.PPI_CH0, 35 p.PPI_CH0,
40 p.PPI_CH1, 36 p.PPI_CH1,
41 p.PPI_GROUP0, 37 p.PPI_GROUP0,
42 Irqs, 38 irqs!(UART0_BUFFERED),
43 p.P1_03, 39 peri!(p, PIN_B),
44 p.P1_04,
45 config.clone(), 40 config.clone(),
46 &mut rx_buffer, 41 &mut rx_buffer,
47 &mut tx_buffer,
48 ); 42 );
49 43
50 info!("uarte initialized!"); 44 info!("uarte initialized!");
@@ -55,7 +49,7 @@ async fn main(_spawner: Spawner) {
55 // Tx spam in a loop. 49 // Tx spam in a loop.
56 const NSPAM: usize = 17; 50 const NSPAM: usize = 17;
57 static mut TX_BUF: [u8; NSPAM] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]; 51 static mut TX_BUF: [u8; NSPAM] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16];
58 let _spam = Uarte::new(p.UARTE1, Irqs, p.P1_01, p.P1_02, config.clone()); 52 let _spam = UarteTx::new(peri!(p, UART1), irqs!(UART1), peri!(p, PIN_A), config.clone());
59 let spam_peri: pac::UARTE1 = unsafe { mem::transmute(()) }; 53 let spam_peri: pac::UARTE1 = unsafe { mem::transmute(()) };
60 let event = unsafe { Event::new_unchecked(NonNull::new_unchecked(&spam_peri.events_endtx as *const _ as _)) }; 54 let event = unsafe { Event::new_unchecked(NonNull::new_unchecked(&spam_peri.events_endtx as *const _ as _)) };
61 let task = unsafe { Task::new_unchecked(NonNull::new_unchecked(&spam_peri.tasks_starttx as *const _ as _)) }; 55 let task = unsafe { Task::new_unchecked(NonNull::new_unchecked(&spam_peri.tasks_starttx as *const _ as _)) };
diff --git a/tests/nrf/src/common.rs b/tests/nrf/src/common.rs
index 79336c5de..ff5299b0f 100644
--- a/tests/nrf/src/common.rs
+++ b/tests/nrf/src/common.rs
@@ -50,16 +50,53 @@ macro_rules! define_peris {
50define_peris!(PIN_A = P0_13, PIN_B = P0_14,); 50define_peris!(PIN_A = P0_13, PIN_B = P0_14,);
51 51
52#[cfg(feature = "nrf52832")] 52#[cfg(feature = "nrf52832")]
53define_peris!(PIN_A = P0_11, PIN_B = P0_12,); 53define_peris!(
54 PIN_A = P0_11, PIN_B = P0_12,
55 UART0 = UARTE0,
56 @irq UART0 = {UARTE0_UART0 => uarte::InterruptHandler<peripherals::UARTE0>;},
57 @irq UART0_BUFFERED = {UARTE0_UART0 => buffered_uarte::InterruptHandler<peripherals::UARTE0>;},
58);
54 59
55#[cfg(feature = "nrf52833")] 60#[cfg(feature = "nrf52833")]
56define_peris!(PIN_A = P1_01, PIN_B = P1_02,); 61define_peris!(
62 PIN_A = P1_01, PIN_B = P1_02,
63 UART0 = UARTE0,
64 UART1 = UARTE1,
65 @irq UART0 = {UARTE0_UART0 => uarte::InterruptHandler<peripherals::UARTE0>;},
66 @irq UART1 = {UARTE1 => uarte::InterruptHandler<peripherals::UARTE1>;},
67 @irq UART0_BUFFERED = {UARTE0_UART0 => buffered_uarte::InterruptHandler<peripherals::UARTE0>;},
68 @irq UART1_BUFFERED = {UARTE1 => buffered_uarte::InterruptHandler<peripherals::UARTE1>;},
69);
57 70
58#[cfg(feature = "nrf52840")] 71#[cfg(feature = "nrf52840")]
59define_peris!(PIN_A = P1_02, PIN_B = P1_03,); 72define_peris!(
73 PIN_A = P1_02, PIN_B = P1_03,
74 UART0 = UARTE0,
75 UART1 = UARTE1,
76 @irq UART0 = {UARTE0_UART0 => uarte::InterruptHandler<peripherals::UARTE0>;},
77 @irq UART1 = {UARTE1 => uarte::InterruptHandler<peripherals::UARTE1>;},
78 @irq UART0_BUFFERED = {UARTE0_UART0 => buffered_uarte::InterruptHandler<peripherals::UARTE0>;},
79 @irq UART1_BUFFERED = {UARTE1 => buffered_uarte::InterruptHandler<peripherals::UARTE1>;},
80);
60 81
61#[cfg(feature = "nrf5340")] 82#[cfg(feature = "nrf5340")]
62define_peris!(PIN_A = P1_00, PIN_B = P1_01,); 83define_peris!(
84 PIN_A = P1_08, PIN_B = P1_09,
85 UART0 = SERIAL0,
86 UART1 = SERIAL1,
87 @irq UART0 = {SERIAL0 => uarte::InterruptHandler<peripherals::SERIAL0>;},
88 @irq UART1 = {SERIAL1 => uarte::InterruptHandler<peripherals::SERIAL1>;},
89 @irq UART0_BUFFERED = {SERIAL0 => buffered_uarte::InterruptHandler<peripherals::SERIAL0>;},
90 @irq UART1_BUFFERED = {SERIAL1 => buffered_uarte::InterruptHandler<peripherals::SERIAL1>;},
91);
63 92
64#[cfg(feature = "nrf9160")] 93#[cfg(feature = "nrf9160")]
65define_peris!(PIN_A = P0_00, PIN_B = P0_01,); 94define_peris!(
95 PIN_A = P0_00, PIN_B = P0_01,
96 UART0 = SERIAL0,
97 UART1 = SERIAL1,
98 @irq UART0 = {UARTE0_SPIM0_SPIS0_TWIM0_TWIS0 => uarte::InterruptHandler<peripherals::SERIAL0>;},
99 @irq UART1 = {UARTE1_SPIM1_SPIS1_TWIM1_TWIS1 => uarte::InterruptHandler<peripherals::SERIAL1>;},
100 @irq UART0_BUFFERED = {UARTE0_SPIM0_SPIS0_TWIM0_TWIS0 => buffered_uarte::InterruptHandler<peripherals::SERIAL0>;},
101 @irq UART1_BUFFERED = {UARTE1_SPIM1_SPIS1_TWIM1_TWIS1 => buffered_uarte::InterruptHandler<peripherals::SERIAL1>;},
102);