void CFrontend::sendMotorCommand(uint8_t cmdtype, uint8_t address, uint8_t command, uint8_t num_parameters, uint8_t parameter1, uint8_t parameter2, int repeat) { struct dvb_diseqc_master_cmd cmd; int i; fe_sec_tone_mode_t oldTone = currentToneMode; printf("[fe%d] sendMotorCommand: cmdtype = %x, address = %x, cmd = %x\n", fenumber, cmdtype, address, command); printf("[fe%d] sendMotorCommand: num_parms = %d, parm1 = %x, parm2 = %x\n", fenumber, num_parameters, parameter1, parameter2); cmd.msg[0] = cmdtype; //command type cmd.msg[1] = address; //address cmd.msg[2] = command; //command cmd.msg[3] = parameter1; cmd.msg[4] = parameter2; cmd.msg_len = 3 + num_parameters; secSetTone(SEC_TONE_OFF, 15); #if 0 fe_sec_voltage_t oldVoltage = currentVoltage; //secSetVoltage(config.highVoltage ? SEC_VOLTAGE_18 : SEC_VOLTAGE_13, 15); //secSetVoltage(SEC_VOLTAGE_13, 100); #endif for(i = 0; i <= repeat; i++) sendDiseqcCommand(&cmd, 50); //secSetVoltage(oldVoltage, 15); secSetTone(oldTone, 15); printf("[fe%d] motor command sent.\n", fenumber); }
void CFrontend::sendDiseqcZeroByteCommand(uint8_t framing_byte, uint8_t address, uint8_t command) { struct dvb_diseqc_master_cmd diseqc_cmd = { { framing_byte, address, command, 0x00, 0x00, 0x00 }, 3 }; sendDiseqcCommand(&diseqc_cmd, 15); }
void CFrontend::sendUncommittedSwitchesCommand(uint8_t usCommand) { struct dvb_diseqc_master_cmd cmd = {{ 0xe0, 0x10, 0x39, 0x00, 0x00, 0x00 }, 4}; //command from master, no reply required, first transmission //all families (don't care adress) //write to port group 1 (uncommitted switches) cmd.msg[3] = usCommand; sendDiseqcCommand(&cmd, 15); if (diseqcRepeats) { cmd.msg[0] = 0xe1; /* repeated transmission */ for (uint16_t i = 0; i < diseqcRepeats; i++) { usleep(1000 * 100); /* wait at least 100ms before retransmission */ sendDiseqcCommand(&cmd, 15); } } //DBG"[frontend] uncommitted switches command (0x%x) sent", cmd.msg[3]); }
void CFrontend::positionMotor(uint8_t motorPosition) { struct dvb_diseqc_master_cmd cmd; if (motorPosition != 0) { cmd.msg[0] = 0xE0; //command type cmd.msg[1] = 0x31; //address cmd.msg[2] = 0x6B; //command: goto stored motor position cmd.msg[3] = motorPosition; cmd.msg_len = 4; sendDiseqcCommand(&cmd, 15); printf("[frontend] motor positioning command sent.\n"); } }
void CFrontend::sendMotorCommand(uint8_t cmdtype, uint8_t address, uint8_t command, uint8_t num_parameters, uint8_t parameter1, uint8_t parameter2) { struct dvb_diseqc_master_cmd cmd; printf("[frontend] sendMotorCommand: cmdtype = %x, address = %x, cmd = %x\n", cmdtype, address, command); printf("[frontend] sendMotorCommand: num_parms = %d, parm1 = %x, parm2 = %x\n", num_parameters, parameter1, parameter2); cmd.msg[0] = cmdtype; //command type cmd.msg[1] = address; //address cmd.msg[2] = command; //command cmd.msg[3] = parameter1; cmd.msg[4] = parameter2; cmd.msg_len = 3 + num_parameters; sendDiseqcCommand(&cmd, 15); printf("[frontend] motor positioning command sent.\n"); }
void CFrontend::positionMotor(uint8_t motorPosition) { struct dvb_diseqc_master_cmd cmd = { {0xE0, 0x31, 0x6B, 0x00, 0x00, 0x00}, 4 }; if (motorPosition != 0) { secSetTone(SEC_TONE_OFF, 25); secSetVoltage(config.highVoltage ? SEC_VOLTAGE_18 : SEC_VOLTAGE_13, 15); cmd.msg[3] = motorPosition; for (int i = 0; i <= repeatUsals; ++i) sendDiseqcCommand(&cmd, 50); printf("[fe%d] motor positioning command sent.\n", fenumber); } }
void CFrontend::sendDiseqcSmatvRemoteTuningCommand(const uint32_t frequency) { /* * [0] from master, no reply, 1st transmission * [1] intelligent slave interface for multi-master bus * [2] write channel frequency * [3] frequency * [4] frequency * [5] frequency */ struct dvb_diseqc_master_cmd cmd = { { 0xe0, 0x71, 0x58, 0x00, 0x00, 0x00 }, 6 }; cmd.msg[3] = (((frequency / 10000000) << 4) & 0xF0) | ((frequency / 1000000) & 0x0F); cmd.msg[4] = (((frequency / 100000) << 4) & 0xF0) | ((frequency / 10000) & 0x0F); cmd.msg[5] = (((frequency / 1000) << 4) & 0xF0) | ((frequency / 100) & 0x0F); sendDiseqcCommand(&cmd, 15); }
void CFrontend::setSec(const uint8_t sat_no, const uint8_t pol, const bool high_band, const uint32_t frequency) { uint8_t repeats = diseqcRepeats; fe_sec_voltage_t v = (pol & 1) ? SEC_VOLTAGE_13 : SEC_VOLTAGE_18; fe_sec_tone_mode_t t = high_band ? SEC_TONE_ON : SEC_TONE_OFF; fe_sec_mini_cmd_t b = (sat_no & 1) ? SEC_MINI_B : SEC_MINI_A; /* * [0] from master, no reply, 1st transmission * [1] any lnb switcher or smatv * [2] write to port group 0 (committed switches) * [3] high nibble: reset bits, low nibble set bits * bits are: option, position, polarizaion, band */ struct dvb_diseqc_master_cmd cmd = { { 0xe0, 0x10, 0x38, 0x00, 0x00, 0x00 }, 4 }; cmd.msg[3] = 0xf0 | (((sat_no * 4) & 0x0f) | (high_band ? 1 : 0) | ((pol & 1) ? 0 : 2)); /* * set all SEC / DiSEqC parameters */ secSetTone(SEC_TONE_OFF, 15); secSetVoltage(v, 15); if ((diseqcType == DISEQC_1_1) && (uncommitted_switch_mode > 0)) { static uint8_t prevSatNo = 255; // initialised with greater than max Satellites (64) // because we only want to send uncommitted switch // command if necessary to save zap time DBG("new Sat %d previous Sat %d", sat_no, prevSatNo); //DBG("new Sat/4 %d previous Sat/4 %d", sat_no/4, prevSatNo/4); if ((prevSatNo/4 != sat_no/4) && (1 == uncommitted_switch_mode)) { sendUncommittedSwitchesCommand(0xF0 + sat_no/4); } else if ((prevSatNo != sat_no) && (2 == uncommitted_switch_mode)) { sendUncommittedSwitchesCommand(0xF0 + sat_no); } prevSatNo = sat_no; } if (diseqcType >= SMATV_REMOTE_TUNING) { #if HAVE_DVB_API_VERSION >= 3 if (diseqcType >= DISEQC_2_0) cmd.msg[0] |= 0x02; /* reply required */ sendDiseqcCommand(&cmd, 15); if (diseqcType >= DISEQC_2_0) repeats += getDiseqcReply(50); #else sendDiseqcCommand(&cmd, 15); #endif } if ((diseqcType >= DISEQC_1_1) && (repeats)) { for (uint16_t i = 0; i < repeats; i++) { usleep(1000 * 100); /* wait at least 100ms before retransmission */ if (0 == uncommitted_switch_mode) { cmd.msg[2] |= 0x01; /* uncommitted switches */ sendDiseqcCommand(&cmd, 15); } #if HAVE_DVB_API_VERSION >= 3 uint8_t again = 0; if (diseqcType >= DISEQC_2_0) again += getDiseqcReply(50); cmd.msg[0] |= 0x01; /* repeated transmission */ cmd.msg[2] &= 0xFE; /* committed switches */ sendDiseqcCommand(&cmd, 15); if (diseqcType >= DISEQC_2_0) again += getDiseqcReply(50); if (again == 2) repeats++; #else cmd.msg[0] |= 0x01; /* repeated transmission */ cmd.msg[2] &= 0xFE; /* committed switches */ sendDiseqcCommand(&cmd, 15); #endif } } if (diseqcType == SMATV_REMOTE_TUNING) sendDiseqcSmatvRemoteTuningCommand(frequency); if (diseqcType == MINI_DISEQC) sendToneBurst(b, 15); secSetTone(t, 15); currentTransponder.diseqc = sat_no; }