/* * Copyright (C) 2023 Texas Instruments Incorporated * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * Neither the name of Texas Instruments Incorporated nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #include #include #include #include #include "ti_drivers_open_close.h" #include "ti_board_open_close.h" #include #define PRUICSS_SLICEx PRUICSS_PRUx #if PRUICSS_SLICEx #define PRUICSS_TXPRUx PRUICSS_TX_PRU1 #define PRUICSS_RTUPRUx PRUICSS_RTU_PRU1 #else #define PRUICSS_TXPRUx PRUICSS_TX_PRU0 #define PRUICSS_RTUPRUx PRUICSS_RTU_PRU0 #endif #if (CONFIG_BISSC0_MODE == BISSC_MODE_MULTI_CHANNEL_SINGLE_PRU) #include #endif #if (CONFIG_BISSC0_CHANNEL0) && (CONFIG_BISSC0_LOAD_SHARE_MODE) #include #endif #if (CONFIG_BISSC0_CHANNEL1) && (CONFIG_BISSC0_LOAD_SHARE_MODE) #include #endif #if (CONFIG_BISSC0_CHANNEL2) && (CONFIG_BISSC0_LOAD_SHARE_MODE) #include #endif #if (CONFIG_BISSC0_MODE == BISSC_MODE_SINGLE_CHANNEL_SINGLE_PRU) #include #endif #define WAIT_5_SECOND (5000) #define WAIT_2_SECOND (2000) struct bissc_priv *priv; /** \brief Global Structure pointer holding PRUICSS1 memory Map. */ PRUICSS_Handle gPruIcssXHandle; int32_t multichannel = 0, totalchannels = 0, mask = 0, loadshare = 0; static void bissc_pruicss_init(void) { int32_t status = SystemP_FAILURE; int32_t size; gPruIcssXHandle = PRUICSS_open(CONFIG_PRU_ICSS0); /* Configure g_mux_en to 1 in ICSSG_SA_MX_REG Register. */ status = PRUICSS_setSaMuxMode(gPruIcssXHandle, PRUICSS_SA_MUX_MODE_SD_ENDAT); DebugP_assert(SystemP_SUCCESS == status); /* clear ICSS0 PRUx data RAM */ size = PRUICSS_initMemory(gPruIcssXHandle, PRUICSS_DATARAM(PRUICSS_PRUx)); DebugP_assert(size); if(loadshare) { status = PRUICSS_disableCore(gPruIcssXHandle, PRUICSS_RTUPRUx); DebugP_assert(SystemP_SUCCESS == status); status = PRUICSS_disableCore(gPruIcssXHandle, PRUICSS_TXPRUx); DebugP_assert(SystemP_SUCCESS == status); } status = PRUICSS_disableCore(gPruIcssXHandle, PRUICSS_PRUx); DebugP_assert(SystemP_SUCCESS == status); } int32_t bissc_pruicss_load_run_fw(struct bissc_priv *priv, uint8_t mask) { int32_t status = SystemP_FAILURE, size; #if (CONFIG_BISSC0_LOAD_SHARE_MODE) /*enable loadshare mode*/ #if(CONFIG_BISSC0_CHANNEL0) status = PRUICSS_disableCore(gPruIcssXHandle, PRUICSS_RTUPRUx); DebugP_assert(SystemP_SUCCESS == status); size = PRUICSS_writeMemory(gPruIcssXHandle, PRUICSS_IRAM_RTU_PRU(PRUICSS_SLICEx), 0, (uint32_t *) BiSSFirmwareMultiMakeRTU_0, sizeof(BiSSFirmwareMultiMakeRTU_0)); DebugP_assert(size); status = PRUICSS_resetCore(gPruIcssXHandle, PRUICSS_RTUPRUx); DebugP_assert(SystemP_SUCCESS == status); status = PRUICSS_enableCore(gPruIcssXHandle, PRUICSS_RTUPRUx); DebugP_assert(SystemP_SUCCESS == status); #endif #if(CONFIG_BISSC0_CHANNEL1) status=PRUICSS_disableCore(gPruIcssXHandle, PRUICSS_PRUx ); DebugP_assert(SystemP_SUCCESS == status); size = PRUICSS_writeMemory(gPruIcssXHandle, PRUICSS_IRAM_PRU(PRUICSS_SLICEx), 0, (uint32_t *) BiSSFirmwareMultiMakePRU_0, sizeof(BiSSFirmwareMultiMakePRU_0)); DebugP_assert(size); status = PRUICSS_resetCore(gPruIcssXHandle, PRUICSS_PRUx); DebugP_assert(SystemP_SUCCESS == status); status = PRUICSS_enableCore(gPruIcssXHandle, PRUICSS_PRUx); DebugP_assert(SystemP_SUCCESS == status); #endif #if(CONFIG_BISSC0_CHANNEL2) status = PRUICSS_disableCore(gPruIcssXHandle, PRUICSS_TXPRUx); DebugP_assert(SystemP_SUCCESS == status); size = PRUICSS_writeMemory(gPruIcssXHandle, PRUICSS_IRAM_TX_PRU(PRUICSS_SLICEx), 0, (uint32_t *) BiSSFirmwareMultiMakeTXPRU_0, sizeof(BiSSFirmwareMultiMakeTXPRU_0)); DebugP_assert(size); status = PRUICSS_resetCore(gPruIcssXHandle, PRUICSS_TXPRUx); DebugP_assert(SystemP_SUCCESS == status); status = PRUICSS_enableCore(gPruIcssXHandle, PRUICSS_TXPRUx); DebugP_assert(SystemP_SUCCESS == status); #endif #else status = PRUICSS_disableCore(gPruIcssXHandle, PRUICSS_PRUx); DebugP_assert(SystemP_SUCCESS == status); #if(CONFIG_BISSC0_MODE == BISSC_MODE_MULTI_CHANNEL_SINGLE_PRU) size = PRUICSS_writeMemory(gPruIcssXHandle, PRUICSS_IRAM_PRU(PRUICSS_PRUx), 0, (uint32_t *) BiSSFirmwareMulti_0, sizeof(BiSSFirmwareMulti_0)); #else size = PRUICSS_writeMemory(gPruIcssXHandle, PRUICSS_IRAM_PRU(PRUICSS_PRUx), 0, (uint32_t *) BiSSFirmware_0, sizeof(BiSSFirmware_0)); #endif DebugP_assert(size); status = PRUICSS_resetCore(gPruIcssXHandle, PRUICSS_PRUx); DebugP_assert(SystemP_SUCCESS == status); /*Run firmware */ status = PRUICSS_enableCore(gPruIcssXHandle, PRUICSS_PRUx); DebugP_assert(SystemP_SUCCESS == status); #endif /* check initialization ack from firmware, with a timeout of 5 second */ status = bissc_wait_for_fw_initialization(priv, WAIT_5_SECOND, mask); return status; } uint64_t bissc_get_fw_version(void) { #if (CONFIG_BISSC0_MODE == BISSC_MODE_MULTI_CHANNEL_SINGLE_PRU) return *((unsigned long *)BiSSFirmwareMulti_0 + 2); #endif #if (CONFIG_BISSC0_CHANNEL0) && (CONFIG_BISSC0_LOAD_SHARE_MODE) return *((unsigned long *)BiSSFirmwareMultiMakeRTU_0 + 2); #endif #if (CONFIG_BISSC0_CHANNEL1) && (CONFIG_BISSC0_LOAD_SHARE_MODE) return *((unsigned long *)BiSSFirmwareMultiMakePRU_0 + 2); #endif #if (CONFIG_BISSC0_CHANNEL2) && (CONFIG_BISSC0_LOAD_SHARE_MODE) return *((unsigned long *)BiSSFirmwareMultiMakeTXPRU_0 + 2); #endif #if (CONFIG_BISSC0_MODE == BISSC_MODE_SINGLE_CHANNEL_SINGLE_PRU) return *((unsigned long *)BiSSFirmware_0 + 2); #endif } static int32_t bissc_clock_config(uint32_t frequency, struct bissc_priv *priv) { struct bissc_clk_cfg clk_cfg; int32_t status = SystemP_FAILURE; if(bissc_calc_clock(frequency, &clk_cfg) < 0) { return SystemP_FAILURE; } DebugP_logInfo("\r| clock config values - tx_div: %u\trx_div: %u\trx_div_attr: %x\n", clk_cfg.tx_div, clk_cfg.rx_div, clk_cfg.rx_div_attr); bissc_update_max_proc_delay(priv, frequency); bissc_config_endat_mode(priv); bissc_config_clock(priv, &clk_cfg); bissc_config_clr_cfg0(priv); status = bissc_wait_measure_proc_delay(priv, WAIT_5_SECOND); return status; } static void bissc_display_menu(void) { DebugP_log("\r\n|------------------------------------------------------------------------------|"); DebugP_log("\r\n| Select input parametes |"); DebugP_log("\r\n|------------------------------------------------------------------------------|"); DebugP_log("\r\n| 1 : Number of position data bits |"); DebugP_log("\r\n| 2 : Select clock frequency in MHz(1/2/5/8/10) |"); DebugP_log("\r\n| 3 : Encoder send position values |"); DebugP_log("\r\n| 4 : Hex equivalent of control command(in hex) |"); DebugP_log("\r\n| 5 : Loop over BiSS-C cycles |"); DebugP_log("\r\n| 0 : Exit the application |"); DebugP_log("\r\n|------------------------------------------------------------------------------|"); DebugP_log("\r\n| enter value:\r\n"); } void bissc_get_enc_data_len(struct bissc_priv *priv){ int32_t pru_num, totalprus; uint32_t single_turn_len[3] = {0}, multi_turn_len[3] = {0}; priv->num_slaves[0] = 0; priv->num_slaves[1] = 0; priv->num_slaves[2] = 0; if(priv->load_share) totalprus = priv->totalchannels; else totalprus = 1; for(pru_num = 0; pru_num < totalprus; pru_num++){ DebugP_log("\r\nPlease enter encoder lengths connected to Ch %d:\n", priv->channel[pru_num]); DebugP_log("\r\nPlease enter 1st encoder single turn length\n"); DebugP_scanf("%u\n", &single_turn_len[0]); if(single_turn_len[0]){ DebugP_log("\r\nPlease enter 1st encoder multiturn length, 0 if not multiturn\n"); DebugP_scanf("%u\n", &multi_turn_len[0]); } DebugP_log("\r\nPlease enter 0 as data length if daisy chain is not used\n"); DebugP_log("\r\nPlease enter 2nd encoder single turn length\n"); DebugP_scanf("%u\n", &single_turn_len[1]); if(single_turn_len[1]){ DebugP_log("\r\nPlease enter 2nd encoder multiturn length, 0 if not multiturn\n"); DebugP_scanf("%u\n", &multi_turn_len[1]); } if(single_turn_len[1]){ DebugP_log("\r\nPlease enter 3rd encoder single turn length\n"); DebugP_scanf("%u\n", &single_turn_len[2]); if(single_turn_len[2]){ DebugP_log("\r\nPlease enter 3rd encoder multiturn length, 0 if not multiturn\n"); DebugP_scanf("%u\n", &multi_turn_len[2]); } } bissc_update_data_len(priv, single_turn_len, multi_turn_len, pru_num); } } static int bissc_get_command() { uint32_t cmd; DebugP_scanf("%d\n", &cmd); /* Check to make sure that the command issued is correct */ if( cmd < 0 || cmd > 5) { DebugP_log("\r\n| WARNING: invalid option try again\n"); return SystemP_FAILURE; } return cmd; } void bissc_main(void *args) { int32_t i, totalprus, ch_num, ls_ch = 0, pru_num; uint64_t icssgclk; int32_t ch = 0; if(CONFIG_BISSC0_LOAD_SHARE_MODE){ loadshare = 1; } /* Open drivers to open the UART driver for console */ Drivers_open(); Board_driversOpen(); /*C16 pin High for Enabling ch0 in booster pack */ #if (CONFIG_BISSC0_BOOSTER_PACK) #if (CONFIG_BISSC0_CHANNEL0) GPIO_setDirMode(ENC0_EN_BASE_ADDR, ENC0_EN_PIN, ENC0_EN_DIR); GPIO_pinWriteHigh(ENC0_EN_BASE_ADDR, ENC0_EN_PIN); #endif #if (CONFIG_BISSC0_CHANNEL1) GPIO_setDirMode(ENC1_EN_BASE_ADDR, ENC1_EN_PIN, ENC1_EN_DIR); GPIO_pinWriteHigh(ENC1_EN_BASE_ADDR, ENC1_EN_PIN); #endif #if (CONFIG_BISSC0_CHANNEL2) GPIO_setDirMode(ENC2_EN_BASE_ADDR, ENC2_EN_PIN, ENC2_EN_DIR); GPIO_pinWriteHigh(ENC2_EN_BASE_ADDR, ENC2_EN_PIN); #endif #endif i = bissc_get_fw_version(); DebugP_log("\n\n"); DebugP_log("BiSS-C firmware \t: %x.%x.%x (%s)\n", (i >> 24) & 0x7F, (i >> 16) & 0xFF, i & 0xFFFF, i & (1 << 31) ? "internal" : "release"); bissc_pruicss_init(); i = CONFIG_BISSC0_CHANNEL0 & 0; i += CONFIG_BISSC0_CHANNEL1; i += CONFIG_BISSC0_CHANNEL2<<1; if(i < 0 || i > 2) { DebugP_log("\r\nWARNING: invalid channel selected, defaulting to Channel 0\n"); i = 0; } mask = CONFIG_BISSC0_CHANNEL0<<0 | CONFIG_BISSC0_CHANNEL1<<1 | CONFIG_BISSC0_CHANNEL2<<2; totalchannels = (CONFIG_BISSC0_CHANNEL0 + CONFIG_BISSC0_CHANNEL1 + CONFIG_BISSC0_CHANNEL2); if(CONFIG_BISSC0_MODE == BISSC_MODE_MULTI_CHANNEL_SINGLE_PRU){ multichannel = 1; } DebugP_log("\r\n\n"); priv = bissc_init(gPruIcssXHandle, PRUICSS_PRUx, CONFIG_BISSC0_BAUDRATE); bissc_config_channel(priv, mask, totalchannels); if(loadshare){ bissc_config_load_share(priv, mask, loadshare); } /* Read the ICSSG configured clock frequency. */ if(gPruIcssXHandle->hwAttrs->instance) { SOC_moduleGetClockFrequency(TISCI_DEV_PRU_ICSSG1, TISCI_DEV_PRU_ICSSG1_CORE_CLK, &icssgclk); } else { SOC_moduleGetClockFrequency(TISCI_DEV_PRU_ICSSG0, TISCI_DEV_PRU_ICSSG0_CORE_CLK, &icssgclk); } bissc_set_default_initialization(priv,CONFIG_BISSC0_BAUDRATE, icssgclk); if(CONFIG_BISSC0_MODE == BISSC_MODE_MULTI_CHANNEL_MULTI_PRU){ DebugP_log("\r\nBiSS-C Load Share Demo application is running......\n"); for(pru_num = 0; pru_num < totalchannels; pru_num++) DebugP_log("\r\nChannel %d is enabled\n", priv->channel[pru_num]); } else if(CONFIG_BISSC0_MODE == BISSC_MODE_MULTI_CHANNEL_SINGLE_PRU){ DebugP_log("\r\nBiSS-C Multi channel, Single PRU Demo application is running......\n"); for(ch_num = 0; ch_num < totalchannels; ch_num++) DebugP_log("\r\nChannel %d is enabled\n", priv->channel[ch_num]); } else{ DebugP_log("\r\nBiSS-C Single channel, Single PRU Demo application is running......\n"); DebugP_log("\r\nChannel %d is enabled\n", priv->channel[0]); } bissc_get_enc_data_len(priv); i = bissc_pruicss_load_run_fw(priv, mask); if(i < 0) { DebugP_log("\r\nERROR: BiSS-C initialization failed \n"); DebugP_log("\r\ncheck whether encoder is connected and ensure proper connections\n"); DebugP_log("\r\nexit %s due to failed firmware initialization\n", __func__); goto deinit; } if(!loadshare && multichannel){ if(priv->pruicss_xchg->proc_delay[priv->channel[0]] == priv->pruicss_xchg->proc_delay[priv->channel[1]]){ if(priv->totalchannels > 2){ if(priv->pruicss_xchg->proc_delay[priv->channel[1]] != priv->pruicss_xchg->proc_delay[priv->channel[2]]) { DebugP_log("\r\n Encoders connected accross channels have different processing delays, multi channel configuration is not supported\n"); goto deinit; } } } else{ DebugP_log("\r\n Encoders connected accross channels have different processing delays, multi channel configuration is not supported\n"); goto deinit; } } DebugP_log("\r\nBiSS-C encoder/encoders detected and running at frequency %dMHz\n", CONFIG_BISSC0_BAUDRATE); for( ch_num = 0; ch_num < totalchannels; ch_num++){ DebugP_log("\r\nProcessing Delay for Ch %d : %u\n",priv->channel[ch_num], priv->pruicss_xchg->proc_delay[priv->channel[ch_num]]); } while(1) { int32_t cmd, ret; uint32_t freq, ctrl_cmd[3]={0}; uint32_t loop_cnt; bissc_display_menu(); cmd = bissc_get_command(); if(cmd < 0) { continue; } else if(cmd == 0) { DebugP_log("\r\tGood bye!\n"); break; } else if(cmd == 1) { bissc_get_enc_data_len(priv); } else if(cmd == 2) { DebugP_log("\r\nPlease enter frequency in MHz:\n"); DebugP_scanf("%u\n", &freq); if(!((freq == 1) || (freq == 2) || (freq == 5) || (freq == 8) || (freq == 10))) { DebugP_log("\r\n CLK divisors will not be possible. Please provide valid freq: 1/2/5/8/10 \n"); continue; } ret = bissc_clock_config(freq, priv); if(ret < 0) { DebugP_log("\r\n ERROR: Processing time measurement failed \n"); DebugP_log("\r\n check whether encoder is connected and ensure proper connections \n"); DebugP_log("\r\n Good bye!\n"); break; } ClockP_sleep(2); } else if(cmd == 3) { ret = bissc_get_pos_res(priv); if(ret < 0) { DebugP_log("\r\n ERROR: Position data measurement failed \n"); } for(ch_num = 0; ch_num < priv->totalchannels; ch_num++) { ch = priv->channel[ch_num]; if(loadshare) ls_ch = ch; else ls_ch = 0; DebugP_log("\r\n Channel %d:\n", ch); if(priv->multi_turn_len[ls_ch][0]){ DebugP_log("\r\n Encoder-1 Multiturn rev: %u, Angle: %.12f, crc: %x, otf crc: %x, e_w: %x\n", priv->enc_pos_data[ch].num_of_turns[0], priv->enc_pos_data[ch].angle[0], priv->enc_pos_data[ch].rcv_crc[0], priv->enc_pos_data[ch].otf_crc[0], priv->enc_pos_data[ch].ew[0]); } else{ DebugP_log("\r\n Encoder-1 Singleturn Angle: %.12f, crc: %x, otf crc: %x, e_w: %x\n", priv->enc_pos_data[ch].angle[0], priv->enc_pos_data[ch].rcv_crc[0], priv->enc_pos_data[ch].otf_crc[0], priv->enc_pos_data[ch].ew[0]); } DebugP_log("\r\n CRC Status: %s, crc error count: %u\n", (priv->enc_pos_data[ch].rcv_crc[0] == priv->enc_pos_data[ch].otf_crc[0]) ? "success" : "failure" , priv->pd_crc_err_cnt[ch][0]); if(priv->data_len[ls_ch][1]){ if(priv->multi_turn_len[1]){ DebugP_log("\r\n Encoder-2 Multiturn rev: %u, Angle: %.12f, crc: %x, otf crc: %x, e_w: %x\n", priv->enc_pos_data[ch].num_of_turns[1], priv->enc_pos_data[ch].angle[1], priv->enc_pos_data[ch].rcv_crc[1], priv->enc_pos_data[ch].otf_crc[1], priv->enc_pos_data[ch].ew[1]); } else{ DebugP_log("\r\n Encoder-2 Singleturn Angle: %.12f, crc: %x, otf crc: %x, e_w: %x\n", priv->enc_pos_data[ch].angle[1], priv->enc_pos_data[ch].rcv_crc[1], priv->enc_pos_data[ch].otf_crc[1], priv->enc_pos_data[ch].ew[1]); } DebugP_log("\r\n CRC Status: %s, crc error count: %u\n", (priv->enc_pos_data[ch].rcv_crc[1] == priv->enc_pos_data[ch].otf_crc[1]) ? "success" : "failure" , priv->pd_crc_err_cnt[ch][1]); if(priv->data_len[ls_ch][2]){ if(priv->multi_turn_len[2]){ DebugP_log("\r\n Encoder-3 Multiturn rev: %u, Angle: %.12f, crc: %x, otf crc: %x, e_w: %x\n", priv->enc_pos_data[ch].num_of_turns[2], priv->enc_pos_data[ch].angle[2], priv->enc_pos_data[ch].rcv_crc[2], priv->enc_pos_data[ch].otf_crc[2], priv->enc_pos_data[ch].ew[2]); } else{ DebugP_log("\r\n Encoder-3 Singleturn Angle: %.12f, crc: %x, otf crc: %x, e_w: %x\n", priv->enc_pos_data[ch].angle[2], priv->enc_pos_data[ch].rcv_crc[2], priv->enc_pos_data[ch].otf_crc[2], priv->enc_pos_data[ch].ew[2]); } DebugP_log("\r\n CRC Status: %s, crc error count: %u\n", (priv->enc_pos_data[ch].rcv_crc[2] == priv->enc_pos_data[ch].otf_crc[2]) ? "success" : "failure" , priv->pd_crc_err_cnt[ch][2]); } } } } else if(cmd == 4) { DebugP_log("\r\nPlease enter control command in Hex:\n"); if(loadshare){ totalprus = priv->totalchannels; for(pru_num = 0; pru_num < totalprus; pru_num++){ ls_ch = priv->channel[pru_num]; DebugP_log("\r\nCh %d: ",ls_ch); DebugP_scanf("%x\n", &ctrl_cmd[ls_ch]); } } else{ DebugP_scanf("%x\n", &ctrl_cmd[0]); } ret = bissc_set_ctrl_cmd_and_process(priv, ctrl_cmd); if(ret < 0) { DebugP_log("\r\n ERROR: Control communication failed \n"); } for(ch_num = 0; ch_num < priv->totalchannels; ch_num++) { ch = priv->channel[ch_num]; DebugP_log("\r\n Channel %d:\n", ch); DebugP_log("\r\n Control communication result: %x, crc: %x, otf crc: %x, status: %s\n",priv->enc_ctrl_data[ch].cmd_result, priv->enc_ctrl_data[ch].cmd_rcv_crc, priv->enc_ctrl_data[ch].cmd_otf_crc, (priv->enc_ctrl_data[ch].cmd_rcv_crc == priv->enc_ctrl_data[ch].cmd_otf_crc) ? "success" : "failure"); DebugP_log("\r\n CTRL CRC error count: %u\n", priv->ctrl_crc_err_cnt[ch]); } } else if(cmd == 5) { DebugP_log("\r\nEnter number of BiSS-C cycles:\n"); DebugP_scanf("%u\n", &loop_cnt); if(loop_cnt) { do { ret = bissc_get_pos_res(priv); if(ret < 0) { DebugP_log("\r\n ERROR: Position data measurement for first encoder failed \n"); } for( ch_num = 0; ch_num < totalchannels; ch_num++ ){ ch = priv->channel[ch_num]; if(loadshare) ls_ch = ch; else ls_ch = 0; if(multichannel || loadshare) DebugP_log("%s", (ch_num != (totalchannels-1))?"\r":" & "); else DebugP_log("\r"); if(priv->data_len[ls_ch][1]) { if(priv->data_len[ls_ch][2]) { if(priv->multi_turn_len[ls_ch][2]){ DebugP_log("Ch:%d - Enc3: MT rev:%u, Angle:%.12f, Enc2: MT rev:%u, Angle:%.12f, Enc1: MT rev:%u, Angle:%.12f, crc error count enc3:%u, crc error count enc2:%u, crc error count enc_1:%u ",ch, priv->enc_pos_data[ch].num_of_turns[2], priv->enc_pos_data[ch].angle[2],priv->enc_pos_data[ch].num_of_turns[1], priv->enc_pos_data[ch].angle[1], priv->enc_pos_data[ch].num_of_turns[0], priv->enc_pos_data[ch].angle[0], priv->pd_crc_err_cnt[ch][2], priv->pd_crc_err_cnt[ch][1], priv->pd_crc_err_cnt[ch][0]); } else{ DebugP_log("Ch:%d - Enc3: Angle:%.12f, Enc2: Angle:%.12f, Enc1: Angle:%.12f, crc error count enc3:%u, crc error count enc2:%u, crc error count enc1:%u ",ch, priv->enc_pos_data[ch].angle[2], priv->enc_pos_data[ch].angle[1], priv->enc_pos_data[ch].angle[0], priv->pd_crc_err_cnt[ch][2], priv->pd_crc_err_cnt[ch][1], priv->pd_crc_err_cnt[ch][0]); } } else{ if(priv->multi_turn_len[ls_ch][1]){ DebugP_log("Ch:%d - Enc2: MT rev:%u, Angle:%.12f, Enc1: MT rev:%u, Angle:%.12f, crc error count enc2:%u, crc error count enc1:%u ",ch,priv->enc_pos_data[ch].num_of_turns[1], priv->enc_pos_data[ch].angle[1], priv->enc_pos_data[ch].num_of_turns[0], priv->enc_pos_data[ch].angle[0],priv->pd_crc_err_cnt[ch][1], priv->pd_crc_err_cnt[ch][0]); } else{ DebugP_log("Ch:%d - Enc2: Angle:%.12f, Enc1: Angle:%.12f, crc error count enc2:%u, crc error count enc1:%u ",ch, priv->enc_pos_data[ch].angle[1], priv->enc_pos_data[ch].angle[0], priv->pd_crc_err_cnt[ch][1], priv->pd_crc_err_cnt[ch][0]); } } } else{ if(priv->multi_turn_len[ls_ch][0]){ DebugP_log("Ch:%d - Enc1: MT rev:%u, Angle:%.12f, crc error count enc1:%u ",ch, priv->enc_pos_data[ch].num_of_turns[0], priv->enc_pos_data[ch].angle[0], priv->pd_crc_err_cnt[ch][0]); } else{ DebugP_log("Ch:%d - Enc1: Angle:%.12f, crc error count enc1:%u ",ch, priv->enc_pos_data[ch].angle[0], priv->pd_crc_err_cnt[ch][0]); } } } loop_cnt--; }while(loop_cnt); } else{ DebugP_log("Please enter non-zero value\n"); } } } deinit: Board_driversClose(); Drivers_close(); return; }