int termGA(bus_t busnumber, int addr) { if (isInitializedGA(busnumber, addr)) { ga[busnumber].gastate[addr].state = 2; enqueueGA(busnumber, addr, 0, 0, 0); return SRCP_OK; } else { return SRCP_NODATA; } }
static int handle_setcheck(sessionid_t sessionid, bus_t bus, char *device, char *parameter, char *reply, int setorcheck) { struct timeval time; int rc = SRCP_UNSUPPORTEDDEVICEGROUP; *reply = 0x00; if (bus_has_devicegroup(bus, DG_GL) && strncasecmp(device, "GL", 2) == 0) { long laddr, direction, speed, maxspeed, f[29]; int func, i, anzparms; func = 0; /* We could provide a maximum of 32 on/off functions, but for now 28+1 will be good enough */ anzparms = sscanf(parameter, "%ld %ld %ld %ld %ld %ld %ld %ld " "%ld %ld %ld %ld %ld %ld %ld %ld %ld " "%ld %ld %ld %ld %ld %ld %ld %ld " "%ld %ld %ld %ld %ld %ld %ld %ld", &laddr, &direction, &speed, &maxspeed, &f[0], &f[1], &f[2], &f[3], &f[4], &f[5], &f[6], &f[7], &f[8], &f[9], &f[10], &f[11], &f[12], &f[13], &f[14], &f[15], &f[16], &f[17], &f[18], &f[19], &f[20], &f[21], &f[22], &f[23], &f[24], &f[25], &f[26], &f[27], &f[28]); for (i = 0; i < anzparms - 4; i++) { func += (f[i] ? 1 : 0) << i; } if (anzparms >= 4) { sessionid_t lockid = 0; /* Only if not locked or emergency stop !! */ cacheGetLockGL(bus, laddr, &lockid); if (lockid == 0 || lockid == sessionid || direction == 2) { rc = SRCP_OK; if (setorcheck == 1) rc = enqueueGL(bus, laddr, direction, speed, maxspeed, func); } else { rc = SRCP_DEVICELOCKED; } } else { rc = SRCP_LISTTOOSHORT; } } else if (bus_has_devicegroup(bus, DG_GA) && strncasecmp(device, "GA", 2) == 0) { long gaddr, port, aktion, delay; sessionid_t lockid; int anzparms; anzparms = sscanf(parameter, "%ld %ld %ld %ld", &gaddr, &port, &aktion, &delay); if (anzparms >= 4) { /* Port 0,1; Action 0,1 */ /* Only if not locked!! */ getlockGA(bus, gaddr, &lockid); if (lockid == 0 || lockid == sessionid) { rc = SRCP_OK; if (setorcheck == 1) rc = enqueueGA(bus, gaddr, port, aktion, delay); } else { rc = SRCP_DEVICELOCKED; } } else { rc = SRCP_LISTTOOSHORT; } } else if (bus_has_devicegroup(bus, DG_FB) && strncasecmp(device, "FB", 2) == 0) { long fbport, value; int anzparms; anzparms = sscanf(parameter, "%ld %ld", &fbport, &value); if (anzparms >= 2) { if (setorcheck == 1) rc = setFB(bus, fbport, value); } } /* SET 0 GM "<send_to_id> <reply_to_id> <message_type> <message>" */ else if (bus_has_devicegroup(bus, DG_GM) && strncasecmp(device, "GM", 2) == 0) { sessionid_t sendto, replyto; int result; char msg[MAXSRCPLINELEN]; memset(msg, 0, sizeof(msg)); /*TODO: scan also message type */ result = sscanf(parameter, "%lu %lu %990c", &sendto, &replyto, msg); if (result < 3) rc = SRCP_LISTTOOSHORT; else rc = setGM(sendto, replyto, msg); } /* SET <bus> SM "<decoderaddress> <type> <1 or more values>" */ else if (bus_has_devicegroup(bus, DG_SM) && strncasecmp(device, "SM", 2) == 0) { long addr, value1, value2, value3; int type; int result; char ctype[MAXSRCPLINELEN]; result = sscanf(parameter, "%ld %s %ld %ld %ld", &addr, ctype, &value1, &value2, &value3); if (result < 4) rc = SRCP_LISTTOOSHORT; else { type = -1; if (strcasecmp(ctype, "REG") == 0) type = REGISTER; else if (strcasecmp(ctype, "CV") == 0) type = CV; else if (strcasecmp(ctype, "CVBIT") == 0) type = CV_BIT; else if (strcasecmp(ctype, "PAGE") == 0) type = PAGE; if (type == -1) rc = SRCP_WRONGVALUE; else { if (type == CV_BIT) if (result < 5) rc = SRCP_LISTTOOSHORT; else rc = infoSM(bus, SET, type, addr, value1, value2, value3, reply); else rc = infoSM(bus, SET, type, addr, value1, 0, value2, reply); } } } else if (bus_has_devicegroup(bus, DG_TIME) && strncasecmp(device, "TIME", 4) == 0) { long d, h, m, s, nelem; nelem = sscanf(parameter, "%ld %ld %ld %ld", &d, &h, &m, &s); if (nelem >= 4) { rc = SRCP_OK; if (setorcheck == 1) rc = setTIME(d, h, m, s); } else rc = SRCP_LISTTOOSHORT; } else if (bus_has_devicegroup(bus, DG_LOCK) && strncasecmp(device, "LOCK", 4) == 0) { long int addr, duration; char devgrp[MAXSRCPLINELEN]; int nelem = -1; if (strlen(parameter) > 0) { nelem = sscanf(parameter, "%s %ld %ld", devgrp, &addr, &duration); syslog_bus(bus, DBG_INFO, "LOCK: %s", parameter); } if (nelem >= 3) { rc = SRCP_UNSUPPORTEDDEVICEGROUP; if (strncmp(devgrp, "GL", 2) == 0) { rc = SRCP_OK; if (setorcheck == 1) rc = cacheLockGL(bus, addr, duration, sessionid); } else if (strncmp(devgrp, "GA", 2) == 0) { rc = SRCP_OK; if (setorcheck == 1) rc = lockGA(bus, addr, duration, sessionid); } } else { rc = SRCP_LISTTOOSHORT; } } else if (bus_has_devicegroup(bus, DG_POWER) && strncasecmp(device, "POWER", 5) == 0) { int nelem; char state[5], msg[256]; memset(msg, 0, sizeof(msg)); nelem = sscanf(parameter, "%3s %100c", state, msg); if (nelem >= 1) { rc = SRCP_WRONGVALUE; if (strncasecmp(state, "OFF", 3) == 0) { rc = SRCP_OK; if (setorcheck == 1) rc = setPower(bus, 0, msg); } else if (strncasecmp(state, "ON", 2) == 0) { rc = SRCP_OK; if (setorcheck == 1) rc = setPower(bus, 1, msg); } } else { rc = SRCP_LISTTOOSHORT; } } gettimeofday(&time, NULL); srcp_fmt_msg(rc, reply, time); return rc; }