[zb4osgi-changeset] [scm] ZigBee 4 OSGi repository change: r465 - /projects/zb4osgi/sandbox/manlio.bacco/org.aaloa.zb4osgi.zigbee.CC2530.driver/src/main/java/it/cnr/isti/zigbee/dongle/CC2530/impl/DriverCC2530.java
scm-notify at zb4osgi.aaloa.org
scm-notify at zb4osgi.aaloa.org
Mon Sep 24 17:36:31 CEST 2012
Author: manlio.bacco
Date: Mon Sep 24 17:36:31 2012
New Revision: 465
Log:
added LQI request management
cosmetic fixes
Modified:
projects/zb4osgi/sandbox/manlio.bacco/org.aaloa.zb4osgi.zigbee.CC2530.driver/src/main/java/it/cnr/isti/zigbee/dongle/CC2530/impl/DriverCC2530.java
Modified: projects/zb4osgi/sandbox/manlio.bacco/org.aaloa.zb4osgi.zigbee.CC2530.driver/src/main/java/it/cnr/isti/zigbee/dongle/CC2530/impl/DriverCC2530.java
==============================================================================
--- projects/zb4osgi/sandbox/manlio.bacco/org.aaloa.zb4osgi.zigbee.CC2530.driver/src/main/java/it/cnr/isti/zigbee/dongle/CC2530/impl/DriverCC2530.java (original)
+++ projects/zb4osgi/sandbox/manlio.bacco/org.aaloa.zb4osgi.zigbee.CC2530.driver/src/main/java/it/cnr/isti/zigbee/dongle/CC2530/impl/DriverCC2530.java Mon Sep 24 17:36:31 2012
@@ -80,6 +80,9 @@
import com.itaca.ztool.api.zdo.ZDO_MGMT_LEAVE_REQ;
import com.itaca.ztool.api.zdo.ZDO_MGMT_LEAVE_REQ_SRSP;
import com.itaca.ztool.api.zdo.ZDO_MGMT_LEAVE_RSP;
+import com.itaca.ztool.api.zdo.ZDO_MGMT_LQI_REQ;
+import com.itaca.ztool.api.zdo.ZDO_MGMT_LQI_REQ_SRSP;
+import com.itaca.ztool.api.zdo.ZDO_MGMT_LQI_RSP;
import com.itaca.ztool.api.zdo.ZDO_NODE_DESC_REQ;
import com.itaca.ztool.api.zdo.ZDO_NODE_DESC_REQ_SRSP;
import com.itaca.ztool.api.zdo.ZDO_NODE_DESC_RSP;
@@ -88,6 +91,7 @@
import com.itaca.ztool.api.zdo.ZDO_SIMPLE_DESC_RSP;
import com.itaca.ztool.api.zdo.ZDO_STARTUP_FROM_APP;
import com.itaca.ztool.api.zdo.ZDO_STARTUP_FROM_APP_SRSP;
+import com.itaca.ztool.api.zdo.ZDO_STATE_CHANGE_IND;
import com.itaca.ztool.api.zdo.ZDO_UNBIND_REQ;
import com.itaca.ztool.api.zdo.ZDO_UNBIND_REQ_SRSP;
import com.itaca.ztool.api.zdo.ZDO_UNBIND_RSP;
@@ -102,10 +106,10 @@
public class DriverCC2530 implements Runnable, SimpleDriver{
//private MasterResetGUI resetGUI;
- private final static Logger logger = LoggerFactory.getLogger(DriverCC2530.class);
+ private final static Logger logger = LoggerFactory.getLogger(DriverCC2530.class);
private final static Logger logger4Waiter = LoggerFactory.getLogger(WaitForCommand.class);
- public static final int RESEND_TIMEOUT_DEFAULT = 5000; // manlio 1000;
+ public static final int RESEND_TIMEOUT_DEFAULT = 1000;
public static final String RESEND_TIMEOUT_KEY = "zigbee.driver.tsb.resend.timeout";
public static final int RESEND_MAX_RESEND_DEFAULT = 3;
@@ -125,6 +129,7 @@
private short pan;
private byte channel;
private boolean cleanStatus;
+ //private boolean permitJoin;
private long TIMEOUT; // = 5000;//Activator.getCurrentConfiguration().getZigBeeTimeout();
@@ -159,6 +164,62 @@
l.notify(annunce.SrcAddr, annunce.IEEEAddr, annunce.NwkAddr, annunce.Capabilities);
}
}
+ else if(packet.getCMD().get16BitValue() == ZToolCMD.ZDO_STATE_CHANGE_IND){
+ try{
+ ZDO_STATE_CHANGE_IND p = ((ZDO_STATE_CHANGE_IND)packet);
+ /*DEV_HOLD=0x00, // Initialized - not started automatically
+ DEV_INIT=0x01, // Initialized - not connected to anything
+ DEV_NWK_DISC=0x02, // Discovering PAN's to join
+ DEV_NWK_JOINING=0x03, // Joining a PAN
+ DEV_NWK_=0x04, // ReJoining a PAN, only for end-devices
+ DEV_END_DEVICE_UNAUTH=0x05, // Joined but not yet authenticated by trust center
+ DEV_END_DEVICE=0x06, // Started as device after authentication
+ DEV_ROUTER=0x07, // Device joined, authenticated and is a router
+ DEV_COORD_STARTING=0x08, // Started as Zigbee Coordinator
+ DEV_ZB_COORD=0x09, // Started as Zigbee Coordinator
+ DEV_NWK_ORPHAN=0x0A // Device has lost information about its parent*/
+ switch (p.State) {
+ case 0:
+ logger.debug("Initialized - not started automatically");
+ break;
+ case 1:
+ logger.debug("Initialized - not connected to anything");
+ break;
+ case 2:
+ logger.debug("Discovering PANs to join or waiting for permit join");
+ break;
+ case 3:
+ logger.debug("Joining a PAN");
+ break;
+ case 4:
+ logger.debug("Rejoining a PAN, only for end-devices");
+ break;
+ case 5:
+ logger.debug("Joined but not yet authenticated by trust center");
+ break;
+ case 6:
+ logger.debug("Started as device after authentication");
+ break;
+ case 7:
+ logger.debug("Device joined, authenticated and is a router");
+ break;
+ case 8:
+ logger.debug("Started as Zigbee Coordinator");
+ break;
+ case 9:
+ logger.debug("Started as Zigbee Coordinator");
+ break;
+ case 10:
+ logger.debug("Device has lost information about its parent");
+ break;
+ default:
+ break;
+ }
+ }
+ catch(Exception ex){
+ // ignored
+ }
+ }
}
}
@@ -175,9 +236,9 @@
if(packet.getCMD().get16BitValue() == ZToolCMD.AF_INCOMING_MSG){
AF_INCOMING_MSG msg = (AF_INCOMING_MSG) packet;
if( listners.isEmpty() ){
- logger.debug("Recieved AF_INCOMING_MSG but no listeners. Message was: {} ", msg);
+ logger.debug("received AF_INCOMING_MSG but no listeners. Message was: {} ", msg);
} else {
- logger.debug("Recieved AF_INCOMING_MSG notifying {} listeners of {}", listners.size(), msg);
+ logger.debug("received AF_INCOMING_MSG notifying {} listeners of {}", listners.size(), msg);
}
ArrayList<AFMessageListner> localCopy = null;
synchronized (listners) {
@@ -196,7 +257,7 @@
}
}
- public DriverCC2530(String serialPort, int bitRate) throws ZToolException {
+ public DriverCC2530(String serialPort, int bitRate) throws ZToolException {
this(serialPort,bitRate,NetworkMode.Coordinator,0,19, false);
}
@@ -227,7 +288,7 @@
if(timeout > 0)
TIMEOUT_S = TIMEOUT = timeout;
else
- TIMEOUT_S = TIMEOUT = 10000;
+ TIMEOUT_S = TIMEOUT = 5000;
/* */
aux = RESEND_MAX_RESEND_DEFAULT;
@@ -253,6 +314,7 @@
setSerialPort(serialPort, bitRate);
setZigBeeNetwork((byte)channel, (short)pan);
setZigBeeNodeMode(mode);
+ //this.permitJoin = permitJoin;
//resetGUI=new MasterResetGUI(this);
//resetGUI.setVisible(true);
}
@@ -279,6 +341,10 @@
channel = ch;
pan = panId;
}
+
+ /*public boolean getPermitJoinMode(){
+ return this.permitJoin;
+ }*/
public void setSerialPort(String serialName,int bitRate) {
if ( state != DriverStatus.CLOSED ) {
@@ -313,7 +379,7 @@
}
logger.info("Closing");
if( Thread.currentThread() != driver ){
- logger.debug("Waiting for intialization operation to complete before closing.");
+ logger.debug("Waiting for initialization operation to complete before closing.");
try {
driver.join();
} catch (InterruptedException ignored) {
@@ -338,7 +404,72 @@
logger.info("Closed");
}
+ /*private boolean permitJoinRequest(){
+
+ try{
+ logger.debug("PERMIT JOIN enabled, will launch a ZDO_MGMT_PERMIT_JOIN_REQ command");
+ // ZDO_MGMT_PERMIT_JOIN_REQ(destination address, duration, TCSignificance)
+ ZDO_MGMT_PERMIT_JOIN_REQ req = new ZDO_MGMT_PERMIT_JOIN_REQ(ZToolAddress16.BROADCAST, 60, 0x00);
+ ZDO_MGMT_PERMIT_JOIN_REQ_SRSP response = sendPermitJoinRequest(req);
+ if(response == null){
+ logger.debug("No response for ZDO_MGMT_PERMIT_JOIN_REQ - is it a broadcast?");
+ }
+ else{
+ logger.debug("ZDO_MGMT_PERMIT_JOIN_REQ: "+response);
+ }
+ req = new ZDO_MGMT_PERMIT_JOIN_REQ(ZToolAddress16.ZNET_BROADCAST, 60, 0x00);
+ response = sendPermitJoinRequest(req);
+ if(response == null){
+ logger.debug("No response for ZDO_MGMT_PERMIT_JOIN_REQ - is it a broadcast?");
+ }
+ else{
+ logger.debug("ZDO_MGMT_PERMIT_JOIN_REQ: "+response);
+ }
+
+ this.permitJoin = false; // only first time
+ }
+ catch(Exception ex){
+ ex.printStackTrace();
+ }
+ }*/
+
+ public ZDO_MGMT_LQI_RSP sendLQIRequest(ZDO_MGMT_LQI_REQ request) {
+
+ /*boolean b = true;
+ if(this.permitJoin)
+ b = permitJoinRequest();
+
+ if(b){*/
+ if( waitForNetwork() == false ) return null;
+ ZDO_MGMT_LQI_RSP result = null;
+
+ waitAndLock3WayConversation(request);
+ final WaitForCommand waiter = new WaitForCommand(ZToolCMD.ZDO_MGMT_LQI_RSP, high);
+
+ logger.debug("Sending ZDO_MGMT_LQI_REQ {}", request);
+ ZDO_MGMT_LQI_REQ_SRSP response = (ZDO_MGMT_LQI_REQ_SRSP) sendSynchrouns(high, request);
+ if ( response == null || response.Status != 0 ) {
+ logger.debug("ZDO_MGMT_LQI_REQ failed, received {}", response);
+ waiter.cleanup();
+ } else {
+ result = (ZDO_MGMT_LQI_RSP) waiter.getCommand(TIMEOUT);
+ }
+ unLock3WayConversation(request);
+ return result;
+ /*}
+ else{
+ logger.debug("sendZDOIEEEAddressRequest not done - permit join failed.");
+ return null;
+ }*/
+ }
+
public ZDO_IEEE_ADDR_RSP sendZDOIEEEAddressRequest(ZDO_IEEE_ADDR_REQ request){
+
+ /*boolean b = true;
+ if(this.permitJoin)
+ b = permitJoinRequest();
+
+ if(b){*/
if( waitForNetwork() == false ) return null;
ZDO_IEEE_ADDR_RSP result = null;
@@ -348,16 +479,44 @@
logger.debug("Sending ZDO_IEEE_ADDR_REQ {}", request);
ZDO_IEEE_ADDR_REQ_SRSP response = (ZDO_IEEE_ADDR_REQ_SRSP) sendSynchrouns(high, request);
if ( response == null || response.Status != 0 ) {
- logger.debug("ZDO_IEEE_ADDR_REQ failed, recieved {}", response);
+ logger.debug("ZDO_IEEE_ADDR_REQ failed, received {}", response);
waiter.cleanup();
} else {
result = (ZDO_IEEE_ADDR_RSP) waiter.getCommand(TIMEOUT);
}
unLock3WayConversation(request);
return result;
- }
+ /*}
+ else{
+ logger.debug("sendZDOIEEEAddressRequest not done - permit join failed.");
+ return null;
+ }*/
+ }
+
+ /*public ZDO_MGMT_PERMIT_JOIN_REQ_SRSP sendPermitJoinRequest(ZDO_MGMT_PERMIT_JOIN_REQ request){
+
+ if( waitForNetwork() == false ) return null;
+ ZDO_MGMT_PERMIT_JOIN_REQ_SRSP result = null;
+
+ waitAndLock3WayConversation(request);
+ final WaitForCommand waiter = new WaitForCommand(ZToolCMD.ZDO_MGMT_PERMIT_JOIN_REQ_SRSP, high);
+
+ logger.debug("Sending ZDO_MGMT_PERMIT_JOIN_REQ {}", request);
+ result = (ZDO_MGMT_PERMIT_JOIN_REQ_SRSP) sendSynchrouns(high, request);
+ if ( result == null || result.Status != 0 ) {
+ //logger.debug("ZDO_MGMT_PERMIT_JOIN_REQ unsupported!");
+ //else
+ logger.debug("ZDO_MGMT_PERMIT_JOIN_REQ failed, received {}", result);
+ waiter.cleanup();
+ } else {
+ result = (ZDO_MGMT_PERMIT_JOIN_REQ_SRSP) waiter.getCommand(TIMEOUT);
+ }
+ unLock3WayConversation(request);
+ return result;
+ }*/
public ZDO_NODE_DESC_RSP sendZDONodeDescriptionRequest(ZDO_NODE_DESC_REQ request) {
+
if( waitForNetwork() == false ) return null;
ZDO_NODE_DESC_RSP result = null;
@@ -376,7 +535,7 @@
}
public ZDO_ACTIVE_EP_RSP sendZDOActiveEndPointRequest(ZDO_ACTIVE_EP_REQ request) {
-
+
if( waitForNetwork() == false ) return null;
ZDO_ACTIVE_EP_RSP result = null;
@@ -386,7 +545,7 @@
logger.debug("Sending ZDO_ACTIVE_EP_REQ {}", request);
ZDO_ACTIVE_EP_REQ_SRSP response = (ZDO_ACTIVE_EP_REQ_SRSP) sendSynchrouns(high, request);
if ( response == null || response.Status != 0 ) {
- logger.debug("ZDO_ACTIVE_EP_REQ failed, recieved {}", response);
+ logger.debug("ZDO_ACTIVE_EP_REQ failed, received {}", response);
waiter.cleanup();
} else {
result = (ZDO_ACTIVE_EP_RSP) waiter.getCommand(TIMEOUT);
@@ -534,29 +693,28 @@
static boolean initializeHardware(String portName, int boudRate) {
boolean result = false;
- final int recieved[] = new int[1];
+ final int received[] = new int[1];
final HWLowLevelDriver probingDriver = new HWLowLevelDriver();
final PacketListener monitor = new PacketListener(){
- public void packetRecieved(ZToolPacket packet) {
+ public void packetReceived(ZToolPacket packet) {
logger.debug("Received initializing SYS VERSION candidate");
if(packet.getCommandId() == ZToolCMD.SYS_VERSION_RESPONSE){
logger.debug("Initializing Hardware: Received correctly SYS_VERSION_RESPONSE");
- synchronized (recieved) {
- recieved[0] = 3;
+ synchronized (received) {
+ received[0] = 3;
}
} else if(packet.isError()){
logger.debug("Initializing Hardware: Received erroneous packet: {}",packet.getErrorMsg());
- synchronized (recieved) {
- recieved[0] += 1;
+ synchronized (received) {
+ received[0] += 1;
}
} else {
logger.debug("Initializing Hardware: Received {}",packet.getClass().getName());
- synchronized (recieved) {
- recieved[0] += 1;
+ synchronized (received) {
+ received[0] += 1;
}
}
}
-
};
probingDriver.addPacketListener(monitor);
try {
@@ -564,8 +722,8 @@
probingDriver.sendPacket(new SYS_VERSION());
final long ready = System.currentTimeMillis() + TIMEOUT_S; // manlio 5000;
while(ready > System.currentTimeMillis()){
- synchronized (recieved) {
- if( recieved[0] == 3 ){
+ synchronized (received) {
+ if( received[0] == 3 ){
logger.debug("Received initializing SYS VERSION");
break;
}
@@ -578,8 +736,8 @@
}
}
logger.debug("End of waiting for SYS VERSION");
- synchronized (recieved) {
- if( recieved[0] == 3 ){
+ synchronized (received) {
+ if( received[0] == 3 ){
logger.debug("Succeeded initializing SYS VERSION");
result = true;
}
@@ -634,13 +792,13 @@
}
public void receivedAsynchrounsCommand(ZToolPacket packet) {
- logger4Waiter.info("Recieved a packet {} and waiting for {}", packet.getCMD(), waitFor);
- logger4Waiter.debug("Recieved {} {}", packet.getClass(), packet.toString());
+ logger4Waiter.info("received a packet {} and waiting for {}", packet.getCMD(), waitFor);
+ logger4Waiter.debug("received {} {}", packet.getClass(), packet.toString());
if( packet.isError() ) return;
if( packet.getCMD().get16BitValue() != waitFor) return;
synchronized (result) {
result[0]=packet;
- logger4Waiter.info("Recieved packet that we were waiting for");
+ logger4Waiter.info("received packet that we were waiting for");
cleanup();
}
}
@@ -653,11 +811,10 @@
result.wait(wakeUpTime-System.currentTimeMillis());
} catch (InterruptedException ignored) {
}
-
}
}
if( result[0] == null ){
- logger4Waiter.warn("Timeout {} expired and not packet with {} recieved", timeout, waitFor);
+ logger4Waiter.warn("Timeout {} expired and no packet with {} received", timeout, waitFor);
}
cleanup();
return result[0];
@@ -728,10 +885,10 @@
}
}
- public void packetRecieved(ZToolPacket packet) {
+ public void packetReceived(ZToolPacket packet) {
if(packet.isError()) return;
if((packet.getCommandId() & 0xFFFF) == waitingList[idx]){
- logger.info("Recieved packet that was waiting for increasing waitingList");
+ logger.info("received packet that was waiting for increasing waitingList");
synchronized (waitingList) {
if ( packetHistory != null ) {
packetHistory[idx] = packet;
@@ -791,9 +948,25 @@
return result;
}
- private boolean dongleSetCleanState(boolean clean){
+ private boolean dongleSetCleanState(boolean clean){ //TODO manlio
ZB_WRITE_CONFIGURATION_RSP response;
- if(clean){
+ /*if(this.permitJoin){
+ response = (ZB_WRITE_CONFIGURATION_RSP) sendSynchrouns(
+ high,
+ new ZB_WRITE_CONFIGURATION(
+ ZB_WRITE_CONFIGURATION.CONFIG_ID.ZCD_NV_STARTUP_OPTION,
+ new int[]{0x00000004}
+ )
+ );
+
+ if( response == null || response.Status != 0) {
+ logger.info("Couldn't set ZCD_NV_STARTUP_OPTION to ZCD_NV_START_DELAY");
+ return false;
+ }else{
+ logger.info("Set ZCD_NV_STARTUP_OPTION to ZCD_NV_START_DELAY");
+ }
+ }
+ else*/ if(clean){
response = (ZB_WRITE_CONFIGURATION_RSP) sendSynchrouns(
high,
new ZB_WRITE_CONFIGURATION(
@@ -836,15 +1009,6 @@
private boolean dongleSetChannel(int[] channelMask) {
- logger.info(
- "Setting the channel to {}{}{}{}", new Object[]{
- Integer.toHexString(channelMask[0]),
- Integer.toHexString(channelMask[1]),
- Integer.toHexString(channelMask[2]),
- Integer.toHexString(channelMask[3])
- }
- );
-
ZB_WRITE_CONFIGURATION_RSP response =
(ZB_WRITE_CONFIGURATION_RSP) sendSynchrouns(
high,
@@ -870,7 +1034,7 @@
}
private boolean dongleSetNetworkMode(){
-
+
logger.info("Changing the Network Mode to {}", mode);
ZB_WRITE_CONFIGURATION_RSP response =
@@ -942,7 +1106,6 @@
return false;
} else {
//return true;//TODO: response.Status == ZDO_STARTUP_FROM_APP_SRSP.AF_STATUS.SUCCESS;
- logger.debug("doEndDeviceCreateNetwok: received "+response.Status+".");
return true;
}
}
@@ -969,7 +1132,6 @@
if ( response2 == null ) {
return false;
} else {
- logger.debug("doCoordinatorCreateNetwork: received "+response.Status+".");
return true;//TODO response.Status == ZDO_STARTUP_FROM_APP_SRSP.AF_STATUS.SUCCESS;
}
}
@@ -1039,7 +1201,7 @@
logger.warn(
"The channel configuration differ from the channel configuration in use: " +
"in use {}, while the configured is {}.\n" +
- "The ZigBee Stack shuold be flushed, try to set "+ConfigurationProperties.NETWORK_FLUSH+" to TRUE",
+ "The ZigBee Stack should be flushed, try to set "+ConfigurationProperties.NETWORK_FLUSH+" to TRUE",
value, channel
);
mismatch = true;
@@ -1048,7 +1210,7 @@
logger.warn(
"The PanId configuration differ from the channel configuration in use: " +
"in use {}, while the configured is {}.\n" +
- "The ZigBee Stack shuold be flushed, try to set "+ConfigurationProperties.NETWORK_FLUSH+" to TRUE",
+ "The ZigBee Stack should be flushed, try to set "+ConfigurationProperties.NETWORK_FLUSH+" to TRUE",
value, pan
);
mismatch = true;
@@ -1156,7 +1318,7 @@
logger.debug("Sending ZDO_IEEE_ADDR_REQ");
ZDO_IEEE_ADDR_REQ_SRSP response = (ZDO_IEEE_ADDR_REQ_SRSP) sendSynchrouns(high, new ZDO_IEEE_ADDR_REQ(addresses[k],ZDO_IEEE_ADDR_REQ.REQ_TYPE.EXTENDED.getValue(),0));
if ( response == null || response.Status != 0 ) {
- logger.debug("ZDO_IEEE_ADDR_REQ failed, recieved {}", response);
+ logger.debug("ZDO_IEEE_ADDR_REQ failed, received {}", response);
waiter.cleanup();
} else {
responseA4 = (ZDO_IEEE_ADDR_RSP) waiter.getCommand(TIMEOUT);
@@ -1229,7 +1391,7 @@
SynchrounsCommandListner listener = new SynchrounsCommandListner() {
public void receivedCommandResponse(ZToolPacket packet) {
- logger.info("Recieved Synchrouns Response {}", packet.getClass().getName());
+ logger.info("received Synchrouns Response {}", packet.getClass().getName());
synchronized (response) {
response[0] = packet;
response.notify();
@@ -1240,7 +1402,7 @@
while( sending <= RESEND_MAX_RETRY ){
try {
hwDriver.sendSynchrounsCommand(request, listener, RESEND_TIMEOUT);
- logger.info("Sent {} during the {}-th tenative", request.getClass().getName(),sending);
+ logger.info("Sent {} during the {}-th tentative", request.getClass().getName(),sending);
synchronized (response) {
long wakeUpTime = System.currentTimeMillis() + RESEND_TIMEOUT;
while(response[0] == null && wakeUpTime > System.currentTimeMillis()){
@@ -1256,18 +1418,18 @@
}
}
if ( response[0] != null ) {
- logger.debug("Recieved synchrouns command {} before timout", response[0]);
+ logger.debug("received synchrouns command {} before timout", response[0]);
} else {
- logger.debug("Timeout fired and not synchrouns command recieved", response[0]);
+ logger.debug("Timeout fired and not synchrouns command received", response[0]);
}
if ( RESEND_ONLY_EXCEPTION ) {
break;
}else{
- logger.info("Failed to send {} during the {}-th tenative", request.getClass().getName(),sending);
+ logger.info("Failed to send {} during the {}-th tentative", request.getClass().getName(),sending);
sending++;
}
}catch(IOException ignored){
- logger.info("Failed to send {} during the {}-th tenative", request.getClass().getName(),sending);
+ logger.info("Failed to send {} during the {}-th tentative", request.getClass().getName(),sending);
logger.debug("Sending operation failed due to ", ignored);
sending++;
}
@@ -1546,4 +1708,8 @@
public DriverStatus getDriverStatus() {
return state;
}
+
+ /*public void setPermitJoin(boolean permitJoin) {
+ this.permitJoin = permitJoin;
+ }*/
}
More information about the Commit
mailing list