Jump to main content

# 1.2.4.2 Using the Library

The PLC PVDD Monitor service must be used from within the PLC application to monitor whether PLC transmissions are allowed.

PLC PVDD Monitor service requires a callback to be set in order to notify PVDD Threshold events to the user.

Example application to monitor PVDD voltage to allow PLC transmissions

    APP_PLC_DATA appPlc;

    static void APP_PLC_PVDDMonitorCb( SRV_PVDDMON_CMP_MODE cmpMode, uintptr_t context )
    {
        (void)context;

        if (cmpMode == SRV_PVDDMON_CMP_MODE_OUT)
        {
            /* PLC Transmission is not permitted */
            DRV_PLC_PHY_EnableTX(appPlc.drvPl360Handle, false);
            appPlc.pvddMonTxEnable = false;
            /* Restart PVDD Monitor to check when VDD is within the comparison window */
            SRV_PVDDMON_Restart(SRV_PVDDMON_CMP_MODE_IN);
        }
        else
        {
            /* PLC Transmission is permitted again */
            DRV_PLC_PHY_EnableTX(appPlc.drvPl360Handle, true);
            appPlc.pvddMonTxEnable = true;
            /* Restart PVDD Monitor to check when VDD is out of the comparison window */
            SRV_PVDDMON_Restart(SRV_PVDDMON_CMP_MODE_OUT);
        }
    }

    void APP_PLC_Initialize ( void )
    {
        /* Set PVDD Monitor tracking data */
        appPlc.pvddMonTxEnable = true;
    }

    void APP_PLC_Tasks ( void )
    {
        /* Check the application's current state. */
        switch ( appPlc.state )
        {
            case APP_PLC_STATE_IDLE:
            {
                /* Initialize PLC driver */
                appPlc.state = APP_PLC_STATE_INIT;
            }
            break;

            case APP_PLC_STATE_INIT:
            {
                /* Open PLC driver */
                appPlc.drvPl360Handle = DRV_PLC_PHY_Open(DRV_PLC_PHY_INDEX_0, NULL);

                if (appPlc.drvPl360Handle != DRV_HANDLE_INVALID)
                {
                    appPlc.state = APP_PLC_STATE_OPEN;
                }
                else
                {
                    appPlc.state = APP_PLC_STATE_ERROR;
                }
                break;
            }

            case APP_PLC_STATE_OPEN:
            {
                /* Check PLC transceiver */
                if (DRV_PLC_PHY_Status(DRV_PLC_PHY_INDEX_0) == SYS_STATUS_READY)
                {
                    /* Configure PLC callbacks */
                    DRV_PLC_PHY_DataCfmCallbackRegister(appPlc.drvPl360Handle, APP_PLC_DataCfmCb, NULL);
                    DRV_PLC_PHY_DataIndCallbackRegister(appPlc.drvPl360Handle, APP_PLC_DataIndCb, NULL);

                    /* Apply PLC initial configuration */
                    APP_PLC_SetInitialConfiguration();

                    /* Enable PLC Transmission */
                    DRV_PLC_PHY_EnableTX(appPlc.drvPl360Handle, true);

                    /* Enable PLC PVDD Monitor Service */
                    SRV_PVDDMON_RegisterCallback(APP_PLC_PVDDMonitorCb, 0);
                    SRV_PVDDMON_Start(SRV_PVDDMON_CMP_MODE_OUT);

                    /* Set PLC state to transmit a frame */
                    appPlc.state = APP_PLC_STATE_TX_REQUEST;
                }
            }
            break;
        }
    }

    bool APP_PLC_SendData ( uint8_t* pData, uint16_t length )
    {
        if (appPlc.state == APP_PLC_STATE_WAITING)
        {
            if (appPlc.pvddMonTxEnable)
            {
                if ((length > 0) && (length <= APP_PLC_BUFFER_SIZE))
                {
                    /* Set data length in Tx Parameters structure */
                    /* It should be equal or less than Maximum Data Length (see _get_max_psdu_len) */
                    /* Otherwise DRV_PLC_PHY_TX_RESULT_INV_LENGTH will be reported in Tx Confirm */
                    appPlcTx.pl360Tx.dataLength = length;
                    memcpy(appPlcTx.pDataTx, pData, length);

                    appPlc.plcTxState = APP_PLC_TX_STATE_WAIT_TX_CFM;

                    DRV_PLC_PHY_TxRequest(appPlc.drvPl360Handle, &appPlcTx.pl360Tx);

                    /* Set PLC state */
                    if (appPlc.plcTxState == APP_PLC_TX_STATE_WAIT_TX_CFM)
                    {
                        appPlc.state = APP_PLC_STATE_WAITING_TX_CFM;
                        return true;
                    }
                }
            }
        }

        return false;
    }

Rev: G