#include "sr_event.h"
#include "sr_log.h"
#include "sr_shell.h"

#include <string.h>

extern int SR_AppGlbEvtInit(void);
extern int SR_AppGlbEvtPub(SR_EVT_T evt);
extern int SR_AppGlbEvtSub(SR_EVT_CSM_T *csm,uint8_t evtId);

//全局事件相关变量
static SR_EVT_CSM_T glbCsm;
static char defData[100]={0};

//自定义事件相关变量
typedef  enum CLD_EVT_ID
{
    CLD_EVT_TEST0 = 0,
	  CLD_EVT_TEST1,     
	  CLD_EVT_TEST2, 
    CLD_EVT_TEST3, 
    CLD_EVT_TEST4,
    CLD_EVT_TEST5,	
	  CLD_EVT_MAX
    
}CLD_EVT_ID_E ;
static SR_EVT_OBJ_T cldEvtObj;
static SR_EVT_T    cldEvtQueue[10];
static uint32_t    cldEvtSubTab[CLD_EVT_MAX];

static SR_EVT_CSM_T cldCsm;
static char defData1[100]={0};

	
static void GlbEvtProcCb(SR_EVT_T evt, void *args)
{
   
	switch(evt.evtId)
	{
	
		case GEVT_TEST0:
			   SR_LOG(INFO,"[GLB] evtid(%d) happen",evt.evtId);
		     if(evt.data.pData) SR_LOG(INFO,"data: %s",(char *)evt.data.pData);
		
	  break;
		
		case GEVT_TEST1:
			   SR_LOG(INFO,"[GLB] evtid(%d) happen",evt.evtId);
		     if(evt.data.pData) SR_LOG(INFO,"data: %s",(char *)evt.data.pData);
	  break;
		case GEVT_TEST2:
			   SR_LOG(INFO,"[GLB] evtid(%d) happen",evt.evtId);
		     if(evt.data.pData) SR_LOG(INFO,"data: %s",(char *)evt.data.pData);
			
	  break;
		case GEVT_TEST3:
			   SR_LOG(INFO,"[GLB] evtid(%d) happen",evt.evtId);
		     if(evt.data.pData) SR_LOG(INFO,"data: %s",(char *)evt.data.pData);
			
	  break;
		case GEVT_TEST4:
			   SR_LOG(INFO,"[GLB] evtid(%d) happen",evt.evtId);
		     if(evt.data.pData) SR_LOG(INFO,"data: %s",(char *)evt.data.pData);
			
	  break;
		case GEVT_TEST5:
			   SR_LOG(INFO,"[GLB] evtid(%d) happen",evt.evtId);
		     if(evt.data.pData) SR_LOG(INFO,"data: %s",(char *)evt.data.pData);
			
	  break;
		
		default:
		     SR_LOG(INFO,"ubkow evtId(%d)",evt.evtId);
		break;
	
	}

}

static void CldEvtProcCb(SR_EVT_T evt, void *args)
{
   
	switch(evt.evtId)
	{
	
		case CLD_EVT_TEST0:
			   SR_LOG(INFO,"[CLD] evtid(%d) happen",evt.evtId);
		     if(evt.data.pData) SR_LOG(INFO,"data: %s",(char *)evt.data.pData);
		
	  break;
		
		case CLD_EVT_TEST1:
			   SR_LOG(INFO,"[CLD] evtid(%d) happen",evt.evtId);
		     if(evt.data.pData) SR_LOG(INFO,"data: %s",(char *)evt.data.pData);
	  break;
		case CLD_EVT_TEST2:
			   SR_LOG(INFO,"[CLD] evtid(%d) happen",evt.evtId);
		     if(evt.data.pData) SR_LOG(INFO,"data: %s",(char *)evt.data.pData);
			
	  break;
		case CLD_EVT_TEST3:
			   SR_LOG(INFO,"[CLD] evtid(%d) happen",evt.evtId);
		     if(evt.data.pData) SR_LOG(INFO,"data: %s",(char *)evt.data.pData);
			
	  break;
		case CLD_EVT_TEST4:
			   SR_LOG(INFO,"[CLD] evtid(%d) happen",evt.evtId);
		     if(evt.data.pData) SR_LOG(INFO,"data: %s",(char *)evt.data.pData);
			
	  break;
		case CLD_EVT_TEST5:
			   SR_LOG(INFO,"[CLD] evtid(%d) happen",evt.evtId);
		     if(evt.data.pData) SR_LOG(INFO,"data: %s",(char *)evt.data.pData);
			
	  break;
		
		default:
		     SR_LOG(INFO,"ubkow evtId(%d)",evt.evtId);
		break;
	
	}

}


static int EvtInit(int argc, char *argv[])
{
  //全局事件对象初始化
	 SR_AppGlbEvtInit();
	
	//云事件对象初始化
	SR_EvtObjInit(&cldEvtObj,cldEvtQueue,10, cldEvtSubTab, CLD_EVT_MAX);


	//消费者初始化
	 SR_EvtCsmInit(&glbCsm,0,GlbEvtProcCb ,SR_NULL);
	
	 SR_EvtCsmInit(&cldCsm,0,CldEvtProcCb ,SR_NULL);

	
   //订阅全局事件
	 SR_AppGlbEvtSub(&glbCsm,GEVT_TEST0);
	 SR_AppGlbEvtSub(&glbCsm,GEVT_TEST1);
	 SR_AppGlbEvtSub(&glbCsm,GEVT_TEST2);
	 SR_AppGlbEvtSub(&glbCsm,GEVT_TEST3);
	
	 //订阅云事件
	 SR_EvtSub(&cldCsm,&cldEvtObj,CLD_EVT_TEST0);
   SR_EvtSub(&cldCsm,&cldEvtObj,CLD_EVT_TEST1);
	 SR_EvtSub(&cldCsm,&cldEvtObj,CLD_EVT_TEST2);
	 SR_EvtSub(&cldCsm,&cldEvtObj,CLD_EVT_TEST3);



   return 0;
}
SR_SHELL_CMD_EXPORT(evtInit, EvtInit);


//gevtPub <evtId> <data>
static int GlbEvtPub(int argc, char *argv[])
{
   SR_EVT_T evt={0};
	
	 evt.evtId = 1;
	
	 if(argc>=2) evt.evtId =atoi(argv[1]);
	 
	 if(argc>=3) 
	 {
		  strcpy(defData,argv[2]);
		  evt.data.pData =defData;
	 }
	
   //发布事件
	 SR_AppGlbEvtPub(evt);
	

   return 0;
}
SR_SHELL_CMD_EXPORT(gevtPub, GlbEvtPub);

//cldPub <evtId> <data>
static int CldEvtPub(int argc, char *argv[])
{
   SR_EVT_T evt={0};
	
	 evt.evtId = 1;
	
	 if(argc>=2) evt.evtId =atoi(argv[1]);
	 
	 if(argc>=3) 
	 {
		  strcpy(defData1,argv[2]);
		  evt.data.pData =defData1;
	 }
	
   //发布事件
	 SR_EvtPub(&cldEvtObj ,evt);


   return 0;
}
SR_SHELL_CMD_EXPORT(cldPub, CldEvtPub);
