2018-11-17 11:52:12 +00:00
|
|
|
/*
|
|
|
|
* This file is part of ComputerCraft - http://www.computercraft.info
|
2019-01-01 01:10:18 +00:00
|
|
|
* Copyright Daniel Ratcliffe, 2011-2019. 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;
|
|
|
|
|
|
|
|
import java.util.concurrent.atomic.AtomicBoolean;
|
|
|
|
|
|
|
|
public class ModemState
|
|
|
|
{
|
2019-01-19 10:16:41 +00:00
|
|
|
private final Runnable onChanged;
|
|
|
|
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()
|
|
|
|
{
|
|
|
|
this.onChanged = null;
|
|
|
|
}
|
|
|
|
|
|
|
|
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 );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|