Home AMX User Forum NetLinx Studio
Options

WRITE FILE INDEX ISSUE

HELP!

This may take a few passes through to figure out what I'm trying to accomplish.. but essentially I am trying to write to a structure that has a max legnth of 36. This works perfectly when booking a room, but for whatever reason the write file function extends the length of the cSUBJECT in the structure to 16 after each pass. I can't figure out why for the life of me.
PROGRAM_NAME='Calendar Demo Rev 1'
(***********************************************************)
(*  FILE CREATED ON: 01/16/2015  AT: 08:00:17              *)
(***********************************************************)
(*  FILE_LAST_MODIFIED_ON: 01/29/2015  AT: 11:14:13        *)
(***********************************************************)
DEFINE_DEVICE
dvMaster	=	0:1:0
dvTP		=	10001:1:0
dvTP_Locked	=	10001:3:0
dvTP_Mtg	=	10001:4:0


(***********************************************************)
(*               CONSTANT DEFINITIONS GO BELOW             *)
(***********************************************************)
DEFINE_CONSTANT
MAX_USERS = 500
MAX_MEETINGS = 36

TL_FEEDBACK = 1
TL_FEEDBACK2 = 2
TL_FEEDBACK3 = 3

(***********************************************************)
(*              DATA TYPE DEFINITIONS GO BELOW             *)
(***********************************************************)
DEFINE_TYPE

STRUCTURE _sUSERS //Presets Structure
{
    CHAR cID[15]
    CHAR cFIRST_NAME[25]
    CHAR cLAST_NAME[25]    
    CHAR cEMAIL[50]
}

STRUCTURE _sMTG //Mtg Structure
{
    CHAR cHOST_NAME[25]
    CHAR cSTART_DATE[25]
    CHAR cSTART_HOUR[4]
    CHAR cSTART_MINUTE[4]
    CHAR cEND_HOUR[4]
    CHAR cEND_MINUTE[4]
    CHAR cSUBJECT[50]
}
(***********************************************************)
(*               VARIABLE DEFINITIONS GO BELOW             *)
(***********************************************************)
DEFINE_VARIABLE

PERSISTENT _sUSERS uUSERS[MAX_USERS]
PERSISTENT _sMTG uMTG[MAX_MEETINGS]
VOLATILE CHAR cDATA[25] 
VOLATILE CHAR cBADGE[20]
VOLATILE INTEGER nVALID_ENTRY
VOLATILE INTEGER nDONE
VOLATILE CHAR cHOST_NAME[25]
VOLATILE CHAR cSTART_DATE[25]
VOLATILE CHAR cSTART_HOUR[4]
VOLATILE CHAR cSTART_MINUTE[4]
VOLATILE CHAR cEND_HOUR[4]
VOLATILE CHAR cEND_MINUTE[4]
VOLATILE CHAR cSUBJECT[50]
VOLATILE INTEGER nMINUTE
VOLATILE INTEGER nHOUR
VOLATILE INTEGER nMINUTE2
VOLATILE INTEGER nHOUR2
VOLATILE INTEGER nTIME
NON_VOLATILE sINTEGER nCURRENT_HOUR
NON_VOLATILE sINTEGER nCURRENT_MIN
NON_VOLATILE sINTEGER nCURRENT_MEETING
VOLATILE LONG nTIMER[] = {500}
VOLATILE LONG nTIMER2[] = {5000}
VOLATILE LONG nTIMER3[] = {10000}
VOLATILE INTEGER nCLOSED

NON_VOLATILE DEVCHAN dcMTGs[] = 
{
{dvTP_Locked, 1},
{dvTP_Locked, 2},
{dvTP_Locked, 3},
{dvTP_Locked, 4},
{dvTP_Locked, 5},
{dvTP_Locked, 6},
{dvTP_Locked, 7},
{dvTP_Locked, 8},
{dvTP_Locked, 9},
{dvTP_Locked, 10},
{dvTP_Locked, 11},
{dvTP_Locked, 12},
{dvTP_Locked, 13},
{dvTP_Locked, 14},
{dvTP_Locked, 15},
{dvTP_Locked, 16},
{dvTP_Locked, 17},
{dvTP_Locked, 18},
{dvTP_Locked, 19},
{dvTP_Locked, 20},
{dvTP_Locked, 21},
{dvTP_Locked, 22},
{dvTP_Locked, 23},
{dvTP_Locked, 24},
{dvTP_Locked, 25},
{dvTP_Locked, 26},
{dvTP_Locked, 27},
{dvTP_Locked, 28},
{dvTP_Locked, 29},
{dvTP_Locked, 30},
{dvTP_Locked, 31},
{dvTP_Locked, 32},
{dvTP_Locked, 33},
{dvTP_Locked, 34},
{dvTP_Locked, 35},
{dvTP_Locked, 36}
}             

(***********************************************************)
(*               LATCHING DEFINITIONS GO BELOW             *)
(***********************************************************)
DEFINE_LATCHING

(***********************************************************)
(*       MUTUALLY EXCLUSIVE DEFINITIONS GO BELOW           *)
(***********************************************************)
DEFINE_MUTUALLY_EXCLUSIVE

(***********************************************************)
(*        SUBROUTINE/FUNCTION DEFINITIONS GO BELOW         *)
(***********************************************************)
(* EXAMPLE: DEFINE_FUNCTION <RETURN_TYPE> <NAME> (<PARAMETERS>) *)
(* EXAMPLE: DEFINE_CALL '<NAME>' (<PARAMETERS>) *)

DEFINE_FUNCTION INTEGER fnCONVERT_REQUEST (INTEGER nSTART_HOUR, INTEGER nSTART_MINUTE, INTEGER nEND_HOUR, INTEGER nEND_MINUTE)
{
    STACK_VAR INTEGER nDURATION
    STACK_VAR i 
    STACK_VAR x 
    
    IF(nSTART_HOUR == 1)
    {
	nSTART_HOUR = 13
    }
    ELSE IF(nSTART_HOUR == 2)
    {
	nSTART_HOUR = 14
    }
    ELSE IF(nSTART_HOUR == 3)
    {
	nSTART_HOUR = 15
    }
    ELSE IF(nSTART_HOUR == 4)
    {
	nSTART_HOUR = 16
    }
    
    IF(nEND_HOUR == 1)
    {
	nEND_HOUR = 13
    }
    ELSE IF(nEND_HOUR == 2)
    {
	nEND_HOUR = 14
    }
    ELSE IF(nEND_HOUR == 3)
    {
	nEND_HOUR = 15
    }
    ELSE IF(nEND_HOUR == 4)
    {
	nEND_HOUR = 16
    }
    ELSE IF(nEND_HOUR == 5)
    {
	nEND_HOUR = 17
    }
 
    i = ((nEND_HOUR - nSTART_HOUR)*60)
    x = nEND_MINUTE - nSTART_MINUTE 
    
    nDURATION = i + x 

    RETURN nDURATION

}


DEFINE_FUNCTION INTEGER fnPROCESS_TIME (INTEGER nHOUR, INTEGER nMINUTE)
{
    STACK_VAR INTEGER t
    
    IF(nHOUR > 12)
    {
	nHOUR = nHOUR - 12
    }
    
    IF(nHOUR == 8 && nMINUTE < 15)
    {
	t = 1
    }
    ELSE IF(nHOUR == 8 && nMINUTE >= 15 && nMINUTE < 30)
    {
	t = 2
    }
    ELSE IF(nHOUR == 8 && nMINUTE >= 30 && nMINUTE < 45)
    {
	t = 3
    }
    ELSE IF(nHOUR == 8 && nMINUTE >= 45)
    {
	t = 4
    }
    ELSE IF(nHOUR == 9 && nMINUTE < 15)
    {
	t = 5
    }
    ELSE IF(nHOUR == 9 && nMINUTE >= 15 && nMINUTE < 30)
    {
	t = 6
    }
    ELSE IF(nHOUR == 9 && nMINUTE >= 30 && nMINUTE < 45)
    {
	t = 7
    }
    ELSE IF(nHOUR == 9 && nMINUTE >= 45)
    {
	t = 8
    }
    ELSE IF(nHOUR == 10 && nMINUTE < 15)
    {
	t = 9
    }
    ELSE IF(nHOUR == 10 && nMINUTE >= 15 && nMINUTE < 30)
    {
	t = 10
    }
    ELSE IF(nHOUR == 10 && nMINUTE >= 30 && nMINUTE < 45)
    {
	t = 11
    }
    ELSE IF(nHOUR == 10 && nMINUTE >= 45)
    {
	t = 12
    }
    ELSE IF(nHOUR == 11 && nMINUTE < 15)
    {
	t = 13
    }
    ELSE IF(nHOUR == 11 && nMINUTE >= 15 && nMINUTE < 30)
    {
	t = 14
    }
    ELSE IF(nHOUR == 11 && nMINUTE >= 30 && nMINUTE < 45)
    {
	t = 15
    }
    ELSE IF(nHOUR == 11 && nMINUTE >= 45)
    {
	t = 16
    }
    ELSE IF(nHOUR == 12 && nMINUTE < 15)
    {
	t = 17
    }
    ELSE IF(nHOUR == 12 && nMINUTE >= 15 && nMINUTE < 30)
    {
	t = 18
    }
    ELSE IF(nHOUR == 12 && nMINUTE >= 30 && nMINUTE < 45)
    {
	t = 19
    }
    ELSE IF(nHOUR == 12 && nMINUTE >= 45)
    {
	t = 20
    }
    ELSE IF(nHOUR == 1 && nMINUTE < 15)
    {
	t = 21
    }
    ELSE IF(nHOUR == 1 && nMINUTE >= 15 && nMINUTE < 30)
    {
	t = 22
    }
    ELSE IF(nHOUR == 1 && nMINUTE >= 30 && nMINUTE < 45)
    {
	t = 23
    }
    ELSE IF(nHOUR == 1 && nMINUTE >= 45)
    {
	t = 24
    }
    ELSE IF(nHOUR == 2 && nMINUTE < 15)
    {
	t = 25
    }
    ELSE IF(nHOUR == 2 && nMINUTE >= 15 && nMINUTE < 30)
    {
	t = 26
    }
    ELSE IF(nHOUR == 2 && nMINUTE >= 30 && nMINUTE < 45)
    {
	t = 27
    }
    ELSE IF(nHOUR == 2 && nMINUTE >= 45)
    {
	t = 28
    }
    ELSE IF(nHOUR == 3 && nMINUTE < 15)
    {
	t = 29
    }
    ELSE IF(nHOUR == 3 && nMINUTE >= 15 && nMINUTE < 30)
    {
	t = 30
    }
    ELSE IF(nHOUR == 3 && nMINUTE >= 30 && nMINUTE < 45)
    {
	t = 31
    }
    ELSE IF(nHOUR == 3 && nMINUTE >= 45)
    {
	t = 32
    }
    ELSE IF(nHOUR == 4 && nMINUTE < 15)
    {
	t = 33
    }
    ELSE IF(nHOUR == 4 && nMINUTE >= 15 && nMINUTE < 30)
    {
	t = 34
    }
    ELSE IF(nHOUR == 4 && nMINUTE >= 30 && nMINUTE < 45)
    {
	t = 35
	
    }
    ELSE IF(nHOUR == 4 && nMINUTE >= 45)
    {
	t = 36
    }
    
    RETURN t
} 



DEFINE_FUNCTION sINTEGER fnFILL_CALENDAR (INTEGER nCURRENT_HOUR, INTEGER nCURRENT_MIN)
{   
    STACK_VAR INTEGER x
    STACK_VAR INTEGER nINDEX 
    
    FOR(x=1; x<=MAX_LENGTH_ARRAY(uMTG); x++)
    {
	IF(LENGTH_STRING(uMTG[x].cSUBJECT) > 0)
	{
	    IF(uMTG[x].cSUBJECT == uMTG[x].cSUBJECT)
	    {
		ON[dvTP_Locked, x]
	    }
	}
	ELSE
	{
	    OFF[dvTP_Locked, x]
	}
    }
    
    IF(nCURRENT_HOUR > 12)
    {
	nCURRENT_HOUR = nCURRENT_HOUR - 12
    }
    
    nINDEX = fnPROCESS_TIME(nCURRENT_HOUR, nCURRENT_MIN)
    
    IF(LENGTH_STRING(uMTG[nINDEX].cSUBJECT) > 0)
    {
	SEND_COMMAND dvTP, "'^TXT-1,0,',uMTG[nINDEX].cSUBJECT"
	RETURN TRUE 
    }
    ELSE
    {
	SEND_COMMAND dvTP, "'^TXT-1,0,Vacant'"
	RETURN FALSE 
    }
	
}

DEFINE_FUNCTION INTEGER fnPROCESS_REQUEST (INTEGER nINDEX, INTEGER nNUM_MTGs)
{
    STACK_VAR INTEGER i
    
    fnREAD_FILE_MTG('New_Mtg.csv')
    
    IF(LENGTH_STRING(uMTG[nINDEX].cSUBJECT) < 1)
    {
	FOR(i=1; i<=nNUM_MTGs; i++)
	{
	    IF(LENGTH_STRING(uMTG[nINDEX].cSUBJECT) < 1)
	    {
		RETURN TRUE 
	    }
	    ELSE IF(LENGTH_STRING(uMTG[nINDEX].cSUBJECT) > 1)
	    {
		RETURN FALSE
		BREAK;
	    }
	    
	    nINDEX++
	}
    }
}

DEFINE_FUNCTION fnRead_BadgeID (CHAR cFILENAME[])
{
    LOCAL_VAR SLONG slFILE_VAL
    
    slFILE_VAL = FILE_OPEN(cFILENAME,FILE_READ_ONLY)
    IF(slFILE_VAL < 0)
    {
	SELECT
	{
	    ACTIVE(slFILE_VAL == -2): SEND_STRING 0, "'Invalid Path'"
	    ACTIVE(slFILE_VAL == -3): SEND_STRING 0, "'Invalid Value'"
	    ACTIVE(slFILE_VAL == -5): SEND_STRING 0, "'I/O Error'"
	    ACTIVE(slFILE_VAL == -14):SEND_STRING 0, "'Max Files Open'"
	    ACTIVE(slFILE_VAL == -15):SEND_STRING 0, "'Invalid File Format'"
	}
    }
    ELSE IF(slFILE_VAL > 0)
    {
	LOCAL_VAR SLONG slVAL
	LOCAL_VAR INTEGER i
	LOCAL_VAR CHAR cBUFF[2048]
	
	FOR(i=1; i<=MAX_LENGTH_ARRAY(uUSERS); i++)
	{
	    slVAL = FILE_READ_LINE(slFILE_VAL,cBUFF,MAX_LENGTH_ARRAY(cBUFF))
	    
	    uUSERS[i].cID = REMOVE_STRING(cBUFF,',',1)
	    SET_LENGTH_STRING(uUSERS[i].cID,LENGTH_STRING(uUSERS[i].cID)-1)
	    uUSERS[i].cFIRST_NAME = REMOVE_STRING(cBUFF,',',1)
	    SET_LENGTH_STRING(uUSERS[i].cFIRST_NAME,LENGTH_STRING(uUSERS[i].cFIRST_NAME)-1)
	    uUSERS[i].cLAST_NAME = REMOVE_STRING(cBUFF,',',1)
	    SET_LENGTH_STRING(uUSERS[i].cLAST_NAME,LENGTH_STRING(uUSERS[i].cLAST_NAME)-1)
	    uUSERS[i].cEMAIL = cBUFF
	}
		
	FILE_CLOSE(slFILE_VAL)
    }
}

DEFINE_FUNCTION fnREAD_FILE_MTG (CHAR cFILENAME[])
{
    LOCAL_VAR SLONG slFILE_VAL
    
    slFILE_VAL = FILE_OPEN(cFILENAME,FILE_READ_ONLY)
    IF(slFILE_VAL < 0)
    {
	SELECT
	{
	    ACTIVE(slFILE_VAL == -2): SEND_STRING 0, "'Invalid Path'"
	    ACTIVE(slFILE_VAL == -3): SEND_STRING 0, "'Invalid Value'"
	    ACTIVE(slFILE_VAL == -5): SEND_STRING 0, "'I/O Error'"
	    ACTIVE(slFILE_VAL == -14):SEND_STRING 0, "'Max Files Open'"
	    ACTIVE(slFILE_VAL == -15):SEND_STRING 0, "'Invalid File Format'"
	}
    }
    ELSE IF(slFILE_VAL > 0)
    {
	LOCAL_VAR SLONG slVAL
	LOCAL_VAR INTEGER i
	STACK_VAR INTEGER x 
	LOCAL_VAR CHAR cBUFF[2048]
	
	FOR(i=1; i<=MAX_LENGTH_ARRAY(uMTG); i++)
	{
	    slVAL = FILE_READ_LINE(slFILE_VAL,cBUFF,MAX_LENGTH_ARRAY(cBUFF))
	    
	    uMTG[i].cHOST_NAME = REMOVE_STRING(cBUFF,',',1)
	    SET_LENGTH_STRING(uMTG[i].cHOST_NAME,LENGTH_STRING(uMTG[i].cHOST_NAME)-1)
	    uMTG[i].cSTART_DATE = REMOVE_STRING(cBUFF,',',1)
	    SET_LENGTH_STRING(uMTG[i].cSTART_DATE,LENGTH_STRING(uMTG[i].cSTART_DATE)-1)
	    uMTG[i].cSTART_HOUR = REMOVE_STRING(cBUFF,',',1)
	    SET_LENGTH_STRING(uMTG[i].cSTART_HOUR,LENGTH_STRING(uMTG[i].cSTART_HOUR)-1)
	    uMTG[i].cSTART_MINUTE = REMOVE_STRING(cBUFF,',',1)
	    SET_LENGTH_STRING(uMTG[i].cSTART_MINUTE,LENGTH_STRING(uMTG[i].cSTART_MINUTE)-1)
	    uMTG[i].cEND_HOUR = REMOVE_STRING(cBUFF,',',1)
	    SET_LENGTH_STRING(uMTG[i].cEND_HOUR,LENGTH_STRING(uMTG[i].cEND_HOUR)-1)
	    uMTG[i].cEND_MINUTE = REMOVE_STRING(cBUFF,',',1)
	    SET_LENGTH_STRING(uMTG[i].cEND_MINUTE,LENGTH_STRING(uMTG[i].cEND_MINUTE)-1)
	    uMTG[i].cSUBJECT = cBUFF
	}
		
	FILE_CLOSE(slFILE_VAL)
    }
}

DEFINE_FUNCTION fnWRITE_FILE_MTG(CHAR cFILENAME[])
{
    LOCAL_VAR CHAR cBUFF[2048]
    LOCAL_VAR SLONG slFILE_VAR
    LOCAL_VAR INTEGER i
    LOCAL_VAR SLONG slRESULT
    
    slFILE_VAR = FILE_OPEN(cFILENAME,FILE_RW_NEW)
    
    IF(slFILE_VAR > 0)
    {
	FOR(i=1; i<=MAX_LENGTH_ARRAY(uMTG); i++)
	{
	    cBUFF = "uMTG[i].cHOST_NAME,',',uMTG[i].cSTART_DATE,',',uMTG[i].cSTART_HOUR,',',uMTG[i].cSTART_MINUTE,',',uMTG[i].cEND_HOUR,',',uMTG[i].cEND_MINUTE,',',uMTG[i].cSUBJECT"
	    slRESULT = FILE_WRITE_LINE(slFILE_VAR,cBUFF,LENGTH_STRING(cBUFF))
	}
	
	FILE_CLOSE(slFILE_VAR)
	
	SEND_STRING 0,"'GOOD FILE CLOSED ',ITOA(FILE_CLOSE(slFILE_VAR))"
    }
    ELSE
    {
	SEND_STRING 0,"'BAD FILE OPEN ',ITOA(FILE_CLOSE(slFILE_VAR))"
    }
}


(***********************************************************)
(*                STARTUP CODE GOES BELOW                  *)
(***********************************************************)
DEFINE_START
fnREAD_FILE_MTG('New_Mtg.csv')
TIMELINE_CREATE(TL_FEEDBACK,  nTIMER,  1, TIMELINE_ABSOLUTE, TIMELINE_REPEAT) //Half Second
TIMELINE_CREATE(TL_FEEDBACK2, nTIMER2, 1, TIMELINE_ABSOLUTE, TIMELINE_REPEAT) // 5 Seconds
TIMELINE_CREATE(TL_FEEDBACK3, nTIMER3, 1, TIMELINE_ABSOLUTE, TIMELINE_REPEAT) //60 Seconds
(***********************************************************)
(*                THE EVENTS GO BELOW                      *)
(***********************************************************)
DEFINE_EVENT

DATA_EVENT[dvMaster] //Master Data Event 
{
    ONLINE:
    {
	SEND_COMMAND dvTP, "'ADBEEP'" //When online, BEEP!
    }
    STRING:
    {
	IF(FIND_STRING(DATA.TEXT, "'GOOD FILE CLOSED'", 1))
	{
	    PULSE[nCLOSED]
	}
    }
}

DATA_EVENT[dvTP]
{    
    STRING:
    {
	STACK_VAR INTEGER x 
	
	SEND_STRING 0, "'FROM TP: ', DATA.TEXT"
	
	SELECT
	{
	    
	    
	    ACTIVE(FIND_STRING(DATA.TEXT, 'Button 16-', 1)):
	    {
		REMOVE_STRING(DATA.TEXT, 'Button 16-', 1)
		cBADGE = DATA.TEXT 

		IF(LENGTH_STRING(cBADGE == 11))
		{
		    fnRead_BadgeID('Badge_IDs.csv')
		    
		    FOR(x=1; x<=MAX_LENGTH_ARRAY(uUSERS); x++)
		    {
			IF(cBADGE == uUSERS[x].cID)
			{
			    SEND_COMMAND dvTP, "'@PPN-New Mtg'"
			    SEND_COMMAND dvTP, "'@PPK-Authorization'"
			    SEND_COMMAND dvTP, "'@PPK-Invalid Entry'"
			    SEND_COMMAND dvTP_Mtg, "'^TXT-1,0,',uUSERS[x].cFIRST_NAME,',',uUSERS[x].cLAST_NAME"
			    ON[nVALID_ENTRY]
			    
			    cHOST_NAME = "uUSERS[x].cFIRST_NAME,' ',uUSERS[x].cLAST_NAME"
			    SEND_COMMAND dvTP_Mtg, "'^TXT-2,0,',DATE"
			    
			    BREAK;
			}
			ELSE
			{
			    SEND_COMMAND dvTP, "'@PPN-Invalid Entry'"
			    SEND_COMMAND dvTP, "'@PPK-Authorization'"
			    OFF[nVALID_ENTRY]
			    WAIT 40
			    {
				SEND_COMMAND dvTP, "'@PPK-Invalid Entry'"
				SEND_COMMAND dvTP, "'PAGE-Locked'"
			    }
			}
		    }
		}
	    }
	    ACTIVE(FIND_STRING(DATA.TEXT, '@PPF-Authorization;Locked', 1)):
	    {
		SET_LENGTH_STRING(cHOST_NAME, 0)
		SET_LENGTH_STRING(cSTART_DATE, 0)
		SET_LENGTH_STRING(cSTART_HOUR, 0)
		SET_LENGTH_STRING(cSTART_MINUTE, 0)
		SET_LENGTH_STRING(cEND_HOUR, 0)
		SET_LENGTH_STRING(cEND_MINUTE, 0)
		SET_LENGTH_STRING(cSUBJECT, 0)
		
		SEND_COMMAND dvTP_Mtg, "'^TXT-3,0,'"
		SEND_COMMAND dvTP_Mtg, "'^TXT-4,0,'"
		SEND_COMMAND dvTP_Mtg, "'^TXT-5,0,'"
		SEND_COMMAND dvTP_Mtg, "'^TXT-6,0,'"
		SEND_COMMAND dvTP_Mtg, "'^TXT-11,0,'"
		SEND_COMMAND dvTP_Mtg, "'^TXT-12,0,'"
		SEND_COMMAND dvTP_Mtg, "'^TXT-13,0,'"
	    }
	    ACTIVE(FIND_STRING(DATA.TEXT,'KEYB-',1)):
	    {
		REMOVE_STRING(DATA.TEXT,'KEYB-',1)
		cDATA = DATA.TEXT
	    }
	    ACTIVE(FIND_STRING(DATA.TEXT,'KEYP-',1)):
	    {
		REMOVE_STRING(DATA.TEXT,'KEYP-',1)
		
		IF(nTIME == 1)
		{
		    nHOUR = ATOI(DATA.TEXT) 
		}
		ELSE IF(nTIME == 2)
		{
		    nMINUTE = ATOI(DATA.TEXT)
		}
		ELSE IF(nTIME == 3)
		{
		    nHOUR2 = ATOI(DATA.TEXT)
		}
		ELSE IF(nTIME == 4)
		{
		    nMINUTE2 = ATOI(DATA.TEXT)
		}
	    }
	}
	PULSE[nDONE]
    }
}


BUTTON_EVENT[dvTP_Mtg, 3]
{
    PUSH:
    {
	TO[BUTTON.INPUT]
	nTIME = 1;
    }
    RELEASE:
    {
	WAIT_UNTIL(nDONE)
	{
	    cSTART_HOUR = ITOA(nHOUR)
	    
	    SEND_COMMAND dvTP_Mtg, "'^TXT-3,0,',cSTART_HOUR" 
	    
	    IF(nHOUR >= 8 && nHOUR < 12)
	    {
		SEND_COMMAND dvTP_Mtg, "'^TXT-5,0,AM'"
	    }
	    ELSE
	    {
		SEND_COMMAND dvTP_Mtg, "'^TXT-5,0,PM'"
	    }
	}
    }
}

BUTTON_EVENT[dvTP_Mtg, 4]
{
    PUSH:
    {
	nTIME = 2;
    }
    RELEASE:
    {
	WAIT_UNTIL(nDONE)
	{
	    cSTART_MINUTE = ITOA(nMINUTE)
	    
	    IF(nMINUTE == 0)
	    {	
		cSTART_MINUTE = "'00'"
	    }
	    
	    SEND_COMMAND dvTP_Mtg, "'^TXT-4,0,',cSTART_MINUTE" 
	}
    }
}

BUTTON_EVENT[dvTP_Mtg, 11]
{
    PUSH:
    {
	nTIME = 3;
    }
    RELEASE:
    {
	WAIT_UNTIL(nDONE)
	{
	    cEND_HOUR = ITOA(nHOUR2)
	    
	    SEND_COMMAND dvTP_Mtg, "'^TXT-11,0,',cEND_HOUR" 
	    
	    IF(nHOUR2 >= 8 && nHOUR2 < 12)
	    {
		SEND_COMMAND dvTP_Mtg, "'^TXT-13,0,AM'"
	    }
	    ELSE
	    {
		SEND_COMMAND dvTP_Mtg, "'^TXT-13,0,PM'"
	    }
	}
    }
}

BUTTON_EVENT[dvTP_Mtg, 12]
{
    PUSH:
    {
	nTIME = 4;
    }
    RELEASE:
    {
	WAIT_UNTIL(nDONE)
	{
	    cEND_MINUTE = ITOA(nMINUTE2)
	    
	    IF(nMINUTE2 == 0)
	    {	
		cEND_MINUTE = "'00'"
	    }
	    SEND_COMMAND dvTP_Mtg, "'^TXT-12,0,',cEND_MINUTE" 
	}
    }
}

BUTTON_EVENT[dvTP_Mtg, 6]
{
    PUSH:
    {
    }
    RELEASE:
    {
	WAIT_UNTIL(nDONE)
	{
	    cSUBJECT = cDATA 
	    SEND_COMMAND dvTP_Mtg, "'^TXT-6,0,',cSUBJECT"
	}
    }
}

BUTTON_EVENT[dvTP_Mtg, 10] //reserve a new meeting
{
    PUSH:
    {
	LOCAL_VAR INTEGER x
	LOCAL_VAR INTEGER INDEX 
	LOCAL_VAR INTEGER nDURATION 
	LOCAL_VAR INTEGER nNUM_MTGS 
	LOCAL_VAR INTEGER ACCESS 
	
	INDEX = fnPROCESS_TIME(nHOUR, nMINUTE)
	nDURATION = fnCONVERT_REQUEST(nHOUR, nMINUTE, nHOUR2, nMINUTE2)
	nNUM_MTGS = (nDURATION/15)
	ACCESS = fnPROCESS_REQUEST(INDEX, nNUM_MTGS)
	
	IF(LENGTH_STRING(cSUBJECT) > 0)
	{
	    OFF[dvTP_Mtg, 16]
	    
	    IF(ACCESS == 1)
	    {	
		FOR(x=1; x<=nNUM_MTGS; x++)
		{
		    uMTG[INDEX].cHOST_NAME    = cHOST_NAME
		    uMTG[INDEX].cSTART_DATE   = DATE
		    uMTG[INDEX].cSTART_HOUR   = cSTART_HOUR
		    uMTG[INDEX].cSTART_MINUTE = cSTART_MINUTE
		    uMTG[INDEX].cEND_HOUR     = cEND_HOUR
		    uMTG[INDEX].cEND_MINUTE   = cEND_MINUTE
		    uMTG[INDEX].cSUBJECT      = cSUBJECT
		    
		    fnWRITE_FILE_MTG('New_Mtg.csv')
		    
		    INDEX++
		    
		    IF(x == nNUM_MTGs)
		    {
			BREAK;
		    }
		}
		SEND_COMMAND dvTP, "'@PPX-New Mtg'"
	    }
	    ELSE IF(ACCESS == 0)
	    {
		SEND_COMMAND dvTP, "'@PPN-Error'"
	    }
	}
	ELSE
	{
	    ON[dvTP_Mtg, 16]
	}
    }
}

BUTTON_EVENT[dvTP, 4] //Cancel the current meeting
{
    PUSH:
    {
	LOCAL_VAR INTEGER i
	LOCAL_VAR INTEGER nDURATION2
	LOCAL_VAR INTEGER nNUM_MTGs2
	LOCAL_VAR INTEGER nLINE
	
	nLINE = fnPROCESS_TIME(nCURRENT_HOUR, nCURRENT_MIN)
	nDURATION2 = fnCONVERT_REQUEST(ATOI(uMTG[nLINE].cSTART_HOUR), ATOI(uMTG[nLINE].cSTART_MINUTE), ATOI(uMTG[nLINE].cEND_HOUR), ATOI(uMTG[nLINE].cEND_MINUTE))
	nNUM_MTGs2 = (nDURATION2/15)

	FOR(i=1; i<=nNUM_MTGS2; i++)
	{
	    SET_LENGTH_STRING(uMTG[nLINE].cHOST_NAME, 0)
	    SET_LENGTH_STRING(uMTG[nLINE].cSTART_DATE, 0)
	    SET_LENGTH_STRING(uMTG[nLINE].cSTART_HOUR, 0)
	    SET_LENGTH_STRING(uMTG[nLINE].cSTART_MINUTE, 0)
	    SET_LENGTH_STRING(uMTG[nLINE].cEND_HOUR, 0)
	    SET_LENGTH_STRING(uMTG[nLINE].cEND_MINUTE, 0)
	    SET_LENGTH_STRING(uMTG[nLINE].cSUBJECT, 0)
	    
	    fnWRITE_FILE_MTG('New_Mtg.csv')
	    
	    nLINE++
	    
	    IF(i == nNUM_MTGs2)
	    {
		BREAK;
	    }
	}
    }
}

BUTTON_EVENT[dcMTGs]
{
    PUSH:
    {
	STACK_VAR INTEGER BIC
	BIC = BUTTON.INPUT.CHANNEL 
	
	ON[dvTP, 6]
	ON[dvTP, 7]
	
	IF(LENGTH_STRING(uMTG[BIC].cSUBJECT) > 0)
	{
	    SEND_COMMAND dvTP, "'^TXT-2,0,',uMTG[BIC].cSUBJECT,' ',uMTG[BIC].cSTART_HOUR,':',uMTG[BIC].cSTART_MINUTE,' - ',uMTG[BIC].cEND_HOUR,':',uMTG[BIC].cEND_MINUTE"
	}
	ELSE
	{
	    SEND_COMMAND dvTP, "'^TXT-2,0,Meeting room available'"
	}
	
	WAIT 50
	{
	    OFF[dvTP, 6]
	    OFF[dvTP, 7]
	}
    }
} 

BUTTON_EVENT[dvTP, 3]
{
    PUSH:
    {
	STACK_VAR INTEGER y 
	
	y = fnPROCESS_TIME(nCURRENT_HOUR, nCURRENT_MIN)
	
	IF(LENGTH_STRING(uMTG[y].cSUBJECT) > 0)
	{
	    SEND_COMMAND dvTP, "'^TXT-3,0,',uMTG[y].cSUBJECT"
	}
	ELSE
	{
	    SEND_COMMAND dvTP, "'^TXT-3,0,There is no meeting to cancel...'"
	}
    }
}


TIMELINE_EVENT[TL_FEEDBACK]
{
    nCURRENT_HOUR = TIME_TO_HOUR(TIME)
    nCURRENT_MIN =  TIME_TO_MINUTE(TIME)
}

TIMELINE_EVENT[TL_FEEDBACK2]
{
    nCURRENT_MEETING = fnFILL_CALENDAR(nCURRENT_HOUR, nCURRENT_MIN)
}

TIMELINE_EVENT[TL_FEEDBACK3]
{
   fnREAD_FILE_MTG('New_Mtg.csv')
}

(***********************************************************)
(*            THE ACTUAL PROGRAM GOES BELOW                *)
(***********************************************************)
DEFINE_PROGRAM

[dvTP, 1] = (nCURRENT_MEETING == 1)


(***********************************************************)
(*                     END OF PROGRAM                      *)
(*        DO NOT PUT ANY CODE BELOW THIS COMMENT           *)
(***********************************************************)

Comments

  • Options
    cmasoncmason Posts: 123
    mjones2620 wrote: »
    HELP!

    This may take a few passes through to figure out what I'm trying to accomplish.. but essentially I am trying to write to a structure that has a max legnth of 36. This works perfectly when booking a room, but for whatever reason the write file function extends the length of the cSUBJECT in the structure to 16 after each pass. I can't figure out why for the life of me.
    PROGRAM_NAME='Calendar Demo Rev 1'
    (***********************************************************)
    (*  FILE CREATED ON: 01/16/2015  AT: 08:00:17              *)
    (***********************************************************)
    (*  FILE_LAST_MODIFIED_ON: 01/29/2015  AT: 11:14:13        *)
    (***********************************************************)
    DEFINE_DEVICE
    dvMaster	=	0:1:0
    dvTP		=	10001:1:0
    dvTP_Locked	=	10001:3:0
    dvTP_Mtg	=	10001:4:0
    
    
    (***********************************************************)
    (*               CONSTANT DEFINITIONS GO BELOW             *)
    (***********************************************************)
    DEFINE_CONSTANT
    MAX_USERS = 500
    MAX_MEETINGS = 36
    
    TL_FEEDBACK = 1
    TL_FEEDBACK2 = 2
    TL_FEEDBACK3 = 3
    
    (***********************************************************)
    (*              DATA TYPE DEFINITIONS GO BELOW             *)
    (***********************************************************)
    DEFINE_TYPE
    
    STRUCTURE _sUSERS //Presets Structure
    {
        CHAR cID[15]
        CHAR cFIRST_NAME[25]
        CHAR cLAST_NAME[25]    
        CHAR cEMAIL[50]
    }
    
    STRUCTURE _sMTG //Mtg Structure
    {
        CHAR cHOST_NAME[25]
        CHAR cSTART_DATE[25]
        CHAR cSTART_HOUR[4]
        CHAR cSTART_MINUTE[4]
        CHAR cEND_HOUR[4]
        CHAR cEND_MINUTE[4]
        CHAR cSUBJECT[50]
    }
    (***********************************************************)
    (*               VARIABLE DEFINITIONS GO BELOW             *)
    (***********************************************************)
    DEFINE_VARIABLE
    
    PERSISTENT _sUSERS uUSERS[MAX_USERS]
    PERSISTENT _sMTG uMTG[MAX_MEETINGS]
    VOLATILE CHAR cDATA[25] 
    VOLATILE CHAR cBADGE[20]
    VOLATILE INTEGER nVALID_ENTRY
    VOLATILE INTEGER nDONE
    VOLATILE CHAR cHOST_NAME[25]
    VOLATILE CHAR cSTART_DATE[25]
    VOLATILE CHAR cSTART_HOUR[4]
    VOLATILE CHAR cSTART_MINUTE[4]
    VOLATILE CHAR cEND_HOUR[4]
    VOLATILE CHAR cEND_MINUTE[4]
    VOLATILE CHAR cSUBJECT[50]
    VOLATILE INTEGER nMINUTE
    VOLATILE INTEGER nHOUR
    VOLATILE INTEGER nMINUTE2
    VOLATILE INTEGER nHOUR2
    VOLATILE INTEGER nTIME
    NON_VOLATILE sINTEGER nCURRENT_HOUR
    NON_VOLATILE sINTEGER nCURRENT_MIN
    NON_VOLATILE sINTEGER nCURRENT_MEETING
    VOLATILE LONG nTIMER[] = {500}
    VOLATILE LONG nTIMER2[] = {5000}
    VOLATILE LONG nTIMER3[] = {10000}
    VOLATILE INTEGER nCLOSED
    
    NON_VOLATILE DEVCHAN dcMTGs[] = 
    {
    {dvTP_Locked, 1},
    {dvTP_Locked, 2},
    {dvTP_Locked, 3},
    {dvTP_Locked, 4},
    {dvTP_Locked, 5},
    {dvTP_Locked, 6},
    {dvTP_Locked, 7},
    {dvTP_Locked, 8},
    {dvTP_Locked, 9},
    {dvTP_Locked, 10},
    {dvTP_Locked, 11},
    {dvTP_Locked, 12},
    {dvTP_Locked, 13},
    {dvTP_Locked, 14},
    {dvTP_Locked, 15},
    {dvTP_Locked, 16},
    {dvTP_Locked, 17},
    {dvTP_Locked, 18},
    {dvTP_Locked, 19},
    {dvTP_Locked, 20},
    {dvTP_Locked, 21},
    {dvTP_Locked, 22},
    {dvTP_Locked, 23},
    {dvTP_Locked, 24},
    {dvTP_Locked, 25},
    {dvTP_Locked, 26},
    {dvTP_Locked, 27},
    {dvTP_Locked, 28},
    {dvTP_Locked, 29},
    {dvTP_Locked, 30},
    {dvTP_Locked, 31},
    {dvTP_Locked, 32},
    {dvTP_Locked, 33},
    {dvTP_Locked, 34},
    {dvTP_Locked, 35},
    {dvTP_Locked, 36}
    }             
    
    (***********************************************************)
    (*               LATCHING DEFINITIONS GO BELOW             *)
    (***********************************************************)
    DEFINE_LATCHING
    
    (***********************************************************)
    (*       MUTUALLY EXCLUSIVE DEFINITIONS GO BELOW           *)
    (***********************************************************)
    DEFINE_MUTUALLY_EXCLUSIVE
    
    (***********************************************************)
    (*        SUBROUTINE/FUNCTION DEFINITIONS GO BELOW         *)
    (***********************************************************)
    (* EXAMPLE: DEFINE_FUNCTION <RETURN_TYPE> <NAME> (<PARAMETERS>) *)
    (* EXAMPLE: DEFINE_CALL '<NAME>' (<PARAMETERS>) *)
    
    DEFINE_FUNCTION INTEGER fnCONVERT_REQUEST (INTEGER nSTART_HOUR, INTEGER nSTART_MINUTE, INTEGER nEND_HOUR, INTEGER nEND_MINUTE)
    {
        STACK_VAR INTEGER nDURATION
        STACK_VAR i 
        STACK_VAR x 
        
        IF(nSTART_HOUR == 1)
        {
    	nSTART_HOUR = 13
        }
        ELSE IF(nSTART_HOUR == 2)
        {
    	nSTART_HOUR = 14
        }
        ELSE IF(nSTART_HOUR == 3)
        {
    	nSTART_HOUR = 15
        }
        ELSE IF(nSTART_HOUR == 4)
        {
    	nSTART_HOUR = 16
        }
        
        IF(nEND_HOUR == 1)
        {
    	nEND_HOUR = 13
        }
        ELSE IF(nEND_HOUR == 2)
        {
    	nEND_HOUR = 14
        }
        ELSE IF(nEND_HOUR == 3)
        {
    	nEND_HOUR = 15
        }
        ELSE IF(nEND_HOUR == 4)
        {
    	nEND_HOUR = 16
        }
        ELSE IF(nEND_HOUR == 5)
        {
    	nEND_HOUR = 17
        }
     
        i = ((nEND_HOUR - nSTART_HOUR)*60)
        x = nEND_MINUTE - nSTART_MINUTE 
        
        nDURATION = i + x 
    
        RETURN nDURATION
    
    }
    
    
    DEFINE_FUNCTION INTEGER fnPROCESS_TIME (INTEGER nHOUR, INTEGER nMINUTE)
    {
        STACK_VAR INTEGER t
        
        IF(nHOUR > 12)
        {
    	nHOUR = nHOUR - 12
        }
        
        IF(nHOUR == 8 && nMINUTE < 15)
        {
    	t = 1
        }
        ELSE IF(nHOUR == 8 && nMINUTE >= 15 && nMINUTE < 30)
        {
    	t = 2
        }
        ELSE IF(nHOUR == 8 && nMINUTE >= 30 && nMINUTE < 45)
        {
    	t = 3
        }
        ELSE IF(nHOUR == 8 && nMINUTE >= 45)
        {
    	t = 4
        }
        ELSE IF(nHOUR == 9 && nMINUTE < 15)
        {
    	t = 5
        }
        ELSE IF(nHOUR == 9 && nMINUTE >= 15 && nMINUTE < 30)
        {
    	t = 6
        }
        ELSE IF(nHOUR == 9 && nMINUTE >= 30 && nMINUTE < 45)
        {
    	t = 7
        }
        ELSE IF(nHOUR == 9 && nMINUTE >= 45)
        {
    	t = 8
        }
        ELSE IF(nHOUR == 10 && nMINUTE < 15)
        {
    	t = 9
        }
        ELSE IF(nHOUR == 10 && nMINUTE >= 15 && nMINUTE < 30)
        {
    	t = 10
        }
        ELSE IF(nHOUR == 10 && nMINUTE >= 30 && nMINUTE < 45)
        {
    	t = 11
        }
        ELSE IF(nHOUR == 10 && nMINUTE >= 45)
        {
    	t = 12
        }
        ELSE IF(nHOUR == 11 && nMINUTE < 15)
        {
    	t = 13
        }
        ELSE IF(nHOUR == 11 && nMINUTE >= 15 && nMINUTE < 30)
        {
    	t = 14
        }
        ELSE IF(nHOUR == 11 && nMINUTE >= 30 && nMINUTE < 45)
        {
    	t = 15
        }
        ELSE IF(nHOUR == 11 && nMINUTE >= 45)
        {
    	t = 16
        }
        ELSE IF(nHOUR == 12 && nMINUTE < 15)
        {
    	t = 17
        }
        ELSE IF(nHOUR == 12 && nMINUTE >= 15 && nMINUTE < 30)
        {
    	t = 18
        }
        ELSE IF(nHOUR == 12 && nMINUTE >= 30 && nMINUTE < 45)
        {
    	t = 19
        }
        ELSE IF(nHOUR == 12 && nMINUTE >= 45)
        {
    	t = 20
        }
        ELSE IF(nHOUR == 1 && nMINUTE < 15)
        {
    	t = 21
        }
        ELSE IF(nHOUR == 1 && nMINUTE >= 15 && nMINUTE < 30)
        {
    	t = 22
        }
        ELSE IF(nHOUR == 1 && nMINUTE >= 30 && nMINUTE < 45)
        {
    	t = 23
        }
        ELSE IF(nHOUR == 1 && nMINUTE >= 45)
        {
    	t = 24
        }
        ELSE IF(nHOUR == 2 && nMINUTE < 15)
        {
    	t = 25
        }
        ELSE IF(nHOUR == 2 && nMINUTE >= 15 && nMINUTE < 30)
        {
    	t = 26
        }
        ELSE IF(nHOUR == 2 && nMINUTE >= 30 && nMINUTE < 45)
        {
    	t = 27
        }
        ELSE IF(nHOUR == 2 && nMINUTE >= 45)
        {
    	t = 28
        }
        ELSE IF(nHOUR == 3 && nMINUTE < 15)
        {
    	t = 29
        }
        ELSE IF(nHOUR == 3 && nMINUTE >= 15 && nMINUTE < 30)
        {
    	t = 30
        }
        ELSE IF(nHOUR == 3 && nMINUTE >= 30 && nMINUTE < 45)
        {
    	t = 31
        }
        ELSE IF(nHOUR == 3 && nMINUTE >= 45)
        {
    	t = 32
        }
        ELSE IF(nHOUR == 4 && nMINUTE < 15)
        {
    	t = 33
        }
        ELSE IF(nHOUR == 4 && nMINUTE >= 15 && nMINUTE < 30)
        {
    	t = 34
        }
        ELSE IF(nHOUR == 4 && nMINUTE >= 30 && nMINUTE < 45)
        {
    	t = 35
    	
        }
        ELSE IF(nHOUR == 4 && nMINUTE >= 45)
        {
    	t = 36
        }
        
        RETURN t
    } 
    
    
    
    DEFINE_FUNCTION sINTEGER fnFILL_CALENDAR (INTEGER nCURRENT_HOUR, INTEGER nCURRENT_MIN)
    {   
        STACK_VAR INTEGER x
        STACK_VAR INTEGER nINDEX 
        
        FOR(x=1; x<=MAX_LENGTH_ARRAY(uMTG); x++)
        {
    	IF(LENGTH_STRING(uMTG[x].cSUBJECT) > 0)
    	{
    	    IF(uMTG[x].cSUBJECT == uMTG[x].cSUBJECT)
    	    {
    		ON[dvTP_Locked, x]
    	    }
    	}
    	ELSE
    	{
    	    OFF[dvTP_Locked, x]
    	}
        }
        
        IF(nCURRENT_HOUR > 12)
        {
    	nCURRENT_HOUR = nCURRENT_HOUR - 12
        }
        
        nINDEX = fnPROCESS_TIME(nCURRENT_HOUR, nCURRENT_MIN)
        
        IF(LENGTH_STRING(uMTG[nINDEX].cSUBJECT) > 0)
        {
    	SEND_COMMAND dvTP, "'^TXT-1,0,',uMTG[nINDEX].cSUBJECT"
    	RETURN TRUE 
        }
        ELSE
        {
    	SEND_COMMAND dvTP, "'^TXT-1,0,Vacant'"
    	RETURN FALSE 
        }
    	
    }
    
    DEFINE_FUNCTION INTEGER fnPROCESS_REQUEST (INTEGER nINDEX, INTEGER nNUM_MTGs)
    {
        STACK_VAR INTEGER i
        
        fnREAD_FILE_MTG('New_Mtg.csv')
        
        IF(LENGTH_STRING(uMTG[nINDEX].cSUBJECT) < 1)
        {
    	FOR(i=1; i<=nNUM_MTGs; i++)
    	{
    	    IF(LENGTH_STRING(uMTG[nINDEX].cSUBJECT) < 1)
    	    {
    		RETURN TRUE 
    	    }
    	    ELSE IF(LENGTH_STRING(uMTG[nINDEX].cSUBJECT) > 1)
    	    {
    		RETURN FALSE
    		BREAK;
    	    }
    	    
    	    nINDEX++
    	}
        }
    }
    
    DEFINE_FUNCTION fnRead_BadgeID (CHAR cFILENAME[])
    {
        LOCAL_VAR SLONG slFILE_VAL
        
        slFILE_VAL = FILE_OPEN(cFILENAME,FILE_READ_ONLY)
        IF(slFILE_VAL < 0)
        {
    	SELECT
    	{
    	    ACTIVE(slFILE_VAL == -2): SEND_STRING 0, "'Invalid Path'"
    	    ACTIVE(slFILE_VAL == -3): SEND_STRING 0, "'Invalid Value'"
    	    ACTIVE(slFILE_VAL == -5): SEND_STRING 0, "'I/O Error'"
    	    ACTIVE(slFILE_VAL == -14):SEND_STRING 0, "'Max Files Open'"
    	    ACTIVE(slFILE_VAL == -15):SEND_STRING 0, "'Invalid File Format'"
    	}
        }
        ELSE IF(slFILE_VAL > 0)
        {
    	LOCAL_VAR SLONG slVAL
    	LOCAL_VAR INTEGER i
    	LOCAL_VAR CHAR cBUFF[2048]
    	
    	FOR(i=1; i<=MAX_LENGTH_ARRAY(uUSERS); i++)
    	{
    	    slVAL = FILE_READ_LINE(slFILE_VAL,cBUFF,MAX_LENGTH_ARRAY(cBUFF))
    	    
    	    uUSERS[i].cID = REMOVE_STRING(cBUFF,',',1)
    	    SET_LENGTH_STRING(uUSERS[i].cID,LENGTH_STRING(uUSERS[i].cID)-1)
    	    uUSERS[i].cFIRST_NAME = REMOVE_STRING(cBUFF,',',1)
    	    SET_LENGTH_STRING(uUSERS[i].cFIRST_NAME,LENGTH_STRING(uUSERS[i].cFIRST_NAME)-1)
    	    uUSERS[i].cLAST_NAME = REMOVE_STRING(cBUFF,',',1)
    	    SET_LENGTH_STRING(uUSERS[i].cLAST_NAME,LENGTH_STRING(uUSERS[i].cLAST_NAME)-1)
    	    uUSERS[i].cEMAIL = cBUFF
    	}
    		
    	FILE_CLOSE(slFILE_VAL)
        }
    }
    
    DEFINE_FUNCTION fnREAD_FILE_MTG (CHAR cFILENAME[])
    {
        LOCAL_VAR SLONG slFILE_VAL
        
        slFILE_VAL = FILE_OPEN(cFILENAME,FILE_READ_ONLY)
        IF(slFILE_VAL < 0)
        {
    	SELECT
    	{
    	    ACTIVE(slFILE_VAL == -2): SEND_STRING 0, "'Invalid Path'"
    	    ACTIVE(slFILE_VAL == -3): SEND_STRING 0, "'Invalid Value'"
    	    ACTIVE(slFILE_VAL == -5): SEND_STRING 0, "'I/O Error'"
    	    ACTIVE(slFILE_VAL == -14):SEND_STRING 0, "'Max Files Open'"
    	    ACTIVE(slFILE_VAL == -15):SEND_STRING 0, "'Invalid File Format'"
    	}
        }
        ELSE IF(slFILE_VAL > 0)
        {
    	LOCAL_VAR SLONG slVAL
    	LOCAL_VAR INTEGER i
    	STACK_VAR INTEGER x 
    	LOCAL_VAR CHAR cBUFF[2048]
    	
    	FOR(i=1; i<=MAX_LENGTH_ARRAY(uMTG); i++)
    	{
    	    slVAL = FILE_READ_LINE(slFILE_VAL,cBUFF,MAX_LENGTH_ARRAY(cBUFF))
    	    
    	    uMTG[i].cHOST_NAME = REMOVE_STRING(cBUFF,',',1)
    	    SET_LENGTH_STRING(uMTG[i].cHOST_NAME,LENGTH_STRING(uMTG[i].cHOST_NAME)-1)
    	    uMTG[i].cSTART_DATE = REMOVE_STRING(cBUFF,',',1)
    	    SET_LENGTH_STRING(uMTG[i].cSTART_DATE,LENGTH_STRING(uMTG[i].cSTART_DATE)-1)
    	    uMTG[i].cSTART_HOUR = REMOVE_STRING(cBUFF,',',1)
    	    SET_LENGTH_STRING(uMTG[i].cSTART_HOUR,LENGTH_STRING(uMTG[i].cSTART_HOUR)-1)
    	    uMTG[i].cSTART_MINUTE = REMOVE_STRING(cBUFF,',',1)
    	    SET_LENGTH_STRING(uMTG[i].cSTART_MINUTE,LENGTH_STRING(uMTG[i].cSTART_MINUTE)-1)
    	    uMTG[i].cEND_HOUR = REMOVE_STRING(cBUFF,',',1)
    	    SET_LENGTH_STRING(uMTG[i].cEND_HOUR,LENGTH_STRING(uMTG[i].cEND_HOUR)-1)
    	    uMTG[i].cEND_MINUTE = REMOVE_STRING(cBUFF,',',1)
    	    SET_LENGTH_STRING(uMTG[i].cEND_MINUTE,LENGTH_STRING(uMTG[i].cEND_MINUTE)-1)
    	    uMTG[i].cSUBJECT = cBUFF
    	}
    		
    	FILE_CLOSE(slFILE_VAL)
        }
    }
    
    DEFINE_FUNCTION fnWRITE_FILE_MTG(CHAR cFILENAME[])
    {
        LOCAL_VAR CHAR cBUFF[2048]
        LOCAL_VAR SLONG slFILE_VAR
        LOCAL_VAR INTEGER i
        LOCAL_VAR SLONG slRESULT
        
        slFILE_VAR = FILE_OPEN(cFILENAME,FILE_RW_NEW)
        
        IF(slFILE_VAR > 0)
        {
    	FOR(i=1; i<=MAX_LENGTH_ARRAY(uMTG); i++)
    	{
    	    cBUFF = "uMTG[i].cHOST_NAME,',',uMTG[i].cSTART_DATE,',',uMTG[i].cSTART_HOUR,',',uMTG[i].cSTART_MINUTE,',',uMTG[i].cEND_HOUR,',',uMTG[i].cEND_MINUTE,',',uMTG[i].cSUBJECT"
    	    slRESULT = FILE_WRITE_LINE(slFILE_VAR,cBUFF,LENGTH_STRING(cBUFF))
    	}
    	
    	FILE_CLOSE(slFILE_VAR)
    	
    	SEND_STRING 0,"'GOOD FILE CLOSED ',ITOA(FILE_CLOSE(slFILE_VAR))"
        }
        ELSE
        {
    	SEND_STRING 0,"'BAD FILE OPEN ',ITOA(FILE_CLOSE(slFILE_VAR))"
        }
    }
    
    
    (***********************************************************)
    (*                STARTUP CODE GOES BELOW                  *)
    (***********************************************************)
    DEFINE_START
    fnREAD_FILE_MTG('New_Mtg.csv')
    TIMELINE_CREATE(TL_FEEDBACK,  nTIMER,  1, TIMELINE_ABSOLUTE, TIMELINE_REPEAT) //Half Second
    TIMELINE_CREATE(TL_FEEDBACK2, nTIMER2, 1, TIMELINE_ABSOLUTE, TIMELINE_REPEAT) // 5 Seconds
    TIMELINE_CREATE(TL_FEEDBACK3, nTIMER3, 1, TIMELINE_ABSOLUTE, TIMELINE_REPEAT) //60 Seconds
    (***********************************************************)
    (*                THE EVENTS GO BELOW                      *)
    (***********************************************************)
    DEFINE_EVENT
    
    DATA_EVENT[dvMaster] //Master Data Event 
    {
        ONLINE:
        {
    	SEND_COMMAND dvTP, "'ADBEEP'" //When online, BEEP!
        }
        STRING:
        {
    	IF(FIND_STRING(DATA.TEXT, "'GOOD FILE CLOSED'", 1))
    	{
    	    PULSE[nCLOSED]
    	}
        }
    }
    
    DATA_EVENT[dvTP]
    {    
        STRING:
        {
    	STACK_VAR INTEGER x 
    	
    	SEND_STRING 0, "'FROM TP: ', DATA.TEXT"
    	
    	SELECT
    	{
    	    
    	    
    	    ACTIVE(FIND_STRING(DATA.TEXT, 'Button 16-', 1)):
    	    {
    		REMOVE_STRING(DATA.TEXT, 'Button 16-', 1)
    		cBADGE = DATA.TEXT 
    
    		IF(LENGTH_STRING(cBADGE == 11))
    		{
    		    fnRead_BadgeID('Badge_IDs.csv')
    		    
    		    FOR(x=1; x<=MAX_LENGTH_ARRAY(uUSERS); x++)
    		    {
    			IF(cBADGE == uUSERS[x].cID)
    			{
    			    SEND_COMMAND dvTP, "'@PPN-New Mtg'"
    			    SEND_COMMAND dvTP, "'@PPK-Authorization'"
    			    SEND_COMMAND dvTP, "'@PPK-Invalid Entry'"
    			    SEND_COMMAND dvTP_Mtg, "'^TXT-1,0,',uUSERS[x].cFIRST_NAME,',',uUSERS[x].cLAST_NAME"
    			    ON[nVALID_ENTRY]
    			    
    			    cHOST_NAME = "uUSERS[x].cFIRST_NAME,' ',uUSERS[x].cLAST_NAME"
    			    SEND_COMMAND dvTP_Mtg, "'^TXT-2,0,',DATE"
    			    
    			    BREAK;
    			}
    			ELSE
    			{
    			    SEND_COMMAND dvTP, "'@PPN-Invalid Entry'"
    			    SEND_COMMAND dvTP, "'@PPK-Authorization'"
    			    OFF[nVALID_ENTRY]
    			    WAIT 40
    			    {
    				SEND_COMMAND dvTP, "'@PPK-Invalid Entry'"
    				SEND_COMMAND dvTP, "'PAGE-Locked'"
    			    }
    			}
    		    }
    		}
    	    }
    	    ACTIVE(FIND_STRING(DATA.TEXT, '@PPF-Authorization;Locked', 1)):
    	    {
    		SET_LENGTH_STRING(cHOST_NAME, 0)
    		SET_LENGTH_STRING(cSTART_DATE, 0)
    		SET_LENGTH_STRING(cSTART_HOUR, 0)
    		SET_LENGTH_STRING(cSTART_MINUTE, 0)
    		SET_LENGTH_STRING(cEND_HOUR, 0)
    		SET_LENGTH_STRING(cEND_MINUTE, 0)
    		SET_LENGTH_STRING(cSUBJECT, 0)
    		
    		SEND_COMMAND dvTP_Mtg, "'^TXT-3,0,'"
    		SEND_COMMAND dvTP_Mtg, "'^TXT-4,0,'"
    		SEND_COMMAND dvTP_Mtg, "'^TXT-5,0,'"
    		SEND_COMMAND dvTP_Mtg, "'^TXT-6,0,'"
    		SEND_COMMAND dvTP_Mtg, "'^TXT-11,0,'"
    		SEND_COMMAND dvTP_Mtg, "'^TXT-12,0,'"
    		SEND_COMMAND dvTP_Mtg, "'^TXT-13,0,'"
    	    }
    	    ACTIVE(FIND_STRING(DATA.TEXT,'KEYB-',1)):
    	    {
    		REMOVE_STRING(DATA.TEXT,'KEYB-',1)
    		cDATA = DATA.TEXT
    	    }
    	    ACTIVE(FIND_STRING(DATA.TEXT,'KEYP-',1)):
    	    {
    		REMOVE_STRING(DATA.TEXT,'KEYP-',1)
    		
    		IF(nTIME == 1)
    		{
    		    nHOUR = ATOI(DATA.TEXT) 
    		}
    		ELSE IF(nTIME == 2)
    		{
    		    nMINUTE = ATOI(DATA.TEXT)
    		}
    		ELSE IF(nTIME == 3)
    		{
    		    nHOUR2 = ATOI(DATA.TEXT)
    		}
    		ELSE IF(nTIME == 4)
    		{
    		    nMINUTE2 = ATOI(DATA.TEXT)
    		}
    	    }
    	}
    	PULSE[nDONE]
        }
    }
    
    
    BUTTON_EVENT[dvTP_Mtg, 3]
    {
        PUSH:
        {
    	TO[BUTTON.INPUT]
    	nTIME = 1;
        }
        RELEASE:
        {
    	WAIT_UNTIL(nDONE)
    	{
    	    cSTART_HOUR = ITOA(nHOUR)
    	    
    	    SEND_COMMAND dvTP_Mtg, "'^TXT-3,0,',cSTART_HOUR" 
    	    
    	    IF(nHOUR >= 8 && nHOUR < 12)
    	    {
    		SEND_COMMAND dvTP_Mtg, "'^TXT-5,0,AM'"
    	    }
    	    ELSE
    	    {
    		SEND_COMMAND dvTP_Mtg, "'^TXT-5,0,PM'"
    	    }
    	}
        }
    }
    
    BUTTON_EVENT[dvTP_Mtg, 4]
    {
        PUSH:
        {
    	nTIME = 2;
        }
        RELEASE:
        {
    	WAIT_UNTIL(nDONE)
    	{
    	    cSTART_MINUTE = ITOA(nMINUTE)
    	    
    	    IF(nMINUTE == 0)
    	    {	
    		cSTART_MINUTE = "'00'"
    	    }
    	    
    	    SEND_COMMAND dvTP_Mtg, "'^TXT-4,0,',cSTART_MINUTE" 
    	}
        }
    }
    
    BUTTON_EVENT[dvTP_Mtg, 11]
    {
        PUSH:
        {
    	nTIME = 3;
        }
        RELEASE:
        {
    	WAIT_UNTIL(nDONE)
    	{
    	    cEND_HOUR = ITOA(nHOUR2)
    	    
    	    SEND_COMMAND dvTP_Mtg, "'^TXT-11,0,',cEND_HOUR" 
    	    
    	    IF(nHOUR2 >= 8 && nHOUR2 < 12)
    	    {
    		SEND_COMMAND dvTP_Mtg, "'^TXT-13,0,AM'"
    	    }
    	    ELSE
    	    {
    		SEND_COMMAND dvTP_Mtg, "'^TXT-13,0,PM'"
    	    }
    	}
        }
    }
    
    BUTTON_EVENT[dvTP_Mtg, 12]
    {
        PUSH:
        {
    	nTIME = 4;
        }
        RELEASE:
        {
    	WAIT_UNTIL(nDONE)
    	{
    	    cEND_MINUTE = ITOA(nMINUTE2)
    	    
    	    IF(nMINUTE2 == 0)
    	    {	
    		cEND_MINUTE = "'00'"
    	    }
    	    SEND_COMMAND dvTP_Mtg, "'^TXT-12,0,',cEND_MINUTE" 
    	}
        }
    }
    
    BUTTON_EVENT[dvTP_Mtg, 6]
    {
        PUSH:
        {
        }
        RELEASE:
        {
    	WAIT_UNTIL(nDONE)
    	{
    	    cSUBJECT = cDATA 
    	    SEND_COMMAND dvTP_Mtg, "'^TXT-6,0,',cSUBJECT"
    	}
        }
    }
    
    BUTTON_EVENT[dvTP_Mtg, 10] //reserve a new meeting
    {
        PUSH:
        {
    	LOCAL_VAR INTEGER x
    	LOCAL_VAR INTEGER INDEX 
    	LOCAL_VAR INTEGER nDURATION 
    	LOCAL_VAR INTEGER nNUM_MTGS 
    	LOCAL_VAR INTEGER ACCESS 
    	
    	INDEX = fnPROCESS_TIME(nHOUR, nMINUTE)
    	nDURATION = fnCONVERT_REQUEST(nHOUR, nMINUTE, nHOUR2, nMINUTE2)
    	nNUM_MTGS = (nDURATION/15)
    	ACCESS = fnPROCESS_REQUEST(INDEX, nNUM_MTGS)
    	
    	IF(LENGTH_STRING(cSUBJECT) > 0)
    	{
    	    OFF[dvTP_Mtg, 16]
    	    
    	    IF(ACCESS == 1)
    	    {	
    		FOR(x=1; x<=nNUM_MTGS; x++)
    		{
    		    uMTG[INDEX].cHOST_NAME    = cHOST_NAME
    		    uMTG[INDEX].cSTART_DATE   = DATE
    		    uMTG[INDEX].cSTART_HOUR   = cSTART_HOUR
    		    uMTG[INDEX].cSTART_MINUTE = cSTART_MINUTE
    		    uMTG[INDEX].cEND_HOUR     = cEND_HOUR
    		    uMTG[INDEX].cEND_MINUTE   = cEND_MINUTE
    		    uMTG[INDEX].cSUBJECT      = cSUBJECT
    		    
    		    fnWRITE_FILE_MTG('New_Mtg.csv')
    		    
    		    INDEX++
    		    
    		    IF(x == nNUM_MTGs)
    		    {
    			BREAK;
    		    }
    		}
    		SEND_COMMAND dvTP, "'@PPX-New Mtg'"
    	    }
    	    ELSE IF(ACCESS == 0)
    	    {
    		SEND_COMMAND dvTP, "'@PPN-Error'"
    	    }
    	}
    	ELSE
    	{
    	    ON[dvTP_Mtg, 16]
    	}
        }
    }
    
    BUTTON_EVENT[dvTP, 4] //Cancel the current meeting
    {
        PUSH:
        {
    	LOCAL_VAR INTEGER i
    	LOCAL_VAR INTEGER nDURATION2
    	LOCAL_VAR INTEGER nNUM_MTGs2
    	LOCAL_VAR INTEGER nLINE
    	
    	nLINE = fnPROCESS_TIME(nCURRENT_HOUR, nCURRENT_MIN)
    	nDURATION2 = fnCONVERT_REQUEST(ATOI(uMTG[nLINE].cSTART_HOUR), ATOI(uMTG[nLINE].cSTART_MINUTE), ATOI(uMTG[nLINE].cEND_HOUR), ATOI(uMTG[nLINE].cEND_MINUTE))
    	nNUM_MTGs2 = (nDURATION2/15)
    
    	FOR(i=1; i<=nNUM_MTGS2; i++)
    	{
    	    SET_LENGTH_STRING(uMTG[nLINE].cHOST_NAME, 0)
    	    SET_LENGTH_STRING(uMTG[nLINE].cSTART_DATE, 0)
    	    SET_LENGTH_STRING(uMTG[nLINE].cSTART_HOUR, 0)
    	    SET_LENGTH_STRING(uMTG[nLINE].cSTART_MINUTE, 0)
    	    SET_LENGTH_STRING(uMTG[nLINE].cEND_HOUR, 0)
    	    SET_LENGTH_STRING(uMTG[nLINE].cEND_MINUTE, 0)
    	    SET_LENGTH_STRING(uMTG[nLINE].cSUBJECT, 0)
    	    
    	    fnWRITE_FILE_MTG('New_Mtg.csv')
    	    
    	    nLINE++
    	    
    	    IF(i == nNUM_MTGs2)
    	    {
    		BREAK;
    	    }
    	}
        }
    }
    
    BUTTON_EVENT[dcMTGs]
    {
        PUSH:
        {
    	STACK_VAR INTEGER BIC
    	BIC = BUTTON.INPUT.CHANNEL 
    	
    	ON[dvTP, 6]
    	ON[dvTP, 7]
    	
    	IF(LENGTH_STRING(uMTG[BIC].cSUBJECT) > 0)
    	{
    	    SEND_COMMAND dvTP, "'^TXT-2,0,',uMTG[BIC].cSUBJECT,' ',uMTG[BIC].cSTART_HOUR,':',uMTG[BIC].cSTART_MINUTE,' - ',uMTG[BIC].cEND_HOUR,':',uMTG[BIC].cEND_MINUTE"
    	}
    	ELSE
    	{
    	    SEND_COMMAND dvTP, "'^TXT-2,0,Meeting room available'"
    	}
    	
    	WAIT 50
    	{
    	    OFF[dvTP, 6]
    	    OFF[dvTP, 7]
    	}
        }
    } 
    
    BUTTON_EVENT[dvTP, 3]
    {
        PUSH:
        {
    	STACK_VAR INTEGER y 
    	
    	y = fnPROCESS_TIME(nCURRENT_HOUR, nCURRENT_MIN)
    	
    	IF(LENGTH_STRING(uMTG[y].cSUBJECT) > 0)
    	{
    	    SEND_COMMAND dvTP, "'^TXT-3,0,',uMTG[y].cSUBJECT"
    	}
    	ELSE
    	{
    	    SEND_COMMAND dvTP, "'^TXT-3,0,There is no meeting to cancel...'"
    	}
        }
    }
    
    
    TIMELINE_EVENT[TL_FEEDBACK]
    {
        nCURRENT_HOUR = TIME_TO_HOUR(TIME)
        nCURRENT_MIN =  TIME_TO_MINUTE(TIME)
    }
    
    TIMELINE_EVENT[TL_FEEDBACK2]
    {
        nCURRENT_MEETING = fnFILL_CALENDAR(nCURRENT_HOUR, nCURRENT_MIN)
    }
    
    TIMELINE_EVENT[TL_FEEDBACK3]
    {
       fnREAD_FILE_MTG('New_Mtg.csv')
    }
    
    (***********************************************************)
    (*            THE ACTUAL PROGRAM GOES BELOW                *)
    (***********************************************************)
    DEFINE_PROGRAM
    
    [dvTP, 1] = (nCURRENT_MEETING == 1)
    
    
    (***********************************************************)
    (*                     END OF PROGRAM                      *)
    (*        DO NOT PUT ANY CODE BELOW THIS COMMENT           *)
    (***********************************************************)
    
    

    When you say "extends cSubject to 16" do you mean it truncates the 50 characters to 16?

    Can you post the contents of the file?
  • Options
    cmason wrote: »
    When you say "extends cSubject to 16" do you mean it truncates the 50 characters to 16?

    Can you post the contents of the file?

    it truncates to 16 yes, the file doesnt show any characters, although they may be blank spaces. Thoughts?
  • Options
    cmasoncmason Posts: 123
    The following line uses the "LENGTH_STRING" command:

    slRESULT = FILE_WRITE_LINE(slFILE_VAR,cBUFF,LENGTH_STRING(cBUFF))

    I'd change that to "LENGTH_ARRAY" and see if you get different results.
    I remember getting inconsistent results with the "LENGTH_STRING" command.
    Since it is an Axcess command, best to avoid it anyhow.

    Also, you may want to SEND_STRING 0 the "slRESULT" var to see how many characters are actually getting written to the line.
  • Options
    JasonSJasonS Posts: 229
    It would be a lot easier to use "VARIABLE_TO_STRING" and "STRING_TO_VARIABLE" to convert the whole structure array in one command. Just make sure to use "SET_LENGTH_ARRAY" on the structure array variable before converting it to a string.
  • Options
    cmasoncmason Posts: 123
    JasonS wrote: »
    It would be a lot easier to use "VARIABLE_TO_STRING" and "STRING_TO_VARIABLE" to convert the whole structure array in one command. Just make sure to use "SET_LENGTH_ARRAY" on the structure array variable before converting it to a string.

    Whoa... I've never seen that command before... or the VARIABLE_TO_XML command.

    Thanks for teaching me something new. What does it convert the structure to? A CSV line?
  • Options
    cmasoncmason Posts: 123
    I just re-read the Help on it. So it converts it to a binary string?
    Interesting...
  • Options
    JasonSJasonS Posts: 229
    Be careful with the to XML string it does not work with nested structures. It will generate invalid XML.
  • Options
    cmasoncmason Posts: 123
    JasonS wrote: »
    Be careful with the to XML string it does not work with nested structures. It will generate invalid XML.

    Really? Doesn't that defeat the purpose for using XML?
  • Options
    ericmedleyericmedley Posts: 4,177
    cmason wrote: »
    Really? Doesn't that defeat the purpose for using XML?

    Not really, its more to do when you nest a structure, you know, put one sturcture within another.
  • Options
    JasonSJasonS Posts: 229
    "Variable_To_String" has worked great for a single level of structure nesting for me, haven't tried with more. It also creates a smaller file than XML. The only downside is that it is not very human readable. Again make sure that you SET_LENGTH_ARRAY on any array variables (all dimensions) that you are converting. Also make sure that the variable you are reading the converted string back into is the the same size as the original. I use MAX_LENGTH_ARRAY to set the array lengths before converting.
Sign In or Register to comment.