int transmit(int hc, int uc, int cmd) { int ret = 0, i = 0; unsigned char data[5]; char scratch[40]; dsyslog(LOG_INFO,"transmit: hc=0x%x, uc=0x%x, fc=0x%x\n",hc,uc,cmd); if (cmd >= X10_CMD_END){ dsyslog(LOG_INFO,"transmit: invalid fc\n"); return 1; } hc &= 0x0f; memset(data,0,sizeof(data)); i = 0; data[i++] = X10_PL_SENDCMD; data[i++] = housecode[hc] | 0x40; if (uc >= 0) data[i++] = unitcode[uc] | 0x40; if (cmd >= 0) data[i++] = functioncode[cmd] | 0x40; data[4] = X10_PL_REPEATONCE; if (sem_wait_timeout(&cts,timeout)) { syslog(LOG_INFO,"Timeout while waiting for transmitter\n"); syslog(LOG_INFO,"If this persists, restart daemon\n"); return -1; } if (startup()) { syslog(LOG_INFO,"unable to communicate with PowerLinc Transceiver\n"); ret = -1; goto done; } dsyslog(LOG_INFO,"sending %s\n",dumphex(scratch,(void *)data,sizeof(data))); ret = write(serial,data,sizeof(data)); dsyslog(LOG_INFO,"sleeping for %d microseconds\n",delay); usleep(delay*1000); done: sem_post(&cts); // enable transmitter return ret; }
int sem_trywait(sem_t *sem) { return sem_wait_timeout(sem, 0); }
int sem_wait(sem_t *sem) { return sem_wait_timeout(sem, INFINITE); }
int sem_wait(ACL_SEM *sem) { return sem_wait_timeout(sem, ACL_MUTEX_MAXWAIT); }
int sem_try_wait(ACL_SEM *sem) { return sem_wait_timeout(sem, 0); }