2018-11-17 11:52:12 +00:00
|
|
|
/*
|
|
|
|
* This file is part of ComputerCraft - http://www.computercraft.info
|
2022-01-01 00:07:26 +00:00
|
|
|
* Copyright Daniel Ratcliffe, 2011-2022. Do not distribute without permission.
|
2018-11-17 11:52:12 +00:00
|
|
|
* Send enquiries to dratcliffe@gmail.com
|
|
|
|
*/
|
|
|
|
package dan200.computercraft.shared.peripheral.modem;
|
|
|
|
|
|
|
|
import dan200.computercraft.api.lua.LuaException;
|
|
|
|
import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
|
|
|
|
import it.unimi.dsi.fastutil.ints.IntSet;
|
|
|
|
|
2022-11-09 18:58:31 +00:00
|
|
|
import javax.annotation.Nullable;
|
2018-11-17 11:52:12 +00:00
|
|
|
import java.util.concurrent.atomic.AtomicBoolean;
|
|
|
|
|
|
|
|
public class ModemState {
|
2022-11-09 18:58:31 +00:00
|
|
|
private final @Nullable Runnable onChanged;
|
2019-01-19 10:16:41 +00:00
|
|
|
private final AtomicBoolean changed = new AtomicBoolean(true);
|
2018-11-17 11:52:12 +00:00
|
|
|
|
2019-01-19 10:16:41 +00:00
|
|
|
private boolean open = false;
|
2018-11-17 11:52:12 +00:00
|
|
|
private final IntSet channels = new IntOpenHashSet();
|
|
|
|
|
2019-01-19 10:16:41 +00:00
|
|
|
public ModemState() {
|
2019-03-29 21:21:39 +00:00
|
|
|
onChanged = null;
|
2019-01-19 10:16:41 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
public ModemState(Runnable onChanged) {
|
|
|
|
this.onChanged = onChanged;
|
|
|
|
}
|
|
|
|
|
2018-11-17 11:52:12 +00:00
|
|
|
private void setOpen(boolean open) {
|
|
|
|
if (this.open == open) return;
|
|
|
|
this.open = open;
|
2019-01-19 10:16:41 +00:00
|
|
|
if (!changed.getAndSet(true) && onChanged != null) onChanged.run();
|
2018-11-17 11:52:12 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
public boolean pollChanged() {
|
|
|
|
return changed.getAndSet(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean isOpen() {
|
|
|
|
return open;
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean isOpen(int channel) {
|
|
|
|
synchronized (channels) {
|
|
|
|
return channels.contains(channel);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public void open(int channel) throws LuaException {
|
|
|
|
synchronized (channels) {
|
|
|
|
if (!channels.contains(channel)) {
|
|
|
|
if (channels.size() >= 128) throw new LuaException("Too many open channels");
|
|
|
|
channels.add(channel);
|
|
|
|
setOpen(true);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public void close(int channel) {
|
|
|
|
synchronized (channels) {
|
|
|
|
channels.remove(channel);
|
|
|
|
if (channels.isEmpty()) setOpen(false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public void closeAll() {
|
|
|
|
synchronized (channels) {
|
|
|
|
channels.clear();
|
|
|
|
setOpen(false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|