ftp
Dependencies: SDFileSystem mbed-rtos mbed
Diff: main.cpp
- Revision:
- 0:001407b7f10c
- Child:
- 1:8dd592e91577
diff -r 000000000000 -r 001407b7f10c main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sun Jan 18 12:54:35 2015 +0000 @@ -0,0 +1,658 @@ +#include "mbed.h" +#include "SDFileSystem.h" +#include "rtos.h" +#define freq 1 + + +#define dur_sec 0.5 + +Serial pc(USBTX, USBRX); +Serial gsm(D1, D0); //tx,rx +DigitalOut dtr(D2); +DigitalOut pwr_key(D3); +DigitalOut gsm_rst(D7); +SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd"); // MOSI, MISO, SCK, CS +AnalogIn AC_input(A0); +AnalogIn AC2_input(A1); +AnalogIn DC_input(A2); +AnalogIn DC_Detect(A3); +AnalogIn TC1(A4); +AnalogIn TC2(A5); + + +unsigned short ACdata[20000]; +unsigned short DCdata[20000]; +unsigned short DC_Detect_data[10]; + +/*union Data + { + unsigned short datai[50000]; + char datac[100000]; + }; +union Data ACdata; +union Data DCdata;*/ + + +unsigned short TC33temp; +unsigned short TC50temp; +unsigned short TCRLtemp; + +char sitename[100] ="MODZ"; +char filename[100] = ""; +char filepath[100] = ""; +char timestamp[100]=""; +char timestampold[100]=""; +char main_dir[100] =""; +char hour_dir[100] =""; +char pathAC[100] =""; +char pathDC[100] =""; +char pathTC[100] =""; +char filenameAC[100] =""; +char filenameDC[100] =""; +char clk_response[100] =""; +int m=0,mfinal; +int date, month, year, hour, minute, second, temp = 0; +int c,i; +int ns; +unsigned long var = 0; +unsigned long currentMillis = 0; +uint8_t x=0,z=0, answer=0; + +time_t previous; +float tempC; +uint32_t dataLength = dur_sec*freq*1000; +osThreadId tid1,tid2,tid3,tid4,tid5,tid6; +char ftpget[100]; +int reset_time=120; //mins +int gsmerr=0; + +//--------------------------------------------------------------------------------------------------// +// Module reset // +//--------------------------------------------------------------------------------------------------// +void reset_mod() +{ + NVIC_SystemReset(); +} +//--------------------------------------------------------------------------------------------------// +// Send AT Command (1 response) // +//--------------------------------------------------------------------------------------------------// +int8_t sendATcommand3(char* ATcommand, char* expected_answer, unsigned int timeout) +{ + uint8_t x=0,answer=0; //x=0 and answer=0, if not put, AT+CCLK?\r is not executed + char response[100]; + // int time_previous; + memset(response, '\0', 100); // Initialize the string + wait_ms(100); + while( gsm.readable() > 0) gsm.getc(); // Clean the input buffer + gsm.printf("%s \r", ATcommand); // Send the AT command + x = 0; + previous = time(NULL); + do // this loop waits for the answer + { + if(gsm.readable() != 0) + { + response[x] = gsm.getc(); // if there are data in the UART input buffer, reads it and checks for the asnwer + pc.putc(response[x]); + x++; + if (strstr(response, expected_answer) != NULL) // check if the desired answer is in the response of the module + { + answer = 1; + } + } + }while((answer == 0) && ((time(NULL) - previous) < timeout)); + FILE *fp9 = fopen("/sd/Record.txt", "a"); + if(fp9==NULL) + { + error("Could not open the file for write\r\n"); + } + fprintf(fp9,"%s",response); + fclose(fp9); // Waits for the asnwer with time out + /* if(clk_flag == 1) + { + sprintf(timestamp,response); //copies response to timestamp for further processing } + }*/ + return answer; +} + +//--------------------------------------------------------------------------------------------------// +// Send AT Command (1 response) // +//--------------------------------------------------------------------------------------------------// +int8_t sendATcommand(char* ATcommand, char* expected_answer, unsigned int timeout, bool clk_flag) +{ + uint8_t x=0,answer=0; //x=0 and answer=0, if not put, AT+CCLK?\r is not executed + char response[100]; + memset(response, '\0', 100); // Initialize the string + wait_ms(100); + while( gsm.readable() > 0) gsm.getc(); // Clean the input buffer + gsm.printf("%s \r", ATcommand); // Send the AT command + x = 0; + previous = time(NULL); + do // this loop waits for the answer + { + if(gsm.readable() != 0) + { + response[x] = gsm.getc(); // if there are data in the UART input buffer, reads it and checks for the asnwer + pc.putc(response[x]); + x++; + if (strstr(response, expected_answer) != NULL) // check if the desired answer is in the response of the module + { + answer = 1; + } + } + } + while((answer == 0) && ((time(NULL) - previous) < timeout)); // Waits for the asnwer with time out + if(clk_flag == 1) + { + sprintf(timestamp,response); //copies response to timestamp for further processing } + } + return answer; +} + +//--------------------------------------------------------------------------------------------------// +// Send AT Command (2 response) // +//--------------------------------------------------------------------------------------------------// +int8_t sendATcommand2(char* ATcommand, char* expected_answer1,char* expected_answer2, unsigned int timeout) +{ + uint8_t x=0, answer=0; + char response[100]; + time_t previous; + memset(response, '\0', 100); // Initialize the string + //Thread::wait(100); + wait_ms(100); + while( gsm.readable() != 0) gsm.getc(); // Clean the input buffer + gsm.printf("%s \r", ATcommand); // Send the AT command + x = 0; + previous = time(NULL); + do // this loop waits for the answer + { + if(gsm.readable() != 0) // if there are data in the UART input buffer, reads it and checks for the asnwer + { + response[x] = gsm.getc(); + pc.putc(response[x]); + // sprintf(ftpget,"%s",response); + x++; + if (strstr(response, expected_answer1) != NULL) // check if the desired answer 1 is in the response of the module + { + answer = 1; + } + if (strstr(response, expected_answer2) != NULL) // check if the desired answer 2 is in the response of the module + { + answer = 2; + break; + } + } + } + while((answer == 0) && ((time(NULL) - previous) < timeout)); // Waits for the asnwer with time out + return answer; +} + +//--------------------------------------------------------------------------------------------------// +// Getting File Directories and names // +//--------------------------------------------------------------------------------------------------// +void GetFileDir() +{ + int attempt_cnt=0; + char month_dir[100]=""; + char date_dir[100] =""; + sendATcommand("AT+CCLK?\r", "OK", 5,1); + //sprintf(response,timestamp); + x=20; + year = 10*(timestamp[x+1]-48) + (timestamp[x+2]-48); + while(year!=14&&year!=15) + { + sendATcommand("AT+CCLK?\r", "OK", 5,0); + year = 10*(timestamp[x+1]-48) + (timestamp[x+2]-48); + attempt_cnt++; + if(attempt_cnt>4) break; + } + if(year==14||year==15) + { + if(timestamp!=timestampold) + { + sprintf(timestampold,timestamp); + //pc.printf("\r\nold time stamp is%s\r\n",timestampold); + month = (timestamp[x+4]-48)*10+(timestamp[x+5]-48); + date = (timestamp[x+7]-48)*10+(timestamp[x+8]-48); + hour = (timestamp[x+10]-48)*10+(timestamp[x+11]-48); + minute = (timestamp[x+13]-48)*10+(timestamp[x+14]-48); + second = (timestamp[x+16]-48)*10+(timestamp[x+17]-48); + + sprintf(main_dir,"/sd/%s",sitename); + sprintf(month_dir,"%s/%s%02d%02d",main_dir,sitename,year,month); + sprintf(date_dir,"%s/%s%02d%02d%02d",month_dir,sitename,year,month,date); + sprintf(hour_dir,"%s/%s%02d%02d%02d%02d",date_dir,sitename,year,month,date,hour); + sprintf(filepath,"%s/%s%02d%02d%02d%02d%02d%02d",hour_dir,sitename,year,month,date,hour,minute,second); + sprintf(filename,"%s%02d%02d%02d%02d%02d%02d",sitename,year,month,date,hour,minute,second); + gsmerr=0; + mkdir(main_dir,0777); + mkdir(month_dir,0777); + mkdir(date_dir,0777); + mkdir(hour_dir,0777); + } + else + { + sprintf(filepath,"%s/%s%02d%02d%02d%02d%02d%02dErr%03d",hour_dir,sitename,year,month,date,hour,minute,second,gsmerr); + sprintf(filename,"%s%02d%02d%02d%02d%02d%02dErr%03d",sitename,year,month,date,hour,minute,second,gsmerr); + gsmerr++; + } + } + else + { + sprintf(timestamp,timestampold); + sprintf(filepath,"%s/%s%02d%02d%02d%02d%02d%02dErr%03d",hour_dir,sitename,year,month,date,hour,minute,second,gsmerr); + sprintf(filename,"%s%02d%02d%02d%02d%02d%02dErr%03d",sitename,year,month,date,hour,minute,second,gsmerr); + gsmerr++; + } +} +//--------------------------------------------------------------------------------------------------// +// DC Detect // +//--------------------------------------------------------------------------------------------------// +void DC_Detection() +{ + Timer t; + unsigned long j=0; + + t.start(); + while(j<10) + { + if((int)(t.read()*50*freq*1000)%100 == 0) + { + DC_Detect_data[j] = DC_Detect.read_u16(); + ++j; + } + } + t.stop(); + // pc.printf("\r\nTemp Time Taken %f \n\r", t.read()); + t.reset(); + // pc.printf("Total Samples %d\r\n",j); + osSignalSet(tid3, 0x1); +} +//--------------------------------------------------------------------------------------------------// +// AC-DC Sampling // +//--------------------------------------------------------------------------------------------------// +void calculate_ADC() +{ + Timer t; + unsigned long j=0; + //pc.printf("\n\rStarting Reading \n\r"); + t.start(); + while(j<dataLength) + { + if((int)(t.read()*100*freq*1000)%100 == 0) + { + ACdata[j] = AC_input.read_u16(); + DCdata[j] = DC_input.read_u16(); + ++j; + } + } + t.stop(); + //pc.printf("Time Taken %f \n\r", t.read()); + t.reset(); + //pc.printf("Total Samples %d\r\n",j); +} +//--------------------------------------------------------------------------------------------------// +// Storage // +//--------------------------------------------------------------------------------------------------// +void store(void const *args) +{ + tid3 = osThreadGetId(); + while(true) + { + osSignalWait(0x1, osWaitForever); + GetFileDir(); + sprintf(filenameAC,"%sAC.txt",filename); + sprintf(pathAC,"%sAC.txt",filepath); + // pc.printf("\r\nFilename-AC\t%s", pathAC); + FILE *fp = fopen(pathAC, "w"); + if(fp == NULL) + { + //pc.printf("Could not open file for write\n\r"); + reset_mod(); + } + else + { + for(unsigned long k=0; k<dataLength; ++k) + { + fprintf(fp, "%d.", ACdata[k]); + } + fprintf(fp, "EOF"); + + } + fclose(fp); + sprintf(filenameDC,"%sDC.txt",filename); + sprintf(pathDC,"%sDC.txt",filepath); + // pc.printf("\r\nFilename-DC\t%s", pathDC); + FILE *fp1 = fopen(pathDC, "w"); + if(fp1 == NULL) + { + + //reset_mod(); + } + else + { + for(unsigned long k=0; k<dataLength; ++k) + { + fprintf(fp1, "%d.", DCdata[k]); + } + fprintf(fp1, "EOF"); + } + fclose(fp1); + sprintf(pathTC,"%sData.txt",hour_dir); + //pc.printf("\r\nFilename-TC\t%s", pathTC); + FILE *fp2 = fopen(pathTC, "a"); + if(fp2 == NULL) + { + //pc.printf("Could not open file for write\n\r"); + //reset_mod(); + } + else + { + fprintf(fp2, "\r\n%s",timestamp); + for(unsigned long k=0; k<10; ++k) + { + fprintf(fp2, "\r\nDC-%d",DC_Detect_data[k]); + } + } + fclose(fp2); + pc.printf("\n storage done"); + osSignalSet(tid6, 0x1); + + } +} + +//--------------------------------------------------------------------------------------------------// +// Sampling Function // +//--------------------------------------------------------------------------------------------------// + +void sampling(void const *args) +{ + //int smplngcnt=0; + tid1 = osThreadGetId(); + while(true) + { + pc.printf("AC sampling attempt"); + calculate_ADC(); + DC_Detection(); + for(int i=0;i<3; i++) + { + Thread::wait(60000); + } + } +} +//--------------------------------------------------------------------------------------------------// +// GSM Initialization // +//--------------------------------------------------------------------------------------------------// +void gsm_init() +{ + int cnt = 0; + while((sendATcommand("AT+CREG?", "+CREG: 1,1", 5,0) || sendATcommand("AT+CREG?", "+CREG: 1,5", 5,0)) == 0) + { + if(sendATcommand("AT+CREG=1", "+CREG:1", 5,0)) + { + pc.printf("creg is 1"); + return; + } + else if(sendATcommand("AT+CREG=1", "+CREG:5", 5,0)) + { + pc.printf("creg is 5"); + return; + } + ++cnt; + if(cnt == 4) + { + pc.printf("GSM registration failed"); + return; + } + } +} +//--------------------------------------------------------------------------------------------------// +// FTP Connect function // +//--------------------------------------------------------------------------------------------------// +bool ftp_connect() +{ + int ftp_connect_attempt=0; + int ftp_close_attempt=0; + if(sendATcommand("AT+SAPBR=2,1", "+SAPBR: 1,3,\"0.0.0.0\"", 5,0)) + { + } + else + { + while(!sendATcommand("AT+SAPBR=2,1", "+SAPBR: 1,3,\"0.0.0.0\"", 5,0)) + { + sendATcommand("AT+SAPBR=0,1","OK",5,0); + ftp_close_attempt++; + if(ftp_close_attempt>3) + { + return 0; + } + } + } + while(sendATcommand("AT+SAPBR=2,1", "+SAPBR: 1,3,\"0.0.0.0\"", 5,0)) + { + sendATcommand("AT+SAPBR=1,1", "OK", 10,0); + ftp_connect_attempt++; + if(ftp_connect_attempt>6) + { + return 0; + } + } + sendATcommand("AT+FTPTYPE=\"I\"", "OK", 5,0); + sendATcommand("AT+FTPSERV=\"ftp.panchsheel.biz\"", "OK", 10,0); + sendATcommand("AT+FTPUN=\"hardware@panchsheel.biz\"", "OK\r", 10,0); + if(sendATcommand("AT+FTPPW=\"DAStest123\"", "OK\r", 10,0)) return 1; + else return 0; +} + +//--------------------------------------------------------------------------------------------------// +// FTP Send Function // +//--------------------------------------------------------------------------------------------------// + +void ftp_put(bool ftp_type) +{ + char ftpfilename[30]=""; + char ftpfilepath[100]=""; + if (ftp_type ==0) + { + sprintf(ftpfilename,"%s",filenameAC); + sprintf(ftpfilepath,"%s",pathAC); + } + else if (ftp_type ==1) + { + sprintf(ftpfilename,"%s",filenameDC); + sprintf(ftpfilepath,"%s",pathDC); + } + pc.printf("\r\nftp_put attempt\n\r"); + char command1[40]; + char result1[20]; + sprintf(command1,"%s\"%s\"", "AT+FTPPUTNAME=", ftpfilename); + sprintf(result1,"%s", "OK"); + for(int putname_attempt=0; putname_attempt<3;putname_attempt++) + { + if(sendATcommand(command1,result1, 10,0)) + { + // pc.printf("\n %p",ftpfilename); + sendATcommand("AT+FTPPUTPATH=\"/Trial//\"", "OK", 5,0); + if(sendATcommand("AT+FTPPUT=1", "OK", 10,0)) + { + // pc.printf("in loop"); + // pc.printf("\n\r %s",ftpfilepath); + FILE *fp9 = fopen(ftpfilepath, "r"); + if(fp9==NULL)return; + else + { + int trialcount=0; + int allowedtrials=5; + while(trialcount<allowedtrials) + { + if(sendATcommand("AT+FTPPUT=2,1000","+FTPPUT:2,1000", 10,0)) + { + trialcount=0; + for(int i=0; i<1000; i++) + { + gsm.printf("%c", fgetc(fp9)); + + } + break; + } + else + { + // pc.printf("attempt %d failed",trialcount); + trialcount++; + } + } + + fclose(fp9); + } + + for(int ftp_close_attempt=0; ftp_close_attempt<5; ftp_close_attempt++) + { + if(sendATcommand("AT+FTPPUT=2,0", "OK", 5,0)) + { + ftp_close_attempt=6; + } + } + return; + //} + + } + return; + } + } + // pc.printf("\n\r %s\n\r","i am not able to send data"); +} +/* +//-----------------------------------------------------------------------------------------------------------------// +// FTP Get +//----------------------------------------------------------------------------------------------------------------// +void downloadFTP() + +{ + char incoming_data[100]; + + //int data_size, aux; + + int x = 0; + int attempt=0; + int allowed_attempt=4; + sendATcommand3("AT+FTPGETNAME=\"abc.txt\"", "OK", 5); + sendATcommand3("AT+FTPGETPATH=\"/\"", "OK", 5); + while(attempt<allowed_attempt) + { + if (sendATcommand3("AT+FTPGET=1", "+FTPGET:1,1",20)==1) + { + + + for(int i=0; i<4;i++) + { + if (sendATcommand2("AT+FTPGET=2,70","+FTPGET:2,","+FTPGET:1,",10) == 1) + { + + //data_size = 0; + int previous = time(NULL); + + + do{ + if(gsm.readable() == 1){ + + incoming_data[x] = gsm.getc(); + x++; + } + }while((time(NULL) - previous) < 5); + + + pc.printf("Data is %s\r\n",incoming_data); + // const char s[2] = "\n"; + //char *token; + //int len=0; + //token = strtok(incoming_data, s); + //len = atoi(token); + strncpy(ftpget,incoming_data+3,51); + pc.printf("Data is %s",ftpget); + FILE *fp1 = fopen("/sd/Query.txt","w"); + fprintf(fp1,"%s",ftpget); + fclose(fp1); + pc.printf("\r\n Download finished"); + + break; + } + + } + + break; + } + + else + { + attempt++; + } + + } + pc.printf("\n@@@"); +} + + + */ + +//--------------------------------------------------------------------------------------------------// +// FTP Function Thread // +//--------------------------------------------------------------------------------------------------// + +void FTP_Fun(void const *args) +{ + tid6 = osThreadGetId(); + + while(true) + { + osSignalWait(0x1, osWaitForever); + if(ftp_connect()) + { + + ftp_put(0); + ftp_put(1); + // downloadFTP(); + + } + } +} +//--------------------------------------------------------------------------------------------------// +// Main Function // +//--------------------------------------------------------------------------------------------------// +int main() +{ + gsm_rst=1; + wait(5); + gsm.baud(115200); + pc.baud(115200); + pc.printf("\r\nHello"); + sendATcommand("AT+CLTS=1\r", "OK", 5,0); + wait(2); + sendATcommand("AT+CCLK?\r", "OK", 5,1); + + //pc.printf("\r\n%s",timestamp); + FILE *fp = fopen("/sd/SiteInfo.txt","a"); + if(fp == NULL) + { + FILE *fp = fopen("/sd/SiteInfo.txt","w"); + fprintf(fp, "\r\n%s",timestamp); + } + else + { + fprintf(fp, "\r\n%s",timestamp); + //pc.printf("\r\n%s",timestamp); + fclose(fp); + } + + Thread thread1(sampling); + Thread thread3(store); + Thread thread6(FTP_Fun); + + while(true) + { + for (int f=0; f<reset_time; f++)//reset after 60 min + { + Thread::wait(60000); + } + //pc.printf("\r\n---MODULE RESET---\r\n"); + //reset_mod(); + } +} \ No newline at end of file