123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248 |
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <linux/termios.h>
- #include <stdio.h>
- #include <string.h>
- #include <time.h>
- #include <stdlib.h>
- #include <sys/ipc.h>
- #include <sys/shm.h>
- #include <sys/mman.h>
- #include <linux/sockios.h>
- #include <linux/socket.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <sys/time.h>
- #include <sys/timeb.h>
- #include <math.h>//for pow
- #include <net/if.h>
- #include <linux/can.h>
- #include <linux/can/raw.h>
- #include <unistd.h>
- #include "../../define.h"
- //#define Debug
- struct SysConfigAndInfo *ShmSysConfigAndInfo;
- struct StatusCodeData *ShmStatusCodeData;
- struct PsuData *ShmPsuData ;
- pid_t CANReceiverPid;
- int CanFd;
- #ifdef SystemLogMessage
- int StoreLogMsg(unsigned char *DataString)
- {
- unsigned char Buf[256];
- time_t CurrentTime;
- struct tm *tm;
-
- memset(Buf,0,sizeof(Buf));
- CurrentTime = time(NULL);
- tm=localtime(&CurrentTime);
- sprintf(Buf,"echo \"%04d.%02d.%02d %02d:%02d:%02d - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
- tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,
- DataString,
- tm->tm_year+1900,tm->tm_mon+1);
- system(Buf);
- #ifdef Debug
- printf("%s \n",DataString);
- #endif
- }
- #endif
- int DiffTimeb(struct timeb ST, struct timeb ET)
- {
- //return milli-second
- unsigned int StartTime,StopTime;
-
- StartTime=(unsigned int)ST.time;
- StopTime=(unsigned int)ET.time;
- return (StopTime-StartTime)*1000+ET.millitm-ST.millitm;
- }
-
- /**************************************************************************************/
- /**************************Init all share memory *********************************/
- /**************************************************************************************/
- int InitShareMemory()
- {
- int MeterSMId;
-
- //creat ShmSysConfigAndInfo
- if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), 0777)) < 0)
- {
- #ifdef SystemLogMessage
- StoreLogMsg("[PsuCOmm]InitShareMemory:shmget ShmSysConfigAndInfo NG");
- #endif
- return 0;
- }
- else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
- {
- #ifdef SystemLogMessage
- StoreLogMsg("[PsuCOmm]InitShareMemory:shmat ShmSysConfigAndInfo NG");
- #endif
- return 0;
- }
- //creat ShmStatusCodeData
- if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), 0777)) < 0)
- {
- #ifdef SystemLogMessage
- StoreLogMsg("[PsuCOmm]InitShareMemory:shmget ShmStatusCodeData NG");
- #endif
- return 0;
- }
- else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
- {
- #ifdef SystemLogMessage
- StoreLogMsg("[PsuCOmm]InitShareMemory:shmat ShmStatusCodeData NG");
- #endif
- return 0;
- }
- //creat ShmPsuData
- if ((MeterSMId = shmget(ShmPsuKey, sizeof(struct PsuData), 0777)) < 0)
- {
- #ifdef SystemLogMessage
- StoreLogMsg("[PsuCOmm]InitShareMemory:shmget ShmPsuData NG");
- #endif
- return 0;
- }
- else if ((ShmPsuData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
- {
- #ifdef SystemLogMessage
- StoreLogMsg("[PsuCOmm]InitShareMemory:shmat ShmPsuData NG");
- #endif
- return 0;
- }
- memset(ShmPsuData,0,sizeof(struct PsuData));
- return 1;
- }
- int InitCanBus()
- {
- int s0,nbytes;
- struct timeval tv;
- struct ifreq ifr0;
- struct sockaddr_can addr0;
-
- system("/sbin/ip link set can1 type can bitrate 500000 restart-ms 100");
- system("/sbin/ip link set can1 up");
-
- s0 = socket(PF_CAN, SOCK_RAW, CAN_RAW);
-
- tv.tv_sec = 0;
- tv.tv_usec = 10000;
- if (setsockopt(s0, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval)) < 0)
- {
- #ifdef SystemLogMessage
- StoreLogMsg("[PsuCOmm]InitCanBus:Set SO_RCVTIMEO NG");
- #endif
- }
- nbytes=40960;
- if (setsockopt(s0, SOL_SOCKET, SO_RCVBUF, &nbytes, sizeof(int)) < 0)
- {
- #ifdef SystemLogMessage
- StoreLogMsg("[PsuCOmm]InitCanBus:Set SO_RCVBUF NG");
- #endif
- }
- nbytes=40960;
- if (setsockopt(s0, SOL_SOCKET, SO_SNDBUF, &nbytes, sizeof(int)) < 0)
- {
- #ifdef SystemLogMessage
- StoreLogMsg("[PsuCOmm]InitCanBus:Set SO_SNDBUF NG");
- #endif
- }
-
- strcpy(ifr0.ifr_name, "can1" );
- ioctl(s0, SIOCGIFINDEX, &ifr0); /* ifr.ifr_ifindex gets filled with that device's index */
- addr0.can_family = AF_CAN;
- addr0.can_ifindex = ifr0.ifr_ifindex;
- bind(s0, (struct sockaddr *)&addr0, sizeof(addr0));
- return s0;
- }
- /**************************************************************/
- /************** Receiving Task*******************************/
- /*************************************************************/
- void CANReceiver(int fd)
- {
- pid_t tmp=0;
- struct can_frame frame;
- struct timeb StartTime,EndTime;
- int nbytes;
- unsigned char FanspeedGetTime=0;
-
- if(CANReceiverPid==0)
- {
- tmp=fork();
- if(tmp>0)
- {
- CANReceiverPid=tmp;
- {
- unsigned char buf[64];
- memset(buf,0,sizeof(buf));
- sprintf(buf,"renice -20 -p %d",tmp);
- system(buf);
- }
- return;
- }
- }
-
- while(1)
- {
- memset(&frame,0,sizeof(struct can_frame));
- nbytes = read(fd, &frame, sizeof(struct can_frame));
- //handle received packet
- }
- }
- /**************************************************************/
- /************** main function***********************************/
- /*************************************************************/
- int main(int argc,char *argv[])
- {
- int CanFd;
- struct can_frame frame;
-
- //Initialization
- if(InitShareMemory()==0)
- {
- #ifdef SystemLogMessage
- StoreLogMsg("[PsuCOmm]main:InitShareMemory NG");
- #endif
- if(ShmStatusCodeData!=NULL)
- {
- ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FailToCreateShareMemory=1;
- }
- sleep(5);
- return 0;
- }
- CanFd=InitCanBus();
- CANReceiverPid=0;
- CANReceiver(CanFd);
- //main loop
- while(1)
- {
- //processing
- }
-
- EndProcess:
- if(CANReceiverPid>0)
- {
- char Buf[32];
- memset(Buf,0,32);
- sprintf(Buf,"kill %d",CANReceiverPid);
- system(Buf);
- }
- close(CanFd);
- system("/sbin/ip link set can1 down");
- system("/sbin/ip link set can1 type can bitrate 500000 restart-ms 100");
- system("/sbin/ip link set can1 up");
- system("/sbin/ip link set can1 down");
- system("killall PsuComm");
- }
|