diff --git a/Client/Cargo.lock b/Client/Cargo.lock new file mode 100644 index 0000000000000000000000000000000000000000..03c1e8a6b38945905abdd459215a129ce8bd5f45 --- /dev/null +++ b/Client/Cargo.lock @@ -0,0 +1,358 @@ +[[package]] +name = "D7018E_Embedded_CoAp_client" +version = "0.1.0" +dependencies = [ + "coap 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "bincode" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "byteorder 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "bitflags" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "bitflags" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "byteorder" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "bytes" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "cfg-if" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "coap" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bincode 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "enum_primitive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "num 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", + "threadpool 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "url 0.2.38 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "enum_primitive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "fuchsia-zircon" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "fuchsia-zircon-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "fuchsia-zircon-sys" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "kernel32-sys" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "libc" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "log" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "log 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "log" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "matches" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "mio" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "miow 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "net2 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)", + "nix 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "miow" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "net2 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "net2" +version = "0.2.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "nix" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bitflags 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "num" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "num-bigint 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", + "num-complex 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", + "num-integer 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", + "num-iter 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)", + "num-rational 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "num-bigint" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "num-integer 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "num-complex" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "num-integer" +version = "0.1.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "num-iter" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "num-integer 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "num-rational" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "num-bigint 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", + "num-integer 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "num-traits" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "num_cpus" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rand" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "fuchsia-zircon 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "redox_syscall" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "rustc-serialize" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "slab" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "threadpool" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "num_cpus 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "time" +version = "0.1.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "url" +version = "0.2.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", + "uuid 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "uuid" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rand 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "winapi" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "winapi-build" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "ws2_32-sys" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[metadata] +"checksum bincode 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "951498c868b0683e1ba67afcdd6b1c3def08a713e66197aa17be8fad56cbaab5" +"checksum bitflags 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8dead7461c1127cf637931a1e50934eb6eee8bff2f74433ac7909e9afcee04a3" +"checksum bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aad18937a628ec6abcd26d1489012cc0e18c21798210f491af69ded9b881106d" +"checksum byteorder 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)" = "29b2aa490a8f546381308d68fc79e6bd753cd3ad839f7a7172897f1feedfa175" +"checksum bytes 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c129aff112dcc562970abb69e2508b40850dd24c274761bb50fb8a0067ba6c27" +"checksum cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c819a1287eb618df47cc647173c5c4c66ba19d888a6e50d605672aed3140de" +"checksum coap 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "24c47dfbaf87a9a060aaa412b4af7852f512737f7bea3db50efcf035bb937e8f" +"checksum enum_primitive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "be4551092f4d519593039259a9ed8daedf0da12e5109c5280338073eaeb81180" +"checksum fuchsia-zircon 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f6c0581a4e363262e52b87f59ee2afe3415361c6ec35e665924eb08afe8ff159" +"checksum fuchsia-zircon-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "43f3795b4bae048dc6123a6b972cadde2e676f9ded08aef6bb77f5f157684a82" +"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" +"checksum libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)" = "36fbc8a8929c632868295d0178dd8f63fc423fd7537ad0738372bd010b3ac9b0" +"checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" +"checksum log 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b3a89a0c46ba789b8a247d4c567aed4d7c68e624672d238b45cc3ec20dc9f940" +"checksum matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "100aabe6b8ff4e4a7e32c1c13523379802df0772b82466207ac25b013f193376" +"checksum mio 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a637d1ca14eacae06296a008fa7ad955347e34efcb5891cfd8ba05491a37907e" +"checksum miow 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "3e690c5df6b2f60acd45d56378981e827ff8295562fc8d34f573deb267a59cd1" +"checksum net2 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)" = "3a80f842784ef6c9a958b68b7516bc7e35883c614004dd94959a4dca1b716c09" +"checksum nix 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bfb3ddedaa14746434a02041940495bf11325c22f6d36125d3bdd56090d50a79" +"checksum num 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "cc4083e14b542ea3eb9b5f33ff48bd373a92d78687e74f4cc0a30caeb754f0ca" +"checksum num-bigint 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "bdc1494b5912f088f260b775799468d9b9209ac60885d8186a547a0476289e23" +"checksum num-complex 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "58de7b4bf7cf5dbecb635a5797d489864eadd03b107930cbccf9e0fd7428b47c" +"checksum num-integer 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)" = "d1452e8b06e448a07f0e6ebb0bb1d92b8890eea63288c0b627331d53514d0fba" +"checksum num-iter 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)" = "7485fcc84f85b4ecd0ea527b14189281cf27d60e583ae65ebc9c088b13dffe01" +"checksum num-rational 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "0c7cb72a95250d8a370105c828f388932373e0e94414919891a0f945222310fe" +"checksum num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "cacfcab5eb48250ee7d0c7896b51a2c5eec99c1feea5f32025635f5ae4b00070" +"checksum num_cpus 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "514f0d73e64be53ff320680ca671b64fe3fb91da01e1ae2ddc99eb51d453b20d" +"checksum rand 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)" = "6475140dfd8655aeb72e1fd4b7a1cc1c202be65d71669476e392fe62532b9edd" +"checksum redox_syscall 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)" = "ab105df655884ede59d45b7070c8a65002d921461ee813a024558ca16030eea0" +"checksum rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)" = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda" +"checksum slab 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d807fd58c4181bbabed77cb3b891ba9748241a552bcc5be698faaebefc54f46e" +"checksum threadpool 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e2f0c90a5f3459330ac8bc0d2f879c693bb7a2f59689c1083fc4ef83834da865" +"checksum time 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)" = "d5d788d3aa77bc0ef3e9621256885555368b47bd495c13dd2e7413c89f845520" +"checksum url 0.2.38 (registry+https://github.com/rust-lang/crates.io-index)" = "cbaa8377a162d88e7d15db0cf110c8523453edcbc5bc66d2b6fffccffa34a068" +"checksum uuid 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)" = "78c590b5bd79ed10aad8fb75f078a59d8db445af6c743e55c4a53227fc01c13f" +"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" +"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" +"checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" diff --git a/Client/Cargo.toml b/Client/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..f5fd1251817423cd7f61c16e2803cdeee3e89b87 --- /dev/null +++ b/Client/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "D7018E_Embedded_CoAp_client" +version = "0.1.0" +authors = ["Joakim Lundberg <joakim@joakimlundberg.com>"] + +[dependencies] +coap = "0.5" \ No newline at end of file diff --git a/Client/src/main.rs b/Client/src/main.rs new file mode 100644 index 0000000000000000000000000000000000000000..98e1b0df836394e5bee1a668c924c27b75924de9 --- /dev/null +++ b/Client/src/main.rs @@ -0,0 +1,79 @@ +// CoAP CLient +// D7018E - Embedded rust +// Joakim Lundberg <joakim@joakimlundberg.com> + +// Externally used crates +extern crate coap; + +use std::io::ErrorKind; +use coap::{CoAPClient, CoAPRequest, IsMessage, MessageType, CoAPOption}; + +fn main() { + println!("Request by GET:"); + let addr = "127.0.0.1:5683"; + let endpoint = "test"; + + coap_get(addr, endpoint); + + println!("Request by POST:"); + coap_post(addr, endpoint); +} + + +fn coap_get(address: &str, endpoint: &str) { + + let client = CoAPClient::new(address).unwrap(); + let mut request = CoAPRequest::new(); + request.set_version(1); + request.set_type(MessageType::Confirmable); + request.set_code("0.01"); + request.set_message_id(1); + request.set_token(vec![0x51, 0x55, 0x77, 0xE8]); + request.add_option(CoAPOption::UriPath, endpoint.to_string().into_bytes()); + client.send(&request).unwrap(); + println!("Client request: coap://{}/{}", address, endpoint); + + match client.receive() { + Ok(response) => { + println!("Server reply: {}", + String::from_utf8(response.message.payload).unwrap()); + } + Err(e) => { + match e.kind() { + ErrorKind::WouldBlock => println!("Request timeout"), // Unix + ErrorKind::TimedOut => println!("Request timeout"), // Windows + _ => println!("Request error: {:?}", e), + } + } + } +} + +fn coap_post(address: &str, endpoint: &str) { + + let client = CoAPClient::new(address).unwrap(); + let mut request = CoAPRequest::new(); + request.set_version(1); + request.set_type(MessageType::Confirmable); + request.set_code("0.02"); + request.set_message_id(1); + request.set_token(vec![0x51, 0x55, 0x77, 0xE8]); + request.add_option(CoAPOption::UriPath, endpoint.to_string().into_bytes()); + request.set_payload(b"data".to_vec()); + + client.send(&request).unwrap(); + println!("Client request: coap://{}/{}", address, endpoint); + + match client.receive() { + Ok(response) => { + println!("Server reply: {}", + String::from_utf8(response.message.payload).unwrap()); + } + Err(e) => { + match e.kind() { + ErrorKind::WouldBlock => println!("Request timeout"), // Unix + ErrorKind::TimedOut => println!("Request timeout"), // Windows + _ => println!("Request error: {:?}", e), + } + } + } +} \ No newline at end of file diff --git a/Server/Cargo.lock b/Server/Cargo.lock new file mode 100644 index 0000000000000000000000000000000000000000..a84a481e8dd3a379f0391e937380d382c1d1cfda --- /dev/null +++ b/Server/Cargo.lock @@ -0,0 +1,358 @@ +[[package]] +name = "D7018E_CoAp_server" +version = "0.1.0" +dependencies = [ + "coap 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "bincode" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "byteorder 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "bitflags" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "bitflags" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "byteorder" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "bytes" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "cfg-if" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "coap" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bincode 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "enum_primitive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "num 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", + "threadpool 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "url 0.2.38 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "enum_primitive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "fuchsia-zircon" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "fuchsia-zircon-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "fuchsia-zircon-sys" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "kernel32-sys" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "libc" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "log" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "log 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "log" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "matches" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "mio" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "miow 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "net2 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)", + "nix 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "miow" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "net2 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "net2" +version = "0.2.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "nix" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bitflags 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "num" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "num-bigint 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", + "num-complex 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", + "num-integer 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", + "num-iter 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)", + "num-rational 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "num-bigint" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "num-integer 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "num-complex" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "num-integer" +version = "0.1.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "num-iter" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "num-integer 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "num-rational" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "num-bigint 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", + "num-integer 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "num-traits" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "num_cpus" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rand" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "fuchsia-zircon 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "redox_syscall" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "rustc-serialize" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "slab" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "threadpool" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "num_cpus 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "time" +version = "0.1.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "url" +version = "0.2.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", + "uuid 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "uuid" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rand 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "winapi" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "winapi-build" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "ws2_32-sys" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[metadata] +"checksum bincode 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "951498c868b0683e1ba67afcdd6b1c3def08a713e66197aa17be8fad56cbaab5" +"checksum bitflags 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8dead7461c1127cf637931a1e50934eb6eee8bff2f74433ac7909e9afcee04a3" +"checksum bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aad18937a628ec6abcd26d1489012cc0e18c21798210f491af69ded9b881106d" +"checksum byteorder 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)" = "29b2aa490a8f546381308d68fc79e6bd753cd3ad839f7a7172897f1feedfa175" +"checksum bytes 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c129aff112dcc562970abb69e2508b40850dd24c274761bb50fb8a0067ba6c27" +"checksum cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c819a1287eb618df47cc647173c5c4c66ba19d888a6e50d605672aed3140de" +"checksum coap 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "24c47dfbaf87a9a060aaa412b4af7852f512737f7bea3db50efcf035bb937e8f" +"checksum enum_primitive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "be4551092f4d519593039259a9ed8daedf0da12e5109c5280338073eaeb81180" +"checksum fuchsia-zircon 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f6c0581a4e363262e52b87f59ee2afe3415361c6ec35e665924eb08afe8ff159" +"checksum fuchsia-zircon-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "43f3795b4bae048dc6123a6b972cadde2e676f9ded08aef6bb77f5f157684a82" +"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" +"checksum libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)" = "36fbc8a8929c632868295d0178dd8f63fc423fd7537ad0738372bd010b3ac9b0" +"checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" +"checksum log 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b3a89a0c46ba789b8a247d4c567aed4d7c68e624672d238b45cc3ec20dc9f940" +"checksum matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "100aabe6b8ff4e4a7e32c1c13523379802df0772b82466207ac25b013f193376" +"checksum mio 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a637d1ca14eacae06296a008fa7ad955347e34efcb5891cfd8ba05491a37907e" +"checksum miow 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "3e690c5df6b2f60acd45d56378981e827ff8295562fc8d34f573deb267a59cd1" +"checksum net2 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)" = "3a80f842784ef6c9a958b68b7516bc7e35883c614004dd94959a4dca1b716c09" +"checksum nix 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bfb3ddedaa14746434a02041940495bf11325c22f6d36125d3bdd56090d50a79" +"checksum num 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "cc4083e14b542ea3eb9b5f33ff48bd373a92d78687e74f4cc0a30caeb754f0ca" +"checksum num-bigint 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "bdc1494b5912f088f260b775799468d9b9209ac60885d8186a547a0476289e23" +"checksum num-complex 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "58de7b4bf7cf5dbecb635a5797d489864eadd03b107930cbccf9e0fd7428b47c" +"checksum num-integer 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)" = "d1452e8b06e448a07f0e6ebb0bb1d92b8890eea63288c0b627331d53514d0fba" +"checksum num-iter 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)" = "7485fcc84f85b4ecd0ea527b14189281cf27d60e583ae65ebc9c088b13dffe01" +"checksum num-rational 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "0c7cb72a95250d8a370105c828f388932373e0e94414919891a0f945222310fe" +"checksum num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "cacfcab5eb48250ee7d0c7896b51a2c5eec99c1feea5f32025635f5ae4b00070" +"checksum num_cpus 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "514f0d73e64be53ff320680ca671b64fe3fb91da01e1ae2ddc99eb51d453b20d" +"checksum rand 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)" = "6475140dfd8655aeb72e1fd4b7a1cc1c202be65d71669476e392fe62532b9edd" +"checksum redox_syscall 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)" = "ab105df655884ede59d45b7070c8a65002d921461ee813a024558ca16030eea0" +"checksum rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)" = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda" +"checksum slab 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d807fd58c4181bbabed77cb3b891ba9748241a552bcc5be698faaebefc54f46e" +"checksum threadpool 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e2f0c90a5f3459330ac8bc0d2f879c693bb7a2f59689c1083fc4ef83834da865" +"checksum time 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)" = "d5d788d3aa77bc0ef3e9621256885555368b47bd495c13dd2e7413c89f845520" +"checksum url 0.2.38 (registry+https://github.com/rust-lang/crates.io-index)" = "cbaa8377a162d88e7d15db0cf110c8523453edcbc5bc66d2b6fffccffa34a068" +"checksum uuid 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)" = "78c590b5bd79ed10aad8fb75f078a59d8db445af6c743e55c4a53227fc01c13f" +"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" +"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" +"checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" diff --git a/Server/Cargo.toml b/Server/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..e178afb295219df8b49e402d2b1429cd0bd8c8ea --- /dev/null +++ b/Server/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "D7018E_CoAp_server" +version = "0.1.0" +authors = ["Joakim Lundberg <joakim@joakimlundberg.com>"] + +[dependencies] +coap = "0.5" \ No newline at end of file diff --git a/Server/src/main.rs b/Server/src/main.rs new file mode 100644 index 0000000000000000000000000000000000000000..ebfe6e22cce263e5cf0025105417dde51d3a818c --- /dev/null +++ b/Server/src/main.rs @@ -0,0 +1,47 @@ +// CoAP Server +// D7018E - Embedded rust +// Joakim Lundberg <joakim@joakimlundberg.com> + +extern crate coap; + +use std::io; +use coap::{CoAPServer, CoAPResponse, CoAPRequest, IsMessage}; + +fn request_handler(request: CoAPRequest) -> Option<CoAPResponse> { + let request_code = request.get_code(); + + match request_code.as_ref() { + "0.01" => { + println!("request by get"); + }, + "0.02" => { + println!("request by post"); + println!("request body: {}", String::from_utf8(request.message.payload).unwrap()); + }, + _ => { + println!("request by other method {}", request_code); + } + }; + + return match request.response { + Some(mut message) => { + message.set_payload(b"OK".to_vec()); + Some(message) + }, + _ => None + }; +} + +fn main() { + let addr = "127.0.0.1:5683"; + + let mut server = CoAPServer::new(addr).unwrap(); + server.handle(request_handler).unwrap(); + + println!("Server up on {}", addr); + println!("Press any key to stop..."); + + io::stdin().read_line(&mut String::new()).unwrap(); + + println!("Server shutdown"); +} \ No newline at end of file diff --git a/course_description/LTU_logo.png b/course_description/LTU_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..dddc5213ac5959727b7a41616b1df8a93385ff25 Binary files /dev/null and b/course_description/LTU_logo.png differ diff --git a/course_description/Sections/Introduction.tex b/course_description/Sections/Introduction.tex new file mode 100644 index 0000000000000000000000000000000000000000..2e6d400fb557cd9c433c52145f6cc6403c35de6a --- /dev/null +++ b/course_description/Sections/Introduction.tex @@ -0,0 +1,29 @@ +\newpage +%\setcounter{page}{1} +\section*{Course description} + +To create a wireless embedded hardware bridge using \emph{RUST} to read and collect sensory information through a serial protocol and relay the data via CoAP to a server for filtering and displaying of the data. + +\section*{Relevant information} +System that will be used is a \emph{Nucleo-64} with an \emph{STM32F401} ARM microcontroller. \\ +Some of the crates that might be used are +\begin{itemize} +\item \href{https://crates.io/crates/coap}{coap} +\item \href{https://crates.io/crates/smoltcp}{smoltcp} +\item \href{https://crates.io/crates/cortex-m}{cortex-m} +\end{itemize} +as well as crates and/or code developed by other course participants. + +\section*{Grading} + +\subsection*{Grade 3} +Local readout of data and storage on the embedded system.\\ +Embedded system to server communication using CoAP. + +\subsection*{Grade 4} +Create an API-design for talking CoAP with a server along with documentation.\\ +Making the embedded side wireless through use of WiFi communication. + +\subsection*{Grade 5} +Implementing the API designed for CoAP. \\ +Creating examples for the API for CoAP. \ No newline at end of file diff --git a/course_description/logo.jpg b/course_description/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..caf97de9005a626b57fb49dd6bef84a9b6c92ac5 Binary files /dev/null and b/course_description/logo.jpg differ diff --git a/course_description/main.tex b/course_description/main.tex new file mode 100644 index 0000000000000000000000000000000000000000..a88fca34d4732cd3e5d8f3ebe191f6427de6988c --- /dev/null +++ b/course_description/main.tex @@ -0,0 +1,129 @@ + +\documentclass[12pt,a4paper,english,titlepage,oneside]{article} +\usepackage[utf8]{inputenc} +\usepackage[margin=2.5cm]{geometry} +\usepackage{color} +\usepackage[english]{babel} +\usepackage{graphicx} +\setlength\parindent{0pt} +\usepackage{makeidx} +\usepackage{amsmath} +\usepackage{amssymb} +\usepackage{parskip} +\usepackage{amsthm} +\usepackage[nottoc,notlot,notlof]{tocbibind} +\usepackage{url} +\usepackage{hyperref} +\newcommand{\rework}[1]{\todo[color=yellow,inline]{#1}} +\usepackage{epstopdf} +%\setlength{\parindent}{0cm} +\usepackage{graphicx} +\usepackage{wrapfig} +\usepackage{fancyhdr} + +\hypersetup{ + colorlinks=true, + linkcolor=black, + filecolor=magenta, + urlcolor=cyan, +} + + +\pagestyle{fancy} +\fancyhf{} +\setlength\headheight{2.5cm} +\textheight = 610pt + +\renewcommand{\headrulewidth}{1pt} +\renewcommand{\footrulewidth}{1pt} + +\fancyfoot[C]{\textbf{ \thepage}} +\lhead{Luleå Tekniska Universitet \\D7018E} +\rhead{\includegraphics[width=1.8cm]{LTU_logo}} + +%\renewcommand{\abstractname}{Sammanfattning} +%\renewcommand{\contentsname}{Innehållsförteckning} +%\renewcommand{\tablename}{Tabell} +%\renewcommand{\figurename}{Figur} + +%---------------------------------------------------------------------------------------- +% TITLE AND AUTHOR +%---------------------------------------------------------------------------------------- + +\title{RAPPORT} +\author{Joakim Lundberg\\ LUNJOK-3 } + +\begin{document} +\begin{titlepage} + +\newcommand{\HRule}{\rule{\linewidth}{0.5mm}} % Defines a new command for the horizontal lines, change thickness here + +\center % Center everything on the page + +%---------------------------------------------------------------------------------------- +% HEADING SECTIONS +%---------------------------------------------------------------------------------------- + +\textsc{\huge Luleå Tekniska Universitet}\\[1cm] % Name of your university/college +\textsc{\large D7018E - Special studies in embedded systems}\\[0.3cm] % Major heading such as course name +\textsc{\large COURSE SPECIFICATION}\\[0.4cm] % Minor heading such as course title + +%---------------------------------------------------------------------------------------- +% TITLE SECTION +%---------------------------------------------------------------------------------------- + +\HRule \\[0.6cm] +{ \huge \bfseries Embedded hardware bridge}\\[0.25cm] % Title of your document +\HRule \\[2.5cm] + +%---------------------------------------------------------------------------------------- +% AUTHOR SECTION +%---------------------------------------------------------------------------------------- + + +\begin{minipage}{0.3\textwidth} +\begin{flushleft} \large +\emph{}\\ +Joakim Lundberg \\ +\end{flushleft} +\end{minipage} +~ +\begin{minipage}{0.38\textwidth} +\begin{flushleft} \large +\emph{} \\ +\texttt{891019-8954} +\end{flushleft} +\texttt{lunjok-3@student.ltu.se} +\end{minipage}\\[8.0cm] + +%---------------------------------------------------------------------------------------- +% LOGO SECTION +%---------------------------------------------------------------------------------------- + +\includegraphics[scale=0.20]{logo.jpg}\\[0.5cm] + +{\large \today} +\vfill + +\end{titlepage} + +%----------------------------------------------------------------------- +% Innehållsförteckning, ändra ej. +%----------------------------------------------------------------------- +\pagenumbering{gobble} +%\setlength{\parskip}{12pt} +%\thispagestyle{empty} +%\tableofcontents + +%----------------------------------------------------------------------- +% INCLUDE SECTIONS +%----------------------------------------------------------------------- +%\pagenumbering{arabic} +\input{Sections/Introduction} +\newpage + +\pagestyle{empty} +\textheight = 630pt +\setlength\headheight{1pt} + +\end{document} \ No newline at end of file diff --git a/course_description/parskip.sty b/course_description/parskip.sty new file mode 100644 index 0000000000000000000000000000000000000000..c5ca57683499a427154e1cf843f3c37a5b35a312 --- /dev/null +++ b/course_description/parskip.sty @@ -0,0 +1,87 @@ +% parskip.sty; last edited by Robin Fairbairns (rf10@cam.ac.uk), +% derived from: +% +% This is PARSKIP.STY by H.Partl, TU Wien, as of 19 Jan 1989. +% +% Package to be used with any document class at any size. +% It produces the following Paragraph Layout: +% Zero Parindent and non-zero Parskip. The stretchable glue in \parskip +% helps LaTeX in finding the best place for page breaks. +% +% This package is no more than quick fix; the `proper' way to achieve +% effects as far-reaching as this is to create a new class. An +% example class is to be found in the ntgclass set: artikel3.cls + +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{parskip}[2001/04/09 non-zero parskip adjustments] + +\parskip=0.5\baselineskip \advance\parskip by 0pt plus 2pt +\parindent=\z@ + +% +% from a suggestion by Donald Arseneau on comp.text.tex: + +\DeclareOption{parfill}{\setlength{\parfillskip}{30\p@ \@plus 1fil}} +\ProcessOptions + +% To accompany this, the vertical spacing in the list environments is changed +% to use the same as \parskip in all relevant places (for normalsize only): +% \parsep = \parskip +% \itemsep = \z@ % add nothing to \parskip between items +% \topsep = \z@ % add nothing to \parskip before first item + +\def\@listI{\leftmargin\leftmargini + \topsep\z@ \parsep\parskip \itemsep\z@} +\let\@listi\@listI +\@listi + +\def\@listii{\leftmargin\leftmarginii + \labelwidth\leftmarginii\advance\labelwidth-\labelsep + \topsep\z@ \parsep\parskip \itemsep\z@} + +\def\@listiii{\leftmargin\leftmarginiii + \labelwidth\leftmarginiii\advance\labelwidth-\labelsep + \topsep\z@ \parsep\parskip \itemsep\z@} + +% and, now... +% \partopsep = \z@ % don't even add anything before first item (beyond +% % \parskip) even if the list is preceded by a blank line +\partopsep=\z@ + +% Note that listiv, listv and listvi don't change vertical parameters. + +% deal with a problem raised on comp.text.tex in april 2001 +% +% don't expand the table of contents any further +% +% first: check that the definition of \@starttoc is unchanged from +% that in latex.ltx +\@ifundefined{CheckCommand}{}{% + \CheckCommand*{\@starttoc}[1]{% + \begingroup + \makeatletter + \@input{\jobname.#1}% + \if@filesw + \expandafter\newwrite\csname tf@#1\endcsname + \immediate\openout \csname tf@#1\endcsname \jobname.#1\relax + \fi + \@nobreakfalse + \endgroup}} +% +% now having generated any warning that might help, redefine +\renewcommand*{\@starttoc}[1]{% + \begingroup + \makeatletter + \parskip\z@ + \@input{\jobname.#1}% + \if@filesw + \expandafter\newwrite\csname tf@#1\endcsname + \immediate\openout \csname tf@#1\endcsname \jobname.#1\relax + \fi + \@nobreakfalse + \endgroup +} + +\endinput + + diff --git a/course_description/swedish.ldf b/course_description/swedish.ldf new file mode 100644 index 0000000000000000000000000000000000000000..c54f211561956d7d50769ddd55a6939083de9cd7 --- /dev/null +++ b/course_description/swedish.ldf @@ -0,0 +1,141 @@ +%% +%% This is file `swedish.ldf', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% swedish.dtx (with options: `code') +%% +%% This is a generated file. +%% +%% Copyright 1989-2001 Johannes L. Braams and any individual authors +%% listed elsewhere in this file. All rights reserved. +%% +%% This file is part of the Babel system release 3.7. +%% -------------------------------------------------- +%% +%% It may be distributed under the terms of the LaTeX Project Public +%% License, as described in lppl.txt in the base LaTeX distribution. +%% Either version 1.2 or, at your option, any later version. +\ProvidesLanguage{swedish} + [2001/03/12 v2.3c Swedish support from the babel system] +%% File `swedish.dtx' +%% Babel package for LaTeX version 2e +%% Copyright (C) 1989 - 2001 +%% by Johannes Braams, TeXniek +%% Please report errors to: J.L. Braams +%% babel@braams.cistron.nl +\LdfInit{swedish}\captionsswedish +\ifx\l@swedish\@undefined + \@nopatterns{Swedish} + \adddialect\l@swedish0\fi +\addto\captionsswedish{% + \def\prefacename{F\"orord}% + \def\refname{Referenser}% + \def\abstractname{Sammanfattning}% + \def\bibname{Litteraturf\"orteckning}% + \def\chaptername{Kapitel}% + \def\appendixname{Bilaga}% + \def\contentsname{Inneh\csname aa\endcsname ll}% + \def\listfigurename{Figurer}% + \def\listtablename{Tabeller}% + \def\indexname{Sakregister}% + \def\figurename{Figur}% + \def\tablename{Tabell}% + \def\partname{Del}% + \def\enclname{Bil.}% + \def\ccname{Kopia f\"or k\"annedom}% + \def\headtoname{Till}% in letter + \def\pagename{Sida}% + \def\seename{se}% + \def\alsoname{se \"aven}% + \def\proofname{Bevis}% + \def\glossaryname{Ordlista}% + }% +\def\dateswedish{% + \def\today{% + \number\day~\ifcase\month\or + januari\or februari\or mars\or april\or maj\or juni\or + juli\or augusti\or september\or oktober\or november\or + december\fi + \space\number\year}} +\def\datesymd{% + \def\today{\number\year-\two@digits\month-\two@digits\day}% + } +\def\datesdmy{% + \def\today{\number\day/\number\month\space\number\year}% + } +\providehyphenmins{swedish}{\tw@\tw@} +\addto\extrasswedish{\bbl@frenchspacing} +\addto\noextrasswedish{\bbl@nonfrenchspacing} +\initiate@active@char{"} +\addto\extrasswedish{\languageshorthands{swedish}} +\addto\extrasswedish{\bbl@activate{"}} +\addto\noextrasswedish{\bbl@deactivate{"}} +\addto\extrasswedish{\babel@save\"\umlautlow} +\addto\noextrasswedish{\umlauthigh} +\begingroup \catcode`\"12 +\def\x{\endgroup + \def\@SS{\mathchar"7019 } + \def\dq{"}} +\x +\declare@shorthand{swedish}{"w}{\textormath{{\aa}\allowhyphens}{\ddot w}} +\declare@shorthand{swedish}{"a}{\textormath{\"{a}\allowhyphens}{\ddot a}} +\declare@shorthand{swedish}{"o}{\textormath{\"{o}\allowhyphens}{\ddot o}} +\declare@shorthand{swedish}{"W}{\textormath{{\AA}\allowhyphens}{\ddot W}} +\declare@shorthand{swedish}{"A}{\textormath{\"{A}\allowhyphens}{\ddot A}} +\declare@shorthand{swedish}{"O}{\textormath{\"{O}\allowhyphens}{\ddot O}} +\declare@shorthand{swedish}{"b}{\textormath{\bbl@disc b{bb}}{b}} +\declare@shorthand{swedish}{"B}{\textormath{\bbl@disc B{BB}}{B}} +\declare@shorthand{swedish}{"d}{\textormath{\bbl@disc d{dd}}{d}} +\declare@shorthand{swedish}{"D}{\textormath{\bbl@disc D{DD}}{D}} +\declare@shorthand{swedish}{"f}{\textormath{\bbl@disc f{ff}}{f}} +\declare@shorthand{swedish}{"F}{\textormath{\bbl@disc F{FF}}{F}} +\declare@shorthand{swedish}{"g}{\textormath{\bbl@disc g{gg}}{g}} +\declare@shorthand{swedish}{"G}{\textormath{\bbl@disc G{GG}}{G}} +\declare@shorthand{swedish}{"l}{\textormath{\bbl@disc l{ll}}{l}} +\declare@shorthand{swedish}{"L}{\textormath{\bbl@disc L{LL}}{L}} +\declare@shorthand{swedish}{"m}{\textormath{\bbl@disc m{mm}}{m}} +\declare@shorthand{swedish}{"M}{\textormath{\bbl@disc M{MM}}{M}} +\declare@shorthand{swedish}{"n}{\textormath{\bbl@disc n{nn}}{n}} +\declare@shorthand{swedish}{"N}{\textormath{\bbl@disc N{NN}}{N}} +\declare@shorthand{swedish}{"p}{\textormath{\bbl@disc p{pp}}{p}} +\declare@shorthand{swedish}{"P}{\textormath{\bbl@disc P{PP}}{P}} +\declare@shorthand{swedish}{"r}{\textormath{\bbl@disc r{rr}}{r}} +\declare@shorthand{swedish}{"R}{\textormath{\bbl@disc R{RR}}{R}} +\declare@shorthand{swedish}{"s}{\textormath{\bbl@disc s{ss}}{s}} +\declare@shorthand{swedish}{"S}{\textormath{\bbl@disc S{SS}}{S}} +\declare@shorthand{swedish}{"t}{\textormath{\bbl@disc t{tt}}{t}} +\declare@shorthand{swedish}{"T}{\textormath{\bbl@disc T{TT}}{T}} +\declare@shorthand{swedish}{"-}{\nobreak-\bbl@allowhyphens} +\declare@shorthand{swedish}{"|}{% + \textormath{\nobreak\discretionary{-}{}{\kern.03em}% + \bbl@allowhyphens}{}} +\declare@shorthand{swedish}{""}{\hskip\z@skip} +\declare@shorthand{swedish}{"~}{% + \textormath{\leavevmode\hbox{-}\bbl@allowhyphens}{-}} +\declare@shorthand{swedish}{"=}{\hbox{-}\allowhyphens} +\addto\extrasswedish{\babel@save\-} +\addto\extrasswedish{\def\-{\allowhyphens + \discretionary{-}{}{}\allowhyphens}} +\ldf@finish{swedish} +%% +%% \CharacterTable +%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +%% Digits \0\1\2\3\4\5\6\7\8\9 +%% Exclamation \! Double quote \" Hash (number) \# +%% Dollar \$ Percent \% Ampersand \& +%% Acute accent \' Left paren \( Right paren \) +%% Asterisk \* Plus \+ Comma \, +%% Minus \- Point \. Solidus \/ +%% Colon \: Semicolon \; Less than \< +%% Equals \= Greater than \> Question mark \? +%% Commercial at \@ Left bracket \[ Backslash \\ +%% Right bracket \] Circumflex \^ Underscore \_ +%% Grave accent \` Left brace \{ Vertical bar \| +%% Right brace \} Tilde \~} +%% +\endinput +%% +%% End of file `swedish.ldf'. \ No newline at end of file diff --git a/course_description/tocbibind.sty b/course_description/tocbibind.sty new file mode 100644 index 0000000000000000000000000000000000000000..b88f54f43e373bc1d615df513e852cc3147b2c0c --- /dev/null +++ b/course_description/tocbibind.sty @@ -0,0 +1,320 @@ +%% +%% This is file `tocbibind.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% tocbibind.dtx (with options: `usc') +%% +%% ----------------------------------------------------------------- +%% Author: Peter Wilson, Herries Press +%% Maintainer: Will Robertson (will dot robertson at latex-project dot org) +%% Copyright 1998--2004 Peter R. Wilson +%% +%% This work may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either +%% version 1.3c of this license or (at your option) any +%% later version: <http://www.latex-project.org/lppl.txt> +%% +%% This work has the LPPL maintenance status "maintained". +%% The Current Maintainer of this work is Will Robertson. +%% +%% This work consists of the files listed in the README file. +%% ----------------------------------------------------------------- +%% +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{tocbibind}[2010/10/13 v1.5k extra ToC listings] +\providecommand{\PRWPackageNote}[2]{% + \GenericWarning{% + (#1)\@spaces\@spaces\@spaces\@spaces + }{% + Package #1 Note: #2% + }% +} +\providecommand{\PRWPackageNoteNoLine}[2]{% + \PRWPackageNote{#1}{#2\@gobble}% +} + +\newcommand{\@bibquit}{} +\newif\if@bibchapter +\@ifundefined{chapter}{% + \@bibchapterfalse + \@ifundefined{section}{% + \PackageWarning{tocbibind}% + {I don't recognize any sectional divisions.\MessageBreak + I hope you have used the `other' option\MessageBreak + otherwise I'll ignore the package} + \renewcommand{\@bibquit}{\endinput} + }{\PackageInfo{tocbibind}{The document has section divisions}} + }{\@bibchaptertrue + \PackageInfo{tocbibind}{The document has chapter divisions}} + +\newif\if@inltxdoc +\@ifclassloaded{ltxdoc}{\@inltxdoctrue}{\@inltxdocfalse} + +\newif\if@dotocbib\@dotocbibtrue +\newif\if@dotocind\@dotocindtrue +\newif\if@dotoctoc\@dotoctoctrue +\newif\if@dotoclot\@dotoclottrue +\newif\if@dotoclof\@dotocloftrue + +\newif\if@donumbib\@donumbibfalse +\newif\if@donumindex\@donumindexfalse +\newif\if@dot@cb@bsection\@dot@cb@bsectionfalse + +\DeclareOption{section}{\@bibchapterfalse} +\DeclareOption{notbib}{\@dotocbibfalse} +\DeclareOption{notindex}{\@dotocindfalse} +\DeclareOption{nottoc}{\@dotoctocfalse} +\DeclareOption{notlot}{\@dotoclotfalse} +\DeclareOption{notlof}{\@dotocloffalse} +\DeclareOption{numbib}{\@donumbibtrue} +\DeclareOption{numindex}{\@donumindextrue} + +\DeclareOption{chapter}{% + \if@bibchapter\else + \PackageWarning{tocbibind}% + {Chapters are undefined, using section instead} + \fi} + +\DeclareOption{other}{\renewcommand{\@bibquit}{} + \@bibchapterfalse} +\DeclareOption{none}{% + \@dotocbibfalse + \@dotocindfalse + \@dotoctocfalse + \@dotoclotfalse + \@dotocloffalse + \@donumbibfalse + \@donumindexfalse +} +\ProcessOptions\relax +\@bibquit + +\if@bibchapter + \PRWPackageNoteNoLine{tocbibind}{Using chapter style headings, unless overridden} +\else + \PRWPackageNoteNoLine{tocbibind}{Using section or other style headings} +\fi +\if@inltxdoc \@dotocindfalse \fi + +\newcommand{\@tocextra}{section} +\newcommand{\tocotherhead}[1]{\renewcommand{\@tocextra}{#1}} + +\newcommand{\tocetcmark}[1]{% + \@mkboth{\MakeUppercase{#1}}{\MakeUppercase{#1}}} +\newcommand{\prw@mkboth}[1]{\tocetcmark{#1}} +\newcommand{\toc@section}[2]{% + \@nameuse{#1}*{#2\prw@mkboth{#2}} + \addcontentsline{toc}{#1}{#2}} +\newcommand{\toc@headstar}[2]{% + \@nameuse{#1}*{{#2}}} +\newcommand{\toc@chapter}[1]{% + \chapter*{#1}\prw@mkboth{#1} + \addcontentsline{toc}{chapter}{#1}} +\ifx\bibname\undefined + \ifx\refname\undefined + \newcommand{\tocbibname}{References} + \else + \newcommand{\tocbibname}{\refname} + \fi +\else + \newcommand{\tocbibname}{\bibname} +\fi +\providecommand{\indexname}{Index} +\newcommand{\setindexname}[1]{\renewcommand{\indexname}{#1}} +\providecommand{\contentsname}{Contents} +\newcommand{\settocname}[1]{\renewcommand{\contentsname}{#1}} +\providecommand{\listtablename}{List of Tables} +\newcommand{\setlotname}[1]{\renewcommand{\listtablename}{#1}} +\providecommand{\listfigurename}{List of Figures} +\newcommand{\setlofname}[1]{\renewcommand{\listfigurename}{#1}} +\newcommand{\settocbibname}[1]{\renewcommand{\tocbibname}{#1}} +\newcommand{\t@cb@bchapsec}{% + \if@bibchapter + \if@donumbib + \chapter{\tocbibname}% + \else + \toc@chapter{\tocbibname}% + \fi + \else + \if@donumbib + \@nameuse{\@tocextra}{\tocbibname}% + \else + \toc@section{\@tocextra}{\tocbibname}% + \fi + \fi} +\newcommand{\t@cb@bsection}{% + \if@donumbib + \@nameuse{\@tocextra}{\tocbibname}% + \else + \toc@section{\@tocextra}{\tocbibname}% + \fi} + +\if@dotocbib + \@ifpackageloaded{natbib}{}{% natbib not loaded + \newcommand{\bibsection}{\t@cb@bchapsec} + \renewenvironment{thebibliography}[1]{% + \bibsection + \begin{thebibitemlist}{#1}}{\end{thebibitemlist}}} + \newenvironment{thebibitemlist}[1]{ + \list{\@biblabel{\@arabic\c@enumiv}}% + {\settowidth\labelwidth{\@biblabel{#1}}% + \leftmargin\labelwidth + \advance\leftmargin\labelsep + \@openbib@code + \usecounter{enumiv}% + \let\p@enumiv\@empty + \renewcommand\theenumiv{\@arabic\c@enumiv}}% + \sloppy + \clubpenalty4000 + \@clubpenalty \clubpenalty + \widowpenalty4000% + \sfcode`\.\@m} + {\def\@noitemerr + {\@latex@warning{Empty `thebibliography' environment}}% + \endlist} + + \@ifpackagewith{chapterbib}{sectionbib}% + {\renewcommand{\sectionbib}[2]{}}% + {} + +\fi + +\AtBeginDocument{% + \@ifpackagewith{natbib}{sectionbib}{\@dot@cb@bsectiontrue}{} + \@ifpackagewith{chapterbib}{sectionbib}% + {\@dot@cb@bsectiontrue + \@ifundefined{sectionbib}{}{\def\sectionbib#1#2{}}}% + {} + + \if@dotocbib + \if@dot@cb@bsection + \renewcommand{\bibsection}{\t@cb@bsection}% + \else + \renewcommand{\bibsection}{\t@cb@bchapsec}% + \fi + \fi +} + +\if@inltxdoc\else + \renewenvironment{theindex}% + {\if@twocolumn + \@restonecolfalse + \else + \@restonecoltrue + \fi + \if@bibchapter + \if@donumindex + \refstepcounter{chapter} + \twocolumn[\vspace*{2\topskip}% + \@makechapterhead{\indexname}]% + \addcontentsline{toc}{chapter}{\protect\numberline{\thechapter}\indexname} + \chaptermark{\indexname} + \else + \if@dotocind + \twocolumn[\vspace*{2\topskip}% + \@makeschapterhead{\indexname}]% + \prw@mkboth{\indexname} + \addcontentsline{toc}{chapter}{\indexname} + \else + \twocolumn[\vspace*{2\topskip}% + \@makeschapterhead{\indexname}]% + \prw@mkboth{\indexname} + \fi + \fi + \else + \if@donumindex + \twocolumn[\vspace*{-1.5\topskip}% + \@nameuse{\@tocextra}{\indexname}]% + \csname \@tocextra mark\endcsname{\indexname} + \else + \if@dotocind + \twocolumn[\vspace*{-1.5\topskip}% + \toc@headstar{\@tocextra}{\indexname}]% + \prw@mkboth{\indexname} + \addcontentsline{toc}{\@tocextra}{\indexname} + \else + \twocolumn[\vspace*{-1.5\topskip}% + \toc@headstar{\@tocextra}{\indexname}]% + \prw@mkboth{\indexname} + \fi + \fi + \fi + \thispagestyle{plain}\parindent\z@ + \parskip\z@ \@plus .3\p@\relax + \let\item\@idxitem} + {\if@restonecol\onecolumn\else\clearpage\fi} +\fi + +\newcommand{\toc@start}{% + \if@bibchapter + \if@twocolumn + \@restonecoltrue\onecolumn + \else + \@restonecolfalse + \fi + \fi} + +\newcommand{\toc@finish}{% + \if@bibchapter + \if@restonecol\twocolumn\fi + \fi} +\newcommand{\tocfile}[2]{% + \toc@start + \if@bibchapter + \toc@chapter{#1} + \else + \toc@section{\@tocextra}{#1} + \fi + \@starttoc{#2} + \toc@finish} + +\if@dotoctoc + \renewcommand{\tableofcontents}{% + \tocfile{\contentsname}{toc} + } +\fi + +\if@dotoclot + \renewcommand{\listoftables}{% + \tocfile{\listtablename}{lot} + } +\fi + +\if@dotoclof + \renewcommand{\listoffigures}{% + \tocfile{\listfigurename}{lof} + } +\fi + +\newcommand{\simplechapter}[1][\@empty]{% + \let\@tbiold@makechapterhead\@makechapterhead + \renewcommand{\@makechapterhead}[1]{% + \vspace*{50\p@}% + {\parindent \z@ \raggedright + \normalfont + \interlinepenalty\@M + \Huge\bfseries #1\space\thechapter\simplechapterdelim\space + ##1\par\nobreak + \vskip 40\p@ + }} +} +\newcommand{\restorechapter}{% + \@ifundefined{@tbiold@makechapterhead}{}% + {\let\@makechapterhead\@tbiold@makechapterhead} +} +\newcommand{\simplechapterdelim}{} + +\newcommand{\tocchapter}{% + \providecommand{\@makechapterhead}{} + \simplechapter + \renewcommand{\toc@chapter}[1]{\chapter{##1}} +} +\newcommand{\tocsection}{% + \renewcommand{\toc@section}[2]{\@nameuse{##1}{##2}} +} + +\endinput +%% +%% End of file `tocbibind.sty'. diff --git a/course_description/wrapfig.sty b/course_description/wrapfig.sty new file mode 100644 index 0000000000000000000000000000000000000000..ea85e1b0d40a11bb6fa8fd558a706164bca85f70 --- /dev/null +++ b/course_description/wrapfig.sty @@ -0,0 +1,598 @@ +% W R A P F I G . S T Y ver 3.6 (Jan 31, 2003) +% +% Copyright (C) 1991-2003 by Donald Arseneau <asnd@triumf.ca> +% This software is released under the terms of the LaTeX Project +% public license. +% +% Environments "wrapfigure" and "wraptable" place a figure or table +% at the side of the page and wrap text around it. +% +% \begin{wrapfigure}[12]{r}[34pt]{5cm} <figure> \end{wrapfigure} +% -- - ---- --- +% [number of narrow lines] {placement} [overhang] {width of figure} +% +% Placement is one of r, l, i, o, R, L, I, O, for right, left, +% inside, outside, (here / FLOAT). +% The figure sticks into the margin by `overhang', if given, or by the +% length \wrapoverhang, which is normally zero. +% The number of wrapped text lines is normally calculated from the height +% of the figure, but may be specified manually ("12" above). +% +% Environments similar to "wrapfigure" and "wraptable" may be easily added, +% or invoked by "\begin{wrapfloat}{float_name}" +% +% More detailed instructions are given below, following the definitions. +% Please direct any problem reports to asnd@triumf.ca + +%%%%% ----- Begin definitions ----- %%%%% + +\@ifundefined{c@WF@wrappedlines}{}{\endinput} + +\newdimen\wrapoverhang \wrapoverhang\z@ +\newdimen\WF@size +\newcount\c@WF@wrappedlines % used globally +\newbox\WF@box +\newtoks\WF@everypar +\newif\ifWF@float +\let\@@parshape\parshape +\let\WF@@everypar\everypar + +\def\wrapfloat#1{\def\@captype{#1}\@ifnextchar[\WF@wr{\WF@wr[]}} + +\def\wrapfigure{\wrapfloat{figure}} +\def\wraptable{\wrapfloat{table}} + +\def\WF@wr[#1]#2{% first two args: #1=num lines, #2=placement + \xdef\WF@wfname{wrap\@captype\space}% + \ifvoid\WF@box\else \WFclear \WF@collision \fi + \xdef\WF@place{\string`\@car#2r\@nil}% + \ifnum\lccode\WF@place=\WF@place \global\WF@floatfalse + \else \global\WF@floattrue \fi + \ifx\parshape\WF@fudgeparshape \ifWF@float\else\WF@collision\fi \else + \ifx\par\@@par \ifnum\@@parshape>\z@\WF@conflict\fi \else \WF@conflict\fi + \fi \gdef\WF@wli{#1}% + \@ifnextchar[\WF@rapt{\WF@rapt[\wrapoverhang]}} + +\def\WF@rapt[#1]#2{% final two args: #1 = overhang, #2 = width, + \gdef\WF@ovh{#1}% hold overhang for later, when \width is known + \global\setbox\WF@box\vtop\bgroup \setlength\hsize{#2}% + \ifdim\hsize>\z@ \@parboxrestore \else + \setbox\z@\hbox\bgroup \let\wf@@caption\caption \let\caption\wf@caption + \ignorespaces \fi} + +\def\wf@caption{\relax + \ifdim\hsize>\z@ \let\caption\wf@@caption \else + \unskip \egroup \hsize\wd\z@ \@parboxrestore \box\z@ \fi \caption} + +\def\endwrapfloat{% + \ifdim\hsize>\z@ \par\hrule\@width\hsize\@height\z@ % force width + \else \unskip \egroup \box\z@ \fi % or end hbox + \egroup % end the \vtop; width is known so now is "later" + \WF@floatstyhook % support float.sty + \def\width{\wd\WF@box}\setlength\wrapoverhang{\WF@ovh}% + \xdef\WF@ovh{\the\wrapoverhang}% save until wrapping + \ifdim\ht\WF@box>\topskip \ht\WF@box\z@ \fi % too much height, set flag. + \ifdim\ht\WF@box<.5\p@ % too tall (starts with \vbox) or too short + \global\setbox\WF@box\vtop{\vskip-1.4ex\unvbox\WF@box}\fi + \global\WF@size\dp\WF@box % box is guaranteed to have little height. + \global\advance\WF@size1.5\baselineskip \global\advance\WF@size\tw@\intextsep + \aftergroup\WF@startfloating % even when not really floating! + \ifWF@float\else \ifhmode + {\unskip \parfillskip\z@skip \par \vskip-\parskip}\aftergroup\noindent + \fi\fi \global\@ignoretrue} + +\let\endwrapfigure\endwrapfloat +\let\endwraptable\endwrapfloat + +% Subvert \everypar to float fig and do wrapping. Also for non-float. +\def\WF@startfloating{% + \WF@everypar\expandafter{\the\everypar}\let\everypar\WF@everypar + \WF@@everypar{\ifvoid\WF@box\else\WF@floathand\fi \the\everypar + \WF@wraphand +}} + +\def\WF@floathand{% +\ifx\parshape\WF@fudgeparshape \WF@fltmes\else + \ifx\par\@@par\ifnum\@@parshape=\z@\ifdim\hangindent=\z@ + \setbox\z@\lastbox \begingroup + \@@par \WF@@everypar{}\WF@putfigmaybe + \endgroup % start wrapping + \ifvoid\z@\else\box\z@\fi % replace indentation + \else\WF@fltmes\fi\else\WF@fltmes\fi\else\WF@fltmes\fi\fi} + +% Put fig here if it fits or if it can't float +\def\WF@putfigmaybe{% +\ifinner + \vskip-\parskip \global\WF@floatfalse + \let\pagetotal\maxdimen % kludge flag for "not top of page" +\else % outer page + \@tempdima\pagedepth % save page depth + {\advance\parskip\@tempdima\vskip-\parskip}% back up to baseline + \penalty\interlinepenalty % update pg. parameters + \@tempdimb\pagegoal \advance\@tempdimb-\pagetotal % room left on page + \ifdim\@tempdimb<\z@ % \WF@info{Page overfull already;}% + \global\WF@floatfalse + \ifdim-\@tempdimb>\pageshrink \else \pagebreak \fi + \else + \ifdim\WF@size>\@tempdimb +% \WF@info{Size \the\WF@size\space does not fit in \the\@tempdimb}% + \ifWF@float \dimen@.5\baselineskip \else \dimen@ 2\baselineskip\fi + \ifdim\pagestretch>\dimen@ \dimen@\pagestretch \fi + \ifdim\pagefilstretch>\z@ \dimen@\@tempdimb \fi + \ifdim\pagefillstretch>\z@ \dimen@\@tempdimb \fi + \advance\dimen@.5\baselineskip + \ifdim\dimen@>\@tempdimb % \WF@info{Page nearly full; can stretch}% + \global\WF@floatfalse \pagebreak + \fi + \else % \WF@info{Fits in \the\@tempdimb;}% + \global\WF@floatfalse + \fi\fi + \vskip\@tempdima\relax % (return erased page depth) +\fi +\noindent +\ifWF@float + \WF@fltmes +\else % putting here; + \WF@info{Put \WF@wfname here:}% + {\ifodd\if@twoside\c@page\else\@ne\fi % assign l/r to i/o placement + \lccode`i`l\lccode`o`r\else \lccode`i`r\lccode`o`l\fi + \xdef\WF@place{\the\lccode\lccode\WF@place}}% twice to get only l or r + \hbox to\z@{% llap or rlap depending on {l} or {r}; calc effective width + \@tempdima\wd\WF@box \@tempdimb\WF@ovh + \advance\@tempdima-\@tempdimb \advance\@tempdima\columnsep + \@tempdimb\hsize \advance\@tempdimb-\@tempdima + \xdef\WF@adjlw{\the\@tempdima}% + \ifnum `l=\WF@place % fig on left + \hss % figure overlaps space to the left + \def\@tempa{\kern\columnsep}% position to left of the gap + \else % fig on right + \@tempdima\z@ % no left indentation + \kern\@tempdimb \kern\columnsep + \def\@tempa{\hss}% figure overlaps space to the right + \fi + \ifdim\@tempdimb<\hsize + \xdef\WF@wrapil{\the\@tempdima \the\@tempdimb}% indentation and length + \xdef\WF@adjtlm{\the\@tempdima}% + \else + \xdef\WF@wrapil{\z@ \the\hsize}% + \xdef\WF@adjlw{\z@}\xdef\WF@adjtlm{\z@}% + \fi + \ifdim\pagetotal=\z@ % \WF@info{Put \WF@wfname at top of p.\thepage}% + \global\advance\WF@size-\intextsep + \else % \WF@info{Putting \WF@wfname in middle of page}% + \setbox\WF@box\hbox{\lower\intextsep\box\WF@box}% + \fi \dp\WF@box\z@ \box\WF@box \@tempa + }% end \hbox to 0pt + \aftergroup\WF@startwrapping % after the \endgroup which immediately follows +\fi} + +\def\WF@startwrapping{% + \ifx\WF@wli\@empty + {\advance\WF@size1.1\baselineskip + \divide\WF@size\baselineskip \global\c@WF@wrappedlines\WF@size}% + \else + \setcounter{WF@wrappedlines}{\WF@wli}\global\advance\c@WF@wrappedlines\@ne + \fi + \ifnum\c@WF@wrappedlines>\@ne + \let\parshape\WF@fudgeparshape \let\WF@pspars\@empty \let\WF@@par\par + \def\@setpar##1{\def\WF@@par{##1}}\def\par{\@par}\let\@par\WF@mypar + \xdef\WF@restoretol{\tolerance\the\tolerance}\tolerance9999 + \advance\linewidth-\WF@adjlw \advance\@totalleftmargin\WF@adjtlm + \fi} + +\def\WF@wraphand{% +\ifnum\c@WF@wrappedlines<\tw@ \WF@finale +\else \begingroup % Create \parshape command: + \@tempcnta\@ne \let\WF@wrapil\relax \gdef\WF@ps{}% + \@whilenum \@tempcnta<\c@WF@wrappedlines\do{% repeated indentation, length + \xdef\WF@ps{\WF@ps\WF@wrapil}\advance\@tempcnta\@ne + }\endgroup + \ifx\WF@pspars\@empty + \@@parshape\c@WF@wrappedlines \WF@ps \WF@noil + \else % use external `parshape' values to modify my parshape + \WF@modps +\fi\fi} + +\def\WF@mypar{\relax + \WF@@par % what the rest of LaTeX expects \par to be (usually \@@par) + \ifnum\@@parshape=\z@ \let\WF@pspars\@empty \fi % reset `parshape' + \global\advance\c@WF@wrappedlines-\prevgraf \prevgraf\z@ + \ifnum\c@WF@wrappedlines<\tw@ \WF@finale \fi} + +\def\WF@modps{\begingroup + \afterassignment\@tempdimb \@tempdima\WF@pspars % a=ind, b=wid + \advance\@tempdima-\WF@adjtlm \advance\@tempdimb\WF@adjlw +% \afterassignment\dimen@\advance\@tempdima\WF@wrapil +% \advance\@tempdimb\dimen@ \advance\@tempdimb-\hsize + \let\WF@wrapil\WF@pspars%{\the\@tempdima \the\@tempdimb}% + \edef\@tempb{\@@parshape\c@WF@wrappedlines \WF@ps \the\@tempdima \the\@tempdimb}% + \expandafter\endgroup\@tempb} + +\let\@@setpar\@setpar +\def\WF@noil{\z@ \hsize} +\let\WF@pspars\@empty + +\def\WF@fudgeparshape{\relax \ifnum\c@WF@wrappedlines<\tw@ \WF@finale + \else \afterassignment\WF@fudgeparshapee \fam \fi} +\def\WF@fudgeparshapee{\ifnum\fam=\@ne \expandafter \WF@parshapeee \else + \WF@conflict \@@parshape\fam \fi} +\def\WF@parshapeee#1#2{\begingroup\delimitershortfall#1% + \nulldelimiterspace#2%\advance\nulldelimiterspace\WF@adjlw + \edef\@tempa{\def\noexpand\WF@pspars{% + \the\delimitershortfall \the\nulldelimiterspace}}% + \expandafter\endgroup\@tempa \WF@wraphand} + +\def\WF@finale{\ifx\parshape\WF@fudgeparshape + \WF@restoretol \let\@setpar\@@setpar \let\par\WF@@par + \advance\linewidth\WF@adjlw \advance\@totalleftmargin-\WF@adjtlm + \WF@info{Finish wrapping text}% + \ifx\par\@@par \def\@par{\let\par\@@par\par}\else \let\@par\WF@@par \fi + \let\parshape\@@parshape + \parshape\ifx\WF@pspars\@empty \z@ \else \@ne \WF@pspars\fi \fi + \ifvoid\WF@box \ifx\everypar\WF@everypar + \let\everypar\WF@@everypar \everypar\expandafter{\the\WF@everypar}% + \fi\fi} + +\newcommand{\WFclear}{\par + \ifvoid\WF@box\else \vskip\bigskipamount \box\WF@box + \let\everypar\WF@@everypar \everypar\expandafter{\the\WF@everypar}% + \fi \global\c@WF@wrappedlines\z@ \WF@finale} + +\begingroup + \toks0={\let\everypar\WF@@everypar \everypar\expandafter{\the\WF@everypar}% + \let\parshape\@@parshape \let\@setpar\@@setpar } + \toks1=\expandafter{\@arrayparboxrestore} + \toks2=\expandafter{\clearpage} + \edef\@tempa{\def\noexpand\@arrayparboxrestore{\the\toks0 \the\toks1}% + \def\noexpand\clearpage{\noexpand\protect\noexpand\WFclear \the\toks2}} + \expandafter +\endgroup\@tempa + +\@ifundefined{@capwidth}{\let\@capwidth\hsize}{}% Pamper RevTeX's Stupidity + +\def\WF@conflict{\WF@warning + {\WF@wfname used inside a conflicting environment}} +\def\WF@collision{\WF@warning{Collision between wrapping environments}} +\def\WF@fltmes{\ifWF@float \WF@info{\WF@wfname floats}% + \else \WF@warning{Stationary \WF@wfname forced to float}\fi} + +\let\WF@warning\@warning +\let\WF@info\@gobble + +% Support float.sty: float styles and \newfloat. Make \newfloat{foo} +% define the `wrapfoo' environment. Support \newfloat from memoir.cls +% and \newfloatlist from ccaption.sty. +% +\let\WF@floatstyhook\relax + +\@ifundefined{newfloat}{}{% There is a \newfloat command +% + \@ifundefined{restylefloat}{ + % \newfloat comes from somewhere besides float.sty + \@ifclassloaded{memoir}{ + \toks@=\expandafter\expandafter\expandafter + {\csname\string\newfloat\endcsname [{#1}]{#2}{#3}{#4}% + \newenvironment{wrap#2}{\wrapfloat{#2}}{\endwrapfloat}% + } + \edef\@tempa{\def\expandafter\noexpand\csname\string\newfloat\endcsname + [##1]##2##3##4{\the\toks@}} + \@tempa + }% end memoir support + {}% Other origins of \newfloat here?? + }{ + % float.sty handler. Ooops: Two versions for different versions + % Changing \float@restyle (or \restylefloat) changes \newfloat too. + \@ifundefined{float@restyle}{% older float.sty + \toks@=\expandafter{\restylefloat{#1}% (env may or may not be defined) + \@namedef{wrap#1}{\def\@captype{#1}\@nameuse{fst@#1}% + \def\WF@floatstyhook{\let\@currbox\WF@box \columnwidth\wd\WF@box + \global\setbox\WF@box\float@makebox}% + \@ifnextchar[\WF@wr{\WF@wr[]}}% + \expandafter\let\csname endwrap#1\endcsname \endwrapfigure + }\edef\@tempa{\def\noexpand\restylefloat##1{\the\toks@}} + }{% newer float.sty: use \float@restyle, and \float@makebox takes width arg + \toks@=\expandafter{\float@restyle{#1}% (env may or may not be defined) + \@namedef{wrap#1}{\def\@captype{#1}\@nameuse{fst@#1}% + \def\WF@floatstyhook{\let\@currbox\WF@box + \global\setbox\WF@box\float@makebox{\wd\WF@box}}% + \@ifnextchar[\WF@wr{\WF@wr[]}}% + \expandafter\let\csname endwrap#1\endcsname \endwrapfigure + }\edef\@tempa{\def\noexpand\float@restyle##1{\the\toks@}} + } + \@tempa % perform redefinitions + % + }% End float.sty handler +}% End redefinitions of \newfloat + +% Support ccaption.sty +\@ifundefined{\string\newfloatlist}{}{ + \toks@=\expandafter\expandafter\expandafter + {\csname\string\newfloatlist\endcsname [{#1}]{#2}{#3}{#4}{#5}% + \@namedef{wrap#2}{\wrapfloat{#2}}% + \expandafter\let\csname endwrap#2\endcsname \endwrapfloat + } + \edef\@tempa{\def\expandafter\noexpand\csname\string\newfloatlist\endcsname + [##1]##2##3##4##5{\the\toks@}} + \@tempa +} + +% Process package options. + +\@ifundefined{DeclareOption}{\endinput}{} + +\def\WF@warning{\PackageWarning{wrapfig}} +\ProvidesPackage{wrapfig}[2003/01/31 \space v 3.6] +\DeclareOption{verbose}{\def\WF@info{\PackageInfo{wrapfig}}} +\ProcessOptions +\AtEndDocument{\WFclear} + +\endinput + +%%%%% ----- End definitions ----- %%%%% + +%%%%% ----- Begin Instructions ----- %%%%% + + +W R A P F I G . S T Y \ \ ver 3.6 \ \ (Jan 31, 2003) + +Copyright (C) 1991-2003 by Donald Arseneau (asnd@triumf.ca) + +Wrapfig.sty provides the environments "wrapfigure" and "wraptable" for +typesetting a narrow float at the edge of the text, and making the text +wrap around it. The "wrapfigure" and "wraptable" environments interact +properly with the "\caption" command to produce proper numbering, but +they are not regular floats like "figure" and "table", so (beware!) they +may be printed out of sequence with the regular floats. There are four +parameters for "\begin{wrapfigure}", two optional and two required, plus +the text of the figure, with a caption perhaps: + + \begin{wrapfigure}[12]{r}[34pt]{5cm} <figure> \end{wrapfigure} + == = ==== === + [number of narrow lines] {placement} [overhang] {width} + +Some idiosyncrasies: + + - You must not specify a wrapfigure in any type of list environment or + or immediately before or immediately after one. It is OK to follow + a list if there is a blank line ("\par") in between. + + - If you put a wrapfigure in a parbox or a minipage, or any other type + of grouping, the text wrapping should end before the group does. + + - It does work in two-column format, but are your figures that small? + + - It may be out of sequence with regular floats. + + - The hlines that may be printed above and below floats are ignored; + you must insert them manually if desired. + + - "\linewidth" is now adjusted within the wrapped text, but since it + can only be set for whole paragraphs at a time, it will persist with + the wrong value after the wrapping, until the paragraph is finished. + +New wrapping environments may be added when new float types are defined +(using memoir.cls, float.sty, or ccaption.sty). Any wrapping environment, +"wrapfigure", "wraptable", or something else may be invoked using the +"wrapfloat" environment, as in "\begin{wrapfloat}{figure}{O}{5cm}". + +To use float.sty properly, load package "float" before "wrapfig", +and declare any new float types after loading both. Likewise for +ccaption.sty and "\newfloatlist" and memoir.cls and its "\newfloat". + +\section{Placement and Floating} + +Parameter "#2" (required) is the figure placement code, but the valid +codes are different from regular figures. They come in pairs: an +uppercase version which allows the figure to float, and a lowercase +version that puts the figure ``exactly here''. + + r R - the right side of the text + l L - the left side of the text + i I - the inside edge--near the binding (if "[twoside]" document) + o O - the outside edge--far from the binding + +You should specify one code only, not a list. The figure or table must +be on one side or the other; it cannot be in the middle with text on +both sides. The "i" and "o" options refer to the inside and outside of +the whole page, not individual columns. + +The ability to float is somewhat restricted, and you will get best results +by giving exact manual placement, but floating is more convenient while +revising the document. Any changes to the formatting can ruin your manual +positioning so you should adjust the placement just before printing a +final copy. Here are some tips for good placement: + + - The environment should be placed so as to not run over a page break. + + - The environment must not be placed in special places like lists. + + - For esthetic reasons, only plain text should wrap around the figure. + Section titles and big equations look bad; lists are bad if the figure + is on the left. (All these function properly, they just don't look + very good.) Small equations look fine. + + - It is convenient to begin the environment between paragraphs, but if + you want placement in the middle of a paragraph, you must put the + environment between two words where there is a natural line break. + +When floating, \LaTeX\ tries to apply these rules. More specifically, +a floated wrapping environment will only begin... + + - at the beginning of a paragraph, + + - when there is enough room on the page, or it is possible to go on + the next page, + + - if the `paragraph' is not in a section title or a list, + + - if the paragraph is not wrapping around another figure, + + - in the main text (not in a minipage etc.) + +It is possible that a non-floating wrapfigure will be forced to float +when an earlier one is still being processed. A warning will be written +in that case. You can have more information about the floating process +written to the log file by specifying "\usepackage[verbose]{wrapfig}". + +If there is a lot of flexibility on a page, a floating wrapfigure may +be placed badly; you must turn to manual placement. A rare problem is +that floats and footnotes specified within the wrapping text can also +cause poor placement and bad formatting. + + +\section {Sizing and optional overhang} + +Parameter "#4" (the second required parameter) is the width of the figure +or table. Given the way that \LaTeX\ puts just about everything into boxes +with the current line-width, the width parameter will take precedence over +whatever natural width the figure has. In particular, the caption is always +typeset with the specified width. If the figure is wider than the space +allotted, you will get an ``overfull box'' warning. + +However, if you specify a width of *zero* ("0pt"), the actual width of +the figure will determine the wrapping width. A following "\caption" +should have the same width as the figure, but it might fail badly; it +is safer to specify a width when you use a caption. + +\LaTeX\ will wrap surrounding text around the figure, leaving a gap of +"\intextsep" at the top and bottom, and "\columsep" at the side, by +producing a series of shortened text lines beside the figure. The +indentation (shortening) of the text is the figure width plus "\columnsep" +minus overhang (if any; see below). + +\LaTeX\ calculates the number of short lines needed based on the height +of the figure and the length "\intextsep". You can override this guess +by giving the first optional argument (parameter "#1") specifying the +number of shortened lines (counting each displayed equation as 3 lines). +This is particularly useful when the surrounding text contains extra +vertical spacing that is not accounted for automatically. + +The second optional parameter ("#3") tells how much the figure should +hang out into the margin. The default overhang is given by the length +"\wrapoverhang", which is "0pt" normally but can be changed using +"\setlength". For example, to have all wrapfigures use the space +reserved for marginal notes, + + \setlength{\wrapoverhang}{\marginparwidth} + \addtolength{\wrapoverhang}{\marginparsep} + +When you do specify the overhang explicitly for a particular figure, you +can use a special unit called "\width" meaning the width of the figure. +For example, "[0.5\width]" makes the center of the figure sit on the +edge of the text, and "[\width]" puts the figure entirely in the margin +(and the adjacent text is indented by just "\columnsep"). This "\width" +is the actual width of the wrapfigure, which may be greater than the +declared width. + + +\section{Some Random Implementation Notes} + +Unfortunately, \LaTeX's system of setting "\everypar" and "\par" is +unable to coexist peacefully with a wrapping environment, so I was +forced to subvert the "\@setpar" mechanism and "\everypar". ("\everypar" +is already subverted once by NFSS.) + +When checking the room left on the page, remember that if there is less +than "\baselineskip" the new paragraph will begin on the next page, even +if there is no page stretch. If non-floating, I force a bad page break +rather than have the figure hang into the bottom margin. + +Here are notes on various variables and some macros; what info they +store and how they are used. + + \WF@wli - number-of-wrapped-lines parameter, saved for start of wrapping. + Set globally by "\WF@wr" (set empty if no optional parameter given). + The floating mechanism ignores this and uses the real size. + + \WF@ovh - margin overhang set globally by "\WF@rapt", saved until placing + figure (but not reset). Actually, the setting is very tricky so that + the expected values are used when a figure floats. First, the expression + is saved without evaluation by "\WF@rapt" ("\begin{wrapfigure}") because + "\width" is still unknown. Soon after that, "\endwrapfigure" executes + "\WF@ovh" to evaluate the overhang and save the result (so that changes + to "\wrapoverhang" while this figure is floating won't affect this + figure). Finally, it is used by "\WF@putfigmaybe" when printing the fig. + + \WF@place - a macro that is used as a number, giving the placement code. + It might start out as "`I" and later be converted to "114" (r). + + \WF@box - tested for void at "\begin{wrapfigure}", to avoid collisions, + by "\everypar" to do floating, and by "\WF@finale" before resetting + "\everypar". Voided globally when used by "\WF@putfigmaybe" (or by + "\WF@wr" if an old figure must be dumped prematurely). + + \par - test if it is "\@@par" by "\begin{wrapfigure}" and "\WF@floathand" + to float past special environments. It is set to "\@par" ("\WF@mypar") + by "\WF@startwrapping", and restored by an end-group (bad!) or by + "\WF@finale" (good). It is protected from change by redefining + "\@setpar". + + \parshape - let to "\WF@fudgeparshape" by "\WF@startwrapping", so lists + will continue wrapping; "\@@parshape" preserves the real "\parshape" + command, and it is restored by "\WF@finale" or "\@parboxrestore". + "\WF@floathand" and "\WF@wr" test if old wrapping is still in progress + with "\ifx\parshape\WF@fudgeparshape". The value of "\@@parshape" is + also tested to float past lists and other wrapping environments. + + \hangindent - tested to float past section titles etc. + + \c@WF@wrappedlines - the number of shortened lines + 1; set globally by + "\WF@startwrapping" and decremented by "\par" ("\WF@mypar"). It is > 1 + only when wrapping is incomplete. "\WF@wraphand", "\WF@fudgeparshape", + and "\WF@mypar" test the number for calling "\WF@finale". It may get + stuck at some high value if "\par" is restored by an end-group, (and + wrapping is terminated prematurely) so it is unwise to use this as a + test for wrapping-complete. + + \pagetotal - one of many parameters used to compute floating. When + putting a wrapfigure in a parbox, I assign "\let\pagetotal\maxdimen" + (locally!) to signal not-top-of-page and no floating. + + \WF@pspars - the "\parshape" parameters as LaTeX sets them for lists + ("\WF@fudgeparshape"); when wrapping I test it and use it to modify my + own real params for the paragraph. They are also used when "\parshape" + is restored after wrapping. + + \WF@finale - is performed by "\par" when wrapping should end. However, + that might happen inside a group (a list especially), so the subverted + versions of "\par", "\parshape" etc. will be reinstated when the group + ends. Thus, they must themselves test "\c@WF@wrappedlines" < 2 to see + when wrapping is over, and if so, they should just do "\WF@finale" again. + +These are the tests to see if a floating wrapfigure will fit at a particular +spot. These tests are performed at the beginning of every paragraph after +the figure, except in lists etc. ("\pagegoal" - "\pagetotal" is the room +left on the page.) + + > + room_left := \pagegoal - \pagetotal + if room_left < 0 then page overfull already: put figure (on next page) + else + if figure_size > room_left then does not fit + if max(min_stretch, \pagestretch) + extra > room_left + then page can stretch until full: put figure (at top of next page) + fi + else figure fits: put figure + fi fi + < + +Even if a wrapfigure is not floating, it will go through the same logic +to generate a "\pagebreak", and maybe an underfull page, when the current +page can stretch until full. The "min_stretch" depends on whether it is +floating or not: ".5\baselineskip" (floating) "2\baselineskip" (not). The +"extra" is ".5\baselineskip" in either case. These values can be adjusted. + +There are some other `magic numbers' for floating that aren't really so +special, but you must change them together if you change them at all. +To make floating wrapfigures float less and fit on pages more frequently, +but not change the number of wrapped lines, decrease the "1.5" in +"\global\advance\WF@size1.5\baselineskip" and increase the "1.1" in +"\advance\WF@size1.1\baselineskip" by the same amount (and vice versa). +To make more (or fewer) wrapped lines for the same size figure, without +changing the floating, change "1.1" in "\advance\WF@size1.1\baselineskip" +unilaterally. + +%%%%% ----- End Instructions ----- %%%%% + +Test file integrity: ASCII 32-57, 58-126: !"#$%&'()*+,-./0123456789 +:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~