-include ../../../../Rules.make
export PATH=/bin:/sbin:/usr/bin:$(SDK_PATH_TARGET)/usr/bin:$PATH

ModularizationPath = ../../../Modularization
RootPath = ../Images/root
OutputPath = ../output

DEFINE = -D $(Project)

CFLAGS = -O0 -g3 -Wall -fmessage-length=0
TFLAGS = -lrt -lm -lpthread

TOP = .

INC_FLAGS += -I $(TOP)/Define
INC_FLAGS += -I $(TOP)/Log
INC_FLAGS += -I $(TOP)/ShareMemory
INC_FLAGS += -I $(TOP)/CSU
INC_FLAGS += -I $(TOP)/DataBase
INC_FLAGS += -I $(TOP)/ModuleInternalComm
INC_FLAGS += -I $(TOP)/ModuleEvComm
INC_FLAGS += -I $(TOP)/ModuleUpdateFW
INC_FLAGS += -I $(TOP)/ModuleChkSysTask
INC_FLAGS += -I $(TOP)/ModulePrimary
INC_FLAGS += -I $(TOP)/ModuleLcmCtrl
INC_FLAGS += -I $(TOP)/ModuleDoComm
INC_FLAGS += -I $(TOP)/ModuleEventLog
INC_FLAGS += -I $(TOP)/Module_LcmControl_Wistron
INC_FLAGS += -I ../../../Modularization/ocppfiles
INC_FLAGS += -I ../../../GPL/mosquitto-2.0.13/release/usr/local/include


DefineLib = $(TOP)/Define
LogLib = $(TOP)/Log
ShmMemLib = $(TOP)/ShareMemory
CSULib = $(TOP)/CSU
DataBaseLib = $(TOP)/DataBase
InternalCommLib = $(TOP)/ModuleInternalComm
EvCommLib = $(TOP)/ModuleEvComm
UpdateFWLib = $(TOP)/ModuleUpdateFW
ChkSysTaskLib = $(TOP)/ModuleChkSysTask
PrimaryLib = $(TOP)/ModulePrimary
LcmLib = $(TOP)/ModuleLcmCtrl
DoCommLib = $(TOP)/ModuleDoComm
EventLogLib = $(TOP)/ModuleEventLog
SelectGunLib = $(TOP)/SelectGun
ScriptLib = $(TOP)/Script
LcmWistronLib = $(TOP)/Module_LcmControl_Wistron
Lib_MOSQUITTO = "-L../../../GPL/mosquitto-2.0.13/release/usr/local/lib" -lmosquitto
Lib_JSONC = "-L../../../GPL/json-c-json-c-0.13.1-20180305/release/lib" -ljson-c

#define library variable
Internal485ProtocolLib = -L $(ModularizationPath)/Internal485Protocol -lInternal485Protocol
#PsuCommProtocolLib = -L $(ModularizationPath)/PsuCommProtocol -lPsuCommProtocol

#define library variable
Lib_Module_RFID = "-L$(ModularizationPath)" -lModule_RFID
RFID_H = -include$(ModularizationPath)/Module_RFID.h

Lib_Module_Upgrade = "-L$(ModularizationPath)" -lModule_Upgrade
ModuleUpgrade_H = -include$(ModularizationPath)/Module_Upgrade.h

Lib_SQLite3 = "-L$(ModularizationPath)/ocppfiles" -lsqlite3
SQLite3_H = -include$(ModularizationPath)/ocppfiles/sqlite3.h

Lib_Module_RatedCurrent = "-L$(ModularizationPath)" -lModule_RatedCurrent
RatedCurrent_H = -include$(ModularizationPath)/Module_RatedCurrent.h

InfypwrPsuComm_H = -include$(ModularizationPath)/Infypwr_PsuCommObj.h
InfypwrPsuComm_A = $(ModularizationPath)/libInfypwr_PsuCommObj.a
JSON_H = -include../../../GPL/json-c-json-c-0.13.1-20180305/release/include/json-c/json.h

#common lib
COMMON_OBJ_FILES = common.o \
					$(DefineLib)/define.o \
					$(ShmMemLib)/shmMem.o \
					$(LogLib)/log.o \
					$(SelectGunLib)/SelectGun.o \


MAIN_OBJ_FILES = $(COMMON_OBJ_FILES) $(DataBaseLib)/DataBase.o \
					$(CSULib)/main.o  $(CSULib)/Primary.o $(CSULib)/WatchDog.o $(CSULib)/ZipFile.o \
					$(CSULib)/RFID.o $(CSULib)/SelfTest.o \
					$(CSULib)/Ethernet.o 
					
MAIN_SRC_FILES = $(patsubst %.o, %.c, $(MAIN_OBJ_FILES))
%.o: %.c
	$(CC) $(CFLAGS) -c $<

#DoComm
DOCOMM_OBJ_FILES = $(COMMON_OBJ_FILES) $(DoCommLib)/DoComm.o $(DataBaseLib)/DataBase.o
DOCOMM_SRC_FILES = $(patsubst %.o, %.c, $(DOCOMM_OBJ_FILES))

#internal comm lib
INTERNALCOMM_OBJ_FILES = $(COMMON_OBJ_FILES) $(InternalCommLib)/internalComm.o \
							$(InternalCommLib)/Module_InternalComm.o $(InternalCommLib)/FanBoard.o \
								$(InternalCommLib)/LEDlight.o $(InternalCommLib)/RelayBoard.o \
									$(InternalCommLib)/AcPlug.o
INTERNALCOMM_SRC_FILES = $(patsubst %.o, %.c, $(INTERNALCOMM_OBJ_FILES))
%.o: %.c
	$(CC) $(CFLAGS) -c $<

#EV comm lib
EVCOMM_OBJ_FILES = $(COMMON_OBJ_FILES) $(RatedCurrent_H) $(EvCommLib)/Module_EvTxComm.o \
					$(EvCommLib)/Module_EvRxComm.o $(EvCommLib)/Ev_Comm.o $(EvCommLib)/AbnormalCCS.o \
						$(EvCommLib)/AbnormalCHA.o $(EvCommLib)/AbnormalGBT.o $(EvCommLib)/AbnormalState.o
EVCOMM_SRC_FILES = $(patsubst %.o, %.c, $(EVCOMM_OBJ_FILES))
%.o: %.c
	$(CC) $(CFLAGS) -c $<

#Update FW
UPDATEFW_OBJ_FILES = $(COMMON_OBJ_FILES) $(UpdateFWLib)/Module_UpdateFW.o
UPDATEFW_SRC_FILES = $(patsubst %.o, %.c, $(UPDATEFW_OBJ_FILES))
%.o: %.c
	$(CC) $(CFLAGS) -c $<

#Check System Task
CHKSYSTASK_OBJ_FILES = $(COMMON_OBJ_FILES) $(ChkSysTaskLib)/Module_ChkSysTask.o 
CHKSYSTASK_SRC_FILES = $(patsubst %.o, %.c, $(CHKSYSTASK_OBJ_FILES))
%.o: %.c
	$(CC) $(CFLAGS) -c $<

#Event Log
EVENTLOG_OBJ_FILES = $(COMMON_OBJ_FILES) $(DataBaseLib)/DataBase.o \
						$(EventLogLib)/Module_EventLogging.o
EVENTLOG_SRC_FILES = $(patsubst %.o, %.c, $(EVENTLOG_OBJ_FILES))
%.o: %.c
	$(CC) $(CFLAGS) -c $<

#LCM Control
LCM_OBJ_FILES = $(COMMON_OBJ_FILES) $(LcmLib)/Module_LcmControl.o
LCM_SRC_FILES = $(patsubst %.o, %.c, $(LCM_OBJ_FILES))

#Wirstron LCM Control
LCMWISTRON_OBJ_FILES = $(COMMON_OBJ_FILES) $(LcmWistronLib)/Module_LcmControl_Wistron.o \
						$(LcmWistronLib)/LcmCommandDriver.o $(LcmWistronLib)/Module_LcmItemList.o
LCMWISTRON_SRC_FILES = $(patsubst %.o, %.c, $(LCMWISTRON_OBJ_FILES))
%.o: %.c
	$(CC) $(CFLAGS) -c $<

#Primary
PRIMARY_OBJ_FILES = $(COMMON_OBJ_FILES) $(PrimaryLib)/PrimaryComm.o \
						$(PrimaryLib)/Module_PrimaryComm.o
PRIMARY_SRC_FILES = $(patsubst %.o, %.c, $(PRIMARY_OBJ_FILES))
%.o: %.c
	$(CC) $(CFLAGS) -c $<

#ReadCmdLine
READCMDLINE_OBJ_FILES = $(COMMON_OBJ_FILES) ReadCmdline.o
READCMDLINE_SRC_FILES = $(patsubst %.o, %.c, $(READCMDLINE_OBJ_FILES))
%.o: %.c
	$(CC) $(CFLAGS) -c $<

all: CopyFile apps

apps: MainTask DoCommTask EvCommTask UpdateFWTask ChkSysTask \
		EventLoggingTask InternalCommTask LcmControlTask \
			PrimaryCommTask ReadCmdlineTask UnsafetyOutputTool \
				LcmWistronTask FactoryConfigApp OtherTools CleanExec 

MainTask:
	$(CC) $(DEFINE) $(MAIN_SRC_FILES) $(CFLAGS) $(TFLAGS) $(INC_FLAGS) $(SQLite3_H) $(ModuleUpgrade_H) $(RateCurrent_H) \
		$(RFID_H) $(Lib_Module_RFID) $(Lib_Module_Upgrade) $(Lib_SQLite3) $(Lib_Module_RateCurrent) \
		$(CheckSystemTask_H) -o main
	#$(CC) $(DEFINE) $(SQLite3_H) $(ModuleUpgrade_H) $(RFID_H) $(RatedCurrent_H) $(CFLAGS) -c -o main.o main.c
	#$(CC) $(DEFINE) $(SQLite3_H) $(ModuleUpgrade_H) $(RFID_H) $(RatedCurrent_H) $(CFLAGS) -c -o timeout.o timeout.c
	#$(CC) $(DEFINE) $(CFLAGS) -c -o common.o common.c
	#$(CC) $(TFLAGS) -o main main.o timeout.o common.o ${Lib_Module_RFID} ${Lib_Module_Upgrade} ${Lib_SQLite3} $(Lib_Module_RatedCurrent)

DoCommTask:
	$(CC) $(DEFINE) $(DOCOMM_SRC_FILES) $(CFLAGS) $(TFLAGS) $(SQLite3_H) $(Lib_SQLite3) $(INC_FLAGS) -o Module_DoComm
	#$(CC) $(DEFINE) $(CFLAGS) -c -o define.o $(DefineLib)/define.c
	#$(CC) $(DEFINE) $(CFLAGS) -c -o DoComm.o $(DoCommLib)/DoComm.c
	#$(CC) -o Module_DoComm DoComm.o define.o

EvCommTask:
	$(CC) $(DEFINE) $(EVCOMM_SRC_FILES) $(CFLAGS) $(TFLAGS) $(INC_FLAGS) $(Lib_Module_RatedCurrent) -o Module_EvComm
	#$(CC) $(DEFINE) $(CFLAGS) $(RatedCurrent_H) -c -o Ev_Comm.o $(EvCommLib)/Ev_Comm.c
	#$(CC) $(DEFINE) $(CFLAGS) $(RatedCurrent_H) -c -o Module_EvComm.o $(EvCommLib)/Module_EvComm.c
	#$(CC) -o Module_EvComm Ev_Comm.o Module_EvComm.o $(Lib_Module_RatedCurrent)

UpdateFWTask:
	$(CC) $(DEFINE) $(UPDATEFW_SRC_FILES) $(CFLAGS) $(TFLAGS) $(INC_FLAGS) $(Lib_Module_Upgrade) $(ModuleUpgrade_H) -o Module_UpdateFW
	#$(CC) $(DEFINE) $(CFLAGS) -c -o Module_UpdateFW.o $(UpdateFWLib)/Module_UpdateFW.c
	#$(CC) -o Module_UpdateFW Module_UpdateFW.o
ChkSysTask:
	$(CC) $(DEFINE) $(CHKSYSTASK_SRC_FILES) $(CFLAGS) $(TFLAGS) $(INC_FLAGS) -o Module_ChkSysTask
	#$(CC) $(DEFINE) $(CFLAGS) -c -o Module_ChkSysTask.o $(ChkSysTaskLib)/Module_ChkSysTask.c
	#$(CC) -o Module_ChkSysTask Module_ChkSysTask.o 

EventLoggingTask:
	$(CC) $(DEFINE) $(EVENTLOG_SRC_FILES) $(CFLAGS) $(TFLAGS) $(INC_FLAGS) $(SQLite3_H) $(Lib_SQLite3) -o Module_EventLogging
	#$(CC) $(DEFINE) $(CFLAGS) -c -o define.o $(DefineLib)/define.c
	#$(CC) $(DEFINE) $(SQLite3_H) $(CFLAGS) -c -o Module_EventLogging.o $(EventLogLib)/Module_EventLogging.c
	#$(CC) -o Module_EventLogging Module_EventLogging.o ${Lib_SQLite3} define.o

InternalCommTask:
	$(CC) $(DEFINE) $(INTERNALCOMM_SRC_FILES) $(CFLAGS) $(TFLAGS) $(INC_FLAGS) -o Module_InternalComm
	#$(CC) $(DEFINE) $(CFLAGS) $(ModuleRelay_H) -c -o internalComm.o $(InternalCommLib)/internalComm.c
	#$(CC) $(DEFINE) $(CFLAGS) $(ModuleRelay_H) -c -o Module_InternalComm.o $(InternalCommLib)/Module_InternalComm.c
	#$(CC) $(TFLAGS) -o Module_InternalComm Module_InternalComm.o internalComm.o $(Lib_ModuleRelay)

LcmControlTask:
	$(CC) $(DEFINE) $(LCM_SRC_FILES) $(CFLAGS) $(TFLAGS) $(INC_FLAGS) -o Module_LcmControl
	#$(CC) $(DEFINE) $(CFLAGS) -c -o define.o $(DefineLib)/define.c
	#$(CC) $(DEFINE) $(CFLAGS) -c -o Module_LcmControl.o $(LcmLib)/Module_LcmControl.c
	#$(CC) -o Module_LcmControl Module_LcmControl.o define.o

LcmWistronTask:
	$(CC) $(DEFINE) $(LCMWISTRON_SRC_FILES) $(CFLAGS) $(TFLAGS) $(JSON_H) $(INC_FLAGS) \
	${Lib_JSONC}  ${Lib_MOSQUITTO} $(SQLite3_H) $(Lib_SQLite3) -o Module_LcmWistronControl

PrimaryCommTask:
	$(CC) $(DEFINE) $(PRIMARY_SRC_FILES) $(CFLAGS) $(TFLAGS) $(INC_FLAGS) -o Module_PrimaryComm
	#$(CC) $(DEFINE) $(CFLAGS) -c -o PrimaryComm.o $(PrimaryLib)/PrimaryComm.c
	#$(CC) $(DEFINE) $(CFLAGS) -c -o Module_PrimaryComm.o $(PrimaryLib)/Module_PrimaryComm.c
	#$(CC) -o Module_PrimaryComm Module_PrimaryComm.o PrimaryComm.o

PsuCommTask:
	$(CC) $(DEFINE) $(InfypwrPsuComm_H) $(CFLAGS) -c -o Module_PsuComm.o Module_PsuComm.c
	$(CC) -o Module_PsuComm Module_PsuComm.o $(InfypwrPsuComm_A)

ReadCmdlineTask:
	$(CC) $(DEFINE) $(READCMDLINE_SRC_FILES) $(CFLAGS) $(TFLAGS) $(INC_FLAGS) -o ReadCmdline
	#$(CC) $(DEFINE) $(CFLAGS) -c -o ReadCmdline.o ReadCmdline.c
	#$(CC) -o ReadCmdline ReadCmdline.o

UnsafetyOutputTool:
	$(CC) $(DEFINE) $(InfypwrPsuComm_H) $(CFLAGS) -c -o OutputTask.o OutputTask.c
	$(CC) -o UnsafetyOutputTask OutputTask.o $(InfypwrPsuComm_A)

FactoryConfigApp:
	@echo "===== Module_FactoryConfig_Task =================================="
	rm -f FactoryConfig
	gcc $(DEFINE) -o FactoryConfig FactoryConfig.c
	mkdir -p /Storage/SystemLog
	./FactoryConfig -f;true
	cp /mnt/FactoryDefaultConfig.bin ../Images
	rm -f FactoryConfig;
	$(CC) $(DEFINE) $(CFLAGS) -c -o FactoryConfig.o FactoryConfig.c
	$(CC) -o FactoryConfig FactoryConfig.o

OtherTools:
	cp -f $(ScriptLib)/init.sh $(RootPath)
	cp -f $(ScriptLib)/kill.sh $(RootPath)
	cp -f $(ScriptLib)/web.sh $(RootPath)
	cp -f $(ScriptLib)/LcmSet.db $(RootPath)
	cp -f main $(RootPath)
	cp -f Module_DoComm $(RootPath)
	cp -f Module_EvComm $(RootPath)
	cp -f Module_UpdateFW $(RootPath)
	cp -f Module_ChkSysTask $(RootPath)
	cp -f Module_EventLogging $(RootPath)
	cp -f Module_InternalComm $(RootPath)
	cp -f Module_LcmControl $(RootPath)
	cp -f Module_LcmWistronControl $(RootPath)
	cp -f Module_PrimaryComm $(RootPath)
	#cp -f Module_PsuComm $(RootPath)
	cp -f ReadCmdline $(RootPath)
	cp -f UnsafetyOutputTask $(RootPath)
	cp -f FactoryConfig $(RootPath)

	if [ ! -d $(OutputPath) ]; then mkdir -p $(OutputPath); fi
	cp -f $(ScriptLib)/init.sh $(OutputPath)
	cp -f $(ScriptLib)/kill.sh $(OutputPath)
	cp -f $(ScriptLib)/web.sh $(OutputPath)
	cp -f $(ScriptLib)/LcmSet.db $(OutputPath)
	cp -f $(ScriptLib)/SearchIP.sh $(OutputPath)
	cp -f main $(OutputPath)
	cp -f Module_DoComm $(OutputPath)
	cp -f Module_EvComm $(OutputPath)
	cp -f Module_UpdateFW $(OutputPath)
	cp -f Module_ChkSysTask $(OutputPath)
	cp -f Module_EventLogging $(OutputPath)
	cp -f Module_InternalComm $(OutputPath)
	cp -f Module_LcmControl $(OutputPath)
	cp -f Module_LcmWistronControl $(OutputPath)
	cp -f Module_PrimaryComm $(OutputPath)
	#cp -f Module_PsuComm $(OutputPath)
	cp -f ReadCmdline $(OutputPath)
	cp -f UnsafetyOutputTask $(OutputPath)
	cp -f FactoryConfig $(OutputPath)

CopyFile:
	rm -rfv ../Images/root
	mkdir -p ../Images/root

CleanExec:
	rm -f *.o
	rm main
	rm Module_EvComm
	rm Module_UpdateFW
	rm Module_ChkSysTask
	rm Module_EventLogging
	rm Module_InternalComm
	rm Module_LcmControl
	rm Module_LcmWistronControl
	rm Module_PrimaryComm
	#rm Module_PsuComm
	rm ReadCmdline

	rm FactoryConfig
	rm Module_DoComm