#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