Exemplo n.º 1
0
// example
static void test_milstd_rt_main()
{
    // Подадрес для получения данных от КШ (КШ-ОУ)
    const unsigned char bc_subaddr_from = 8;
    // Подадрес для передачи данных в КШ (ОУ-КШ)
    const unsigned char bc_subaddr_to = 7;

    const int txIndex = MIL_STD_SUBADDR_WORD_INDEX(bc_subaddr_to);
    const int rxIndex = MIL_STD_SUBADDR_WORD_INDEX(bc_subaddr_from);

    mutex_lock(&mil_rt.lock);
    mil_std_tx_buffer[txIndex+0] = 0x30;
    mil_std_tx_buffer[txIndex+1] = 0x31;
    mil_std_tx_buffer[txIndex+2] = 0x32;
    mutex_unlock(&mil_rt.lock);

    int i=0;

    for (;;)
    {
        mutex_lock(&mil_rt.lock);
        for (i=0; i<3; ++i)
            ++mil_std_tx_buffer[txIndex + i];
        mutex_unlock(&mil_rt.lock);

        debug_printf("\n");

        debug_printf("rt(%d): dataToBeSent  =", mil_rt.port);
        for (i=0; i<3; ++i)
            debug_printf(" %x", mil_std_tx_buffer[txIndex + i]);
        debug_printf("\n");

        debug_printf("rt(%d): dataToBeRecvd =", mil_rt.port);
        for (i=0; i<3; ++i)
            debug_printf(" %x", mil_std_rx_buffer[rxIndex + i]);
        debug_printf("\n");

        mdelay(5000);
    }
}
Exemplo n.º 2
0
static bool_t status_handler(void *arg)
{
    milandr_mil1553_t *mil = (milandr_mil1553_t *)arg;
    MIL_STD_1553B_t   *reg = (MIL_STD_1553B_t *)mil->reg;
    int word;

    uint32_t flag = reg->STATUS;
    if (mil->mode == MIL_MODE_RT) {
        unsigned short answerWord = MIL_STD_STATUS_ADDR_OU(mil->addr_self);
        if (flag & MIL_STD_STATUS_ERR) {
            answerWord |= MIL_STD_STATUS_MSG_ERR;
            mil->nb_errors++;
        } else {
            const unsigned short comWrd1 = reg->CommandWord1;
            const unsigned short comWrd2 = reg->CommandWord2;
            const unsigned int msg = reg->MSG;
            // Подадрес из командного слова 1
            const unsigned char subaddr = (comWrd1 & MIL_STD_COMWORD_SUBADDR_MODE_MASK) >> MIL_STD_COMWORD_SUBADDR_MODE_SHIFT;
            // Код команды
            const unsigned int cmdCode = (comWrd1 & MIL_STD_COMWORD_WORDSCNT_CODE_MASK) >> MIL_STD_COMWORD_WORDSCNT_CODE_SHIFT;

            // Подадрес из командного слова 2
            const unsigned char subaddr2 = (comWrd2 & MIL_STD_COMWORD_SUBADDR_MODE_MASK) >> MIL_STD_COMWORD_SUBADDR_MODE_SHIFT;
            // Код команды
            const unsigned int cmdCode2 = (comWrd2 & MIL_STD_COMWORD_WORDSCNT_CODE_MASK) >> MIL_STD_COMWORD_WORDSCNT_CODE_SHIFT;


            // Количество слов данных в сообщении
            const unsigned char wordsCount = (cmdCode == 0 ? 32 : cmdCode);
            const unsigned char wordsCount2 = (cmdCode2 == 0 ? 32 : cmdCode2);

            switch (msg)
            {
            // приём данных от КШ (КШ-ОУ), формат сообщения 7
            case MSG_DATARECV__BC_RT__GROUP:
                answerWord |= MIL_STD_STATUS_GROUP_COMMAND_RECEIVED;
            // приём данных от КШ (КШ-ОУ), формат сообщения 1
            case MSG_DATARECV__BC_RT__SINGLE:
                // Получено достоверное слово из канала
                if ((flag & MIL_STD_STATUS_RFLAGN) != 0) {
                    // Установить ответное слово
                    mil->reg->StatusWord1 = answerWord;
                }
                if ((flag & MIL_STD_STATUS_VALMESS) != 0) {
                    mil->nb_words += wordsCount;
                    int index = MIL_STD_SUBADDR_WORD_INDEX(subaddr);
                    if (!mil->rxbuf[subaddr].busy) {
                        for (word = 0; word < wordsCount; ++word) {
                            mil->rxbuf[subaddr].data[word] = mil->reg->DATA[index + word] & 0xFFFF;
                        }
                        mil->rxbuf[subaddr].nb_words = wordsCount;
                    }
                }
                break;
            // приём данных от ОУ (ОУ-ОУ), формат сообщения 8
            case MSG_DATARECV__RT_RT__GROUP:
                answerWord |= MIL_STD_STATUS_GROUP_COMMAND_RECEIVED;
            // приём данных от ОУ (ОУ-ОУ), формат сообщения 3
            case MSG_DATARECV__RT_RT__SINGLE:
                // #4
                // Получено достоверное слово из канала
                if ((flag & MIL_STD_STATUS_RFLAGN) != 0)
                {
                    // Установить ответное слово
                    mil->reg->StatusWord1 = answerWord;
                }
                if ((flag & MIL_STD_STATUS_VALMESS) != 0) {
                    mil->nb_words += wordsCount;
                    // Прием от оконечного устройства
                    if (!mil->rxbuf[subaddr].busy) {
                        int index = MIL_STD_SUBADDR_WORD_INDEX(subaddr);
                        for (word = 0; word < wordsCount; ++word) {
                        	mil->rxbuf[subaddr].data[word] = mil->reg->DATA[index + word] & 0xFFFF;
                        }
                        mil->rxbuf[subaddr].nb_words = wordsCount;
                    }
                }
                break;
            // передача данных в КШ (ОУ-КШ), формат сообщения 2
            case MSG_DATASEND__RT_BC__SINGLE:
                // Получено достоверное слово из канала
                if ((flag & MIL_STD_STATUS_RFLAGN) != 0)
                {
                    // Установить ответное слово
                    mil->reg->StatusWord1 = answerWord;
                    if (!mil->txbuf[subaddr].busy) {
                        int index = MIL_STD_SUBADDR_WORD_INDEX(subaddr);
                        for (word = 0; word < wordsCount; ++word) {
                            mil->reg->DATA[index + word] = mil->txbuf[subaddr].data[word] & 0xFFFF;
                        }
                    }
                }
                if ((flag & MIL_STD_STATUS_VALMESS) != 0) {
                    mil->nb_words += wordsCount;
                }
                break;
            // передача данных в ОУ (ОУ-ОУ), формат сообщения 8
            case MSG_DATASEND__RT_RT__GROUP:
                answerWord |= MIL_STD_STATUS_GROUP_COMMAND_RECEIVED;
            // передача данных в ОУ (ОУ-ОУ), формат сообщения 3
            case MSG_DATASEND__RT_RT__SINGLE:
                // #1008 в оконечное устройство
                // Получено достоверное слово из канала
                if ((flag & MIL_STD_STATUS_RFLAGN) != 0)
                {
                    // Установить ответное слово
                    mil->reg->StatusWord1 = answerWord;
                    if (!mil->txbuf[subaddr2].busy) {
                        int index = MIL_STD_SUBADDR_WORD_INDEX(subaddr2);
                        for (word = 0; word < wordsCount2; ++word) {
                        	mil->reg->DATA[index + word] = mil->txbuf[subaddr2].data[word] & 0xFFFF;
                        }
                    }
                }
                if ((flag & MIL_STD_STATUS_VALMESS) != 0) {
                    mil->nb_words += wordsCount;
                }
                break;
            // команда управления 0-15 от КШ без слов данных, формат сообщения 9
            case MSG_CMD_WITH_NODATA__0_0xf__GROUP:
                answerWord |= MIL_STD_STATUS_GROUP_COMMAND_RECEIVED;
            // команда управления 0-15 от КШ без слов данных, формат сообщения 4
            case MSG_CMD_WITH_NODATA__0_0xf__SINGLE:
                // Получено достоверное слово из канала
                if ((flag & MIL_STD_STATUS_RFLAGN) != 0)
                {
                    // неподдерживаемые команды (резерв)
                    if (cmdCode >= 9 && cmdCode <= 0xf)
                    {
                        answerWord |= MIL_STD_STATUS_MSG_ERR;

                        // Установить ответное слово
                        mil->reg->StatusWord1 = answerWord;
                    }
                    else
                    {
                        // Команда "блокировать передатчик"
                        if (cmdCode == CMD_LockSender)
                        {
                            if ((flag & MIL_STD_STATUS_RCVA) != 0)
                            {
                                mil->reg->CONTROL &= ~MIL_STD_CONTROL_TRB;
                            }
                            else if ((flag & MIL_STD_STATUS_RCVB) != 0)
                            {
                                mil->reg->CONTROL &= ~MIL_STD_CONTROL_TRA;
                            }
                        }
                        // Команда "разблокировать передатчик"
                        else if (cmdCode == CMD_UnlockSender)
                        {
                            if ((flag & MIL_STD_STATUS_RCVA) != 0) {
                                mil->reg->CONTROL |= MIL_STD_CONTROL_TRB;
                            }
                            else if ((flag & MIL_STD_STATUS_RCVB) != 0) {
                                mil->reg->CONTROL |= MIL_STD_CONTROL_TRA;
                            }
                        }
                        // Команда "установить ОУ в исходное состояние"
                        else if (cmdCode == CMD_SetRtInitialState)
                        {
                            mil->reg->CONTROL |= MIL_STD_CONTROL_TRA;
                            mil->reg->CONTROL |= MIL_STD_CONTROL_TRB;
                        }
                        // Команды установить ответное слово (ответ на предыдущую груповую команду)
                        else if (cmdCode == CMD_SendAnswerWord)
                        {
                            answerWord = answerWordPreveous;
                        }
                        // Установить ответное слово
                        mil->reg->StatusWord1 = answerWord;
                    }
                }
                break;
            // команда управления 16-31 от КШ, ожидается слово данных (не групповая), формат сообщения 5
            case MSG_CMD_WITH_NODATA__0x10_0x1f__DATAWORD_EXPECTED__SINGLE:
                // Получено достоверное слово из канала
                if ((flag & MIL_STD_STATUS_RFLAGN) != 0)
                {
                    // неподдерживаемые команды (резерв)
                    if (cmdCode >= 0x16)
                    {
                        answerWord |= MIL_STD_STATUS_MSG_ERR;

                        // Установить ответное слово
                        mil->reg->StatusWord1 = answerWord;
                    }
                    else
                    {
                        if (cmdCode == CMD_SendLastCommand)
                        {
                            mil->reg->ModeData = commandWordPreveous;
                            answerWord = answerWordPreveous;
                        }
                        // Установить ответное слово
                        mil->reg->StatusWord1 = answerWord;
                    }
                }
                break;
            // команда управления 16-31 от КШ со словом данных, формат сообщения 10
            case MSG_CMD_WITH_DATA__0x10_0x1f__GROUP:
                answerWord |= MIL_STD_STATUS_GROUP_COMMAND_RECEIVED;
            // команда управления 16-31 от КШ со словом данных, формат сообщения 6
            case MSG_CMD_WITH_DATA__0x10_0x1f__SINGLE:
                // Получено достоверное слово из канала
                if ((flag & MIL_STD_STATUS_RFLAGN) != 0)
                {
                    // неподдерживаемые команды (резерв)
                    if (cmdCode >= 0x16)
                    {
                        answerWord |= MIL_STD_STATUS_MSG_ERR;

                        // Установить ответное слово
                        mil->reg->StatusWord1 = answerWord;
                    }
                    else
                    {
                        // Установить ответное слово
                        mil->reg->StatusWord1 = answerWord;
                    }
                }
                break;
            } // switch (msg)
            if (cmdCode != CMD_SendLastCommand)
            {
                commandWordPreveous = comWrd1;
            }
        } // else if (flag & MIL_STD_STATUS_ERR)
        answerWordPreveous = answerWord;
    } else {