Skip to content

Commit 4067c79

Browse files
authored
Merge pull request #147 from 12urenloop/feat/positioners
support multiple positioners
2 parents 7e06cb1 + f22a61f commit 4067c79

File tree

7 files changed

+89
-7
lines changed

7 files changed

+89
-7
lines changed

src/main/java/telraam/App.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ public void run(AppConfiguration configuration, Environment environment) {
105105
jersey.register(new LapResource(database.onDemand(LapDAO.class)));
106106
jersey.register(new TeamResource(database.onDemand(TeamDAO.class), database.onDemand(BatonSwitchoverDAO.class)));
107107
jersey.register(new LapSourceResource(database.onDemand(LapSourceDAO.class)));
108+
jersey.register(new PositionSourceResource(database.onDemand(PositionSourceDAO.class)));
108109
jersey.register(new BatonSwitchoverResource(database.onDemand(BatonSwitchoverDAO.class)));
109110
jersey.register(new LapSourceSwitchoverResource(database.onDemand(LapSourceSwitchoverDAO.class)));
110111
jersey.register(new AcceptedLapsResource());
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package telraam.api;
2+
3+
import io.swagger.v3.oas.annotations.tags.Tag;
4+
import jakarta.ws.rs.Path;
5+
import jakarta.ws.rs.Produces;
6+
import jakarta.ws.rs.core.MediaType;
7+
import telraam.database.daos.DAO;
8+
import telraam.database.models.PositionSource;
9+
10+
11+
import java.awt.*;
12+
13+
@Path("/position-source")
14+
@Tag(name = "Position Source")
15+
@Produces(MediaType.APPLICATION_JSON)
16+
public class PositionSourceResource extends AbstractListableResource<PositionSource> {
17+
public PositionSourceResource(DAO<PositionSource> dao) {
18+
super(dao);
19+
}
20+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package telraam.database.daos;
2+
3+
import org.jdbi.v3.sqlobject.config.RegisterBeanMapper;
4+
import org.jdbi.v3.sqlobject.customizer.Bind;
5+
import org.jdbi.v3.sqlobject.customizer.BindBean;
6+
import org.jdbi.v3.sqlobject.statement.GetGeneratedKeys;
7+
import org.jdbi.v3.sqlobject.statement.SqlQuery;
8+
import org.jdbi.v3.sqlobject.statement.SqlUpdate;
9+
import telraam.database.models.PositionSource;
10+
11+
import java.util.List;
12+
import java.util.Optional;
13+
14+
public interface PositionSourceDAO extends DAO<PositionSource> {
15+
@Override
16+
@SqlQuery("SELECT * FROM position_source")
17+
@RegisterBeanMapper(PositionSource.class)
18+
List<PositionSource> getAll();
19+
20+
@SqlUpdate("INSERT INTO position_source (name) VALUES (:name)")
21+
@GetGeneratedKeys({"id"})
22+
int insert(@BindBean PositionSource positionSource);
23+
24+
@SqlQuery("SELECT * FROM position_source WHERE name = :name")
25+
@RegisterBeanMapper(PositionSource.class)
26+
Optional<PositionSource> getByName(@Bind("name") String name);
27+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package telraam.database.models;
2+
3+
import lombok.Getter;
4+
import lombok.NoArgsConstructor;
5+
import lombok.Setter;
6+
7+
@Getter
8+
@Setter
9+
@NoArgsConstructor
10+
public class PositionSource {
11+
private Integer id;
12+
private String name;
13+
14+
public PositionSource(String name) {
15+
this.name = name;
16+
}
17+
}

src/main/java/telraam/logic/positioner/PositionSender.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,22 @@
44
import telraam.websocket.WebSocketMessageSingleton;
55

66
import java.util.List;
7+
import java.util.Map;
78

89
public class PositionSender {
910
private final WebSocketMessage<List<Position>> message = new WebSocketMessage<>();
11+
private final String name;
1012

11-
public PositionSender() {
13+
public PositionSender(String name) {
1214
this.message.setTopic("position");
15+
this.name = name;
1316
}
1417

1518
public void send(List<Position> positions) {
16-
this.message.setData(positions);
19+
Map<String, Object> data = Map.of(
20+
"positioner", this.name,
21+
"positions", positions
22+
);
1723
WebSocketMessageSingleton.getInstance().sendToAll(this.message);
1824
}
1925

src/main/java/telraam/logic/positioner/nostradamus/Nostradamus.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,10 @@
22

33
import org.jdbi.v3.core.Jdbi;
44
import telraam.database.daos.BatonSwitchoverDAO;
5+
import telraam.database.daos.PositionSourceDAO;
56
import telraam.database.daos.StationDAO;
67
import telraam.database.daos.TeamDAO;
7-
import telraam.database.models.BatonSwitchover;
8-
import telraam.database.models.Detection;
9-
import telraam.database.models.Station;
10-
import telraam.database.models.Team;
8+
import telraam.database.models.*;
119
import telraam.logic.positioner.Position;
1210
import telraam.logic.positioner.PositionSender;
1311
import telraam.logic.positioner.Positioner;
@@ -20,6 +18,7 @@
2018

2119
public class Nostradamus implements Positioner {
2220
private static final Logger logger = Logger.getLogger(Nostradamus.class.getName());
21+
private final String SOURCE_NAME = "nostradamus";
2322
private final int INTERVAL_CALCULATE_MS = 500; // How often to handle new detections (in milliseconds)
2423
private final int INTERVAL_FETCH_MS = 10000; // Interval between fetching baton switchovers (in milliseconds)
2524
private final int INTERVAL_DETECTIONS_MS = 3000; // Amount of milliseconds to group detections by
@@ -38,6 +37,12 @@ public class Nostradamus implements Positioner {
3837

3938
public Nostradamus(Jdbi jdbi) {
4039
this.jdbi = jdbi;
40+
41+
PositionSourceDAO positionSourceDAO = jdbi.onDemand(PositionSourceDAO.class);
42+
if (positionSourceDAO.getByName(SOURCE_NAME).isEmpty()) {
43+
positionSourceDAO.insert(new PositionSource(SOURCE_NAME));
44+
}
45+
4146
this.newDetections = new ArrayList<>();
4247
this.detectionLock = new ReentrantLock();
4348
this.dataLock = new ReentrantLock();
@@ -46,7 +51,7 @@ public Nostradamus(Jdbi jdbi) {
4651
this.batonToTeam = new HashMap<>();
4752
this.teamData = getTeamData();
4853

49-
this.positionSender = new PositionSender();
54+
this.positionSender = new PositionSender(SOURCE_NAME);
5055

5156
new Thread(this::fetch).start();
5257
new Thread(this::calculatePosition).start();
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
create table position_source
2+
(
3+
id serial not null
4+
constraint position_source_pk primary key,
5+
name varchar(255) not null unique
6+
);

0 commit comments

Comments
 (0)