212 lines
5.2 KiB
Typst
212 lines
5.2 KiB
Typst
#import "/metadata.typ": *
|
|
#pagebreak()
|
|
#let base-url = "https://github.com/PI-E2EEDA/Plein-de-eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee-project/issues/"
|
|
#let github-link(id) = {
|
|
link(base-url+str(id))[\##str(id)]
|
|
}
|
|
#let github-link-name(id, name) = {
|
|
link(base-url+str(id))[#name]
|
|
}
|
|
#let issue(
|
|
id,
|
|
name,
|
|
sp: 0,
|
|
link: (),
|
|
description: none,
|
|
) = {
|
|
(
|
|
github-link(id),
|
|
github-link-name(id, name),
|
|
for l in link [\##l ],
|
|
if description == none [] else {description},
|
|
sp
|
|
)}
|
|
|
|
#let display(workload) = {
|
|
let task = ()
|
|
for w in workload {
|
|
task.push(w.at(0))
|
|
task.push(w.at(1))
|
|
task.push(w.at(2))
|
|
task.push(w.at(3))
|
|
task.push(str(w.at(4)))
|
|
}
|
|
task
|
|
}
|
|
|
|
|
|
= Planned tasks <sec:spec:planned_tasks>
|
|
|
|
Below are listed the general tasks to execute during this project.
|
|
Each tasks may be subdivided into smaller ones in the #link(base-url)[*GitHub board*].
|
|
|
|
#let workload = {(
|
|
issue(1, [Sample Zephyr], description: [Getting to know with BLE secure advertising and Zephyr], sp: 1),
|
|
issue(2, link: (2,), [Node firmware definition], description: [Defining each nodes software (and potential bootloader)], sp: 1),
|
|
issue(3, link: (2, 4), [Node implementation], description: [Implementation of the nodes, including low-power care], sp: 8),
|
|
issue(4, [Gateway firmware definition], description: [Definition of the gateway software, including communication with the nodes], sp: 1),
|
|
issue(5, link: (4,), [Gateway implementation], description: [Implementation of the gateway software], sp: 6),
|
|
issue(6, [Database setup], description: [Setup of the temporal data storage, including a service to add new values], sp: 3),
|
|
issue(7, [DB data retrieval], link: (6,), description: [Implementation of an API allowing to retrieve data from the DB], sp: 4),
|
|
issue(8, [2D map GUI], link: (7,), description: [Implementation of a service displaying the sensor data at a given time], sp: 6),
|
|
issue(9, [MeteoSwiss API grasping], description: [Retrieve MeteoSwiss data to get the outside environmental data], sp: 3),
|
|
issue(10, [Windows opening forecasting], description: [Training of a model telling the optimal windows opening time], sp: 8),
|
|
issue(11, [Notification setup], link: (10,), description: [Considering the window opening recommendation, sends a notification to the room users], sp: 3),
|
|
issue(12, [Analysis of the room data evolution], description: [Analysis of the temperature and CO2 level evolution regarding window opening status over time], sp: 7),
|
|
issue(13, [Documentation], description: [Report and code comments], sp: 9),
|
|
)}
|
|
|
|
#let sum-sp = 0
|
|
#for w in workload {
|
|
sum-sp += w.at(4)
|
|
}
|
|
|
|
// #show table.cell.where(y: 0): strong
|
|
// #set table(
|
|
// stroke: (x, y) => if y == 0 {
|
|
// (bottom: 0.7pt + black)
|
|
// },
|
|
// align: (x, y) => (
|
|
// if x == 4 { right }
|
|
// else { left }
|
|
// )
|
|
// )
|
|
|
|
#set par(justify: false)
|
|
#table(
|
|
columns:(
|
|
// 2.5em,
|
|
2fr,
|
|
// 3.5em,
|
|
5fr,
|
|
2em
|
|
),
|
|
align: left,
|
|
table.header(
|
|
// "ID",
|
|
"Name",
|
|
// "Linked",
|
|
"Description",
|
|
"SP"
|
|
),
|
|
..{
|
|
let task = ()
|
|
for w in workload {
|
|
// task.push(w.at(0))
|
|
task.push(w.at(1))
|
|
// task.push(w.at(2))
|
|
task.push(w.at(3))
|
|
task.push(align(center)[#str(w.at(4))])
|
|
}
|
|
task
|
|
},
|
|
table.cell(stroke: none)[],
|
|
table.cell(stroke: none)[#align(right)[Total:]],
|
|
table.cell(stroke: none)[#sum-sp],
|
|
)
|
|
|
|
The various fields are assigned considering @tab:repartition.
|
|
#figure(
|
|
table(
|
|
columns: (auto, auto),
|
|
align: center,
|
|
table.header("Field", "Assigned to"),
|
|
[Team lead | Administrative elements],[Adrien],
|
|
[Embedded Software],[Adrien, Rémi],
|
|
[Communication between components],[Rémi, Djelal],
|
|
[Database interfacing],[Ibrahima],
|
|
[Machine learning | Data exploitation],[Ibrahima, Dimitri],
|
|
[Physic Modelling],[Alison]
|
|
)
|
|
)<tab:repartition>
|
|
|
|
#let dispatch(id, sp) = {
|
|
let task = workload.at(id - 1)
|
|
([#link(task.at(0).dest)[#task.at(0).body - #task.at(1)] (#sp/#task.at(4))], sp)
|
|
}
|
|
|
|
#let display-dispatching(person) = {
|
|
let total = 0.0
|
|
for d in person {
|
|
d.at(0)
|
|
linebreak()
|
|
total = total + d.at(1)
|
|
}
|
|
underline[Total SP: #str(total)]
|
|
|
|
}
|
|
|
|
#let Djelal = [
|
|
#underline[A. Djelal]\
|
|
#display-dispatching((
|
|
dispatch(1, 0.5),
|
|
dispatch(3, 1),
|
|
dispatch(4, 1),
|
|
dispatch(5, 6),
|
|
dispatch(13, 1.5),
|
|
))
|
|
]
|
|
|
|
#let Adrien = [
|
|
#underline[B. Adrien]\
|
|
#display-dispatching((
|
|
dispatch(1, 0.5),
|
|
dispatch(2, 1),
|
|
dispatch(3, 7),
|
|
dispatch(13, 1.5),
|
|
))
|
|
]
|
|
|
|
#let Rémi = [
|
|
#underline[H. Rémi]\
|
|
#display-dispatching((
|
|
dispatch(6, 3),
|
|
dispatch(7, 4),
|
|
dispatch(9, 1.5),
|
|
dispatch(13, 1.5),
|
|
))
|
|
]
|
|
|
|
#let Dimitri = [
|
|
#underline[I. Dimitri]\
|
|
#display-dispatching((
|
|
dispatch(9, 1.5),
|
|
dispatch(10, 7),
|
|
dispatch(13, 1.5),
|
|
))
|
|
]
|
|
|
|
#let Alison = [
|
|
#underline[L. Alison]\
|
|
#display-dispatching((
|
|
dispatch(8, 0.5),
|
|
dispatch(10, 1),
|
|
dispatch(12, 7),
|
|
dispatch(13, 1.5),
|
|
))
|
|
]
|
|
|
|
#let Ibrahima = [
|
|
#underline[S. Ibrahima]\
|
|
#display-dispatching((
|
|
dispatch(8, 5.5),
|
|
dispatch(11, 3),
|
|
dispatch(13, 1.5),
|
|
))
|
|
]
|
|
|
|
#set text(size: 0.8em)
|
|
#grid(
|
|
columns: (1fr, 1fr),
|
|
column-gutter: 1em,
|
|
row-gutter: 2em,
|
|
Djelal,
|
|
Adrien,
|
|
Rémi,
|
|
Dimitri,
|
|
Alison,
|
|
Ibrahima,
|
|
)
|
|
|
|
|