C 輕量級 信號與槽

#ifndef _SIMPLE_SIGNAL_SOLTS_H_
#define _SIMPLE_SIGNAL_SOLTS_H_
#include "string.h"函數

typedef void (*SIMPLE_SIGNAL)(void *signal, void *pArg);
typedef void (*SIMPLE_SOLTS) (void *pArg);ui

#define SIMPLE_SOLTS_T(FuncName)   void(FuncName)(void *pArg).net

#define SIMPLE_EMIT(signal, arg)  if (signal != NULL)signal(&signal, arg)指針

#define SIMPLE_SIGNAL_SOLTS_MAX_SOLTS       10      //一個信號最多鏈接槽的數量
#define SIMPLE_SIGNAL_SOLTS_MAX_SIGNAL      10      //信號最多數量blog


ErrorStatus SimpleSignalSolts_Connect(SIMPLE_SIGNAL *signal, SIMPLE_SOLTS solts);string

#endif
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/******************************************************************************
* @ File name --> SimpleSignalSolts.c
* @ Author    --> By@ LiuYu
* @ Version   --> V1.0
* @ Date      --> 2017 - 06 - 15
* @ Brief     --> 輕量級的信號與槽
* @           --> 一個信號對應多個槽,查表調用
*
* @ Copyright (C) 20**
* @ All rights reserved
*******************************************************************************
*
*                                  File Update
* @ Version   --> V1.0
* @ Author    --> 
* @ Date      --> 
* @ Revise    --> 
* @           --> 
*
*
******************************************************************************/
#include "SimpleSignalSolts.h"
#include <string.h>io

//信號結構
typedef struct
{
    void            *signleID;    //信號的指針的指針,保存信號的指針,根據指針的地址肯定是不是惟一
    SIMPLE_SOLTS    soltsTable[SIMPLE_SIGNAL_SOLTS_MAX_SOLTS];
    uint8_t         soltsCount;
}SIMPLE_SIGNAL_T;
//信號表結構
typedef struct
{
    SIMPLE_SIGNAL_T signalTable[SIMPLE_SIGNAL_SOLTS_MAX_SIGNAL];
    uint8_t         signalCount;
}SIMPLE_SIGNAL_SOLTS_HANDLE_T;date

SIMPLE_SIGNAL_SOLTS_HANDLE_T handle = 
{
    .signalCount = 0,
};im


static void SimpleSignalSolts_Signal(void *signal, void *pArg)
{
    uint8_t i, j;
    SIMPLE_SOLTS solts;
    for (i = 0; i < handle.signalCount; i++) //查找是不是同一個信號
    {
        if (handle.signalTable[i].signleID == signal)  //這裏注意,signleID保存的是指針的地址,
        {
            for (j = 0; j < handle.signalTable[i].soltsCount; j++)
            {
                 solts = handle.signalTable[i].soltsTable[j];
                 if (solts != NULL)
                 {
                     solts(pArg);
                 }
            }
        }
    }
}協議

/******************************************************************
  * @函數說明:   鏈接信號與槽
  * @輸入參數:   SIMPLE_SIGNAL *singnal 信號的指針(指針的指針) 
                 SIMPLE_SOLTS solts     槽
  * @輸出參數:   無
  * @返回參數:   ErrorStatus 
  * @修改記錄:   ----
******************************************************************/
ErrorStatus SimpleSignalSolts_Connect(SIMPLE_SIGNAL *signal, SIMPLE_SOLTS solts)
{
    if (signal == NULL || solts == NULL)    //查空
    {
        return ERROR;
    }

    uint8_t i;

    if (handle.signalCount > SIMPLE_SIGNAL_SOLTS_MAX_SIGNAL)    //錯誤
    {
        handle.signalCount = 0;
    }

    for (i = 0; i < handle.signalCount; i++) //查找是不是同一個信號
    {
        if (handle.signalTable[i].signleID == signal)  //這裏注意,signleID保存的是指針的地址,
        {
            if (handle.signalTable[i].soltsCount > SIMPLE_SIGNAL_SOLTS_MAX_SOLTS)
            {
                handle.signalTable[i].soltsCount = 0;
            }

            if (handle.signalTable[i].soltsCount == SIMPLE_SIGNAL_SOLTS_MAX_SOLTS) //滿了
            {
                return ERROR;
            }
            else
            {
                handle.signalTable[i].soltsTable[handle.signalTable[i].soltsCount++] = solts; //保存槽
                return SUCCESS; //結束
            }
        }
    }

    if (handle.signalCount == SIMPLE_SIGNAL_SOLTS_MAX_SIGNAL)   //滿了
    {
        return ERROR;
    }
    else
    {
        handle.signalTable[handle.signalCount].signleID = signal; //保存新的信號
        handle.signalTable[handle.signalCount].soltsTable[0] = solts; //保存槽
        handle.signalTable[handle.signalCount++].soltsCount = 1;
        *signal = SimpleSignalSolts_Signal;
        return SUCCESS;
    }
}
/******************************************************************
  * @函數說明:   斷開信號槽
  * @輸入參數:   SIMPLE_SIGNAL *singnal 信號的指針(指針的指針) 
                 SIMPLE_SOLTS solts     槽
  * @輸出參數:   無
  * @返回參數:   ErrorStatus 
  * @修改記錄:   ----
******************************************************************/
ErrorStatus SimpleSignalSolts_Disconnect(SIMPLE_SIGNAL *signal, SIMPLE_SOLTS solts)
{
    if (signal == NULL || solts == NULL || handle.signalCount == 0)    //查空
    {
        return ERROR;
    }
    uint8_t i, j;

    for (i = 0; i < handle.signalCount; i++) //查找是不是同一個信號     {         if (handle.signalTable[i].signleID == signal)  //這裏注意,signleID保存的是指針的地址,         {             for (j = 0; j < handle.signalTable[i].soltsCount; j++)             {                  if (handle.signalTable[i].soltsTable[j] == solts)  //找到槽  移除                  {                      memcpy(&handle.signalTable[i].soltsTable[j], &handle.signalTable[i].soltsTable[j +1],                                  (handle.signalTable[i].soltsCount - j - 1) * sizeof(SIMPLE_SOLTS));                      handle.signalTable[i].soltsCount--;                  }             }             if (handle.signalTable[i].soltsCount == 0)  //此信號沒有鏈接槽了             {                    memcpy(&handle.signalTable[i], &handle.signalTable[i + 1], (handle.signalCount - i - 1) * sizeof(SIMPLE_SIGNAL_T));                 handle.signalCount--;             }             return SUCCESS;         }     }     return ERROR; } ———————————————— 版權聲明:本文爲CSDN博主「世上最美的褲頭」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接及本聲明。 原文連接:https://blog.csdn.net/u010217338/article/details/73327264

相關文章
相關標籤/搜索