// Funcao que faz a analise dos reports das TAGs. private static void AnalisaDadosTAG(ImpinjReader sender, TagReport report) { foreach (Tag tag in report) { // Condicional com um filtro para validar leitura. Valor de RSSI tem que estar acima // do valor do filtro e TAGsReportsON tem que ser verdadeiro. if (tag.PeakRssiInDbm > GlobalData.FiltroPassaBaixaRSSI && GlobalData.TAGsReportsON == 1) { // Checa se a antena 1 que está lendo if (tag.AntennaPortNumber == 1) { // Se o RSSI lido do report for maior que o pico atual // de RSSI, atualiza o valor máximo de RSSI e seu tempo. if (tag.PeakRssiInDbm > GlobalData.PicoRSSIAnt1 && GlobalData.LockPicoRSSIAnt1 == 0) { GlobalData.PicoRSSIAnt1 = tag.PeakRssiInDbm; GlobalData.TempoPicoRSSIAnt1 = DateTime.Now.ToString("HH-mm-ss-fff"); GlobalData.DateTimePicoRSSIAnt1 = DateTime.Now; // Verifica se o pico de RSSI da antena 1 é maior ou igual que o indicador RSSI de passagem. // Se for, atualiza a flag que indica que houve passagem pela primeira antena e // da "lock" nesse valor, para que nao pegue outras medidas desnecessariamente. if (GlobalData.PicoRSSIAnt1 >= GlobalData.IndicadorRSSIPassagem) { GlobalData.FlagPassagemAnt1 = 1; GlobalData.LockPicoRSSIAnt1 = 1; GlobalData.ContadorPassagemAnt1 += 1; } } // Atualiza o valor minimo da frequência doppler e seu tempo. if (tag.RfDopplerFrequency < GlobalData.PicoNegFreqDopAnt1) { GlobalData.PicoNegFreqDopAnt1 = tag.RfDopplerFrequency; GlobalData.TempoPicoNegFreqDopAnt1 = DateTime.Now.ToString("HH-mm-ss-fff"); GlobalData.DateTimePicoNegFreqDopAnt1 = DateTime.Now; } } // Checa se a antena 2 que está lendo. if (tag.AntennaPortNumber == 2) { // Se o RSSI lido do report for maior que o pico atual // de RSSI, atualiza o valor máximo de RSSI e seu tempo. if (tag.PeakRssiInDbm > GlobalData.PicoRSSIAnt2 && GlobalData.LockPicoRSSIAnt2 == 0) { GlobalData.PicoRSSIAnt2 = tag.PeakRssiInDbm; GlobalData.TempoPicoRSSIAnt2 = DateTime.Now.ToString("HH-mm-ss-fff"); GlobalData.DateTimePicoRSSIAnt2 = DateTime.Now; // Verifica se o pico de RSSI da antena 1 é maior ou igual que o indicador RSSI de passagem. // Se for, atualiza a flag que indica que houve passagem pela primeira antena e // da "lock" nesse valor, para que nao pegue outras medidas desnecessariamente. if (GlobalData.PicoRSSIAnt2 >= GlobalData.IndicadorRSSIPassagem) { GlobalData.FlagPassagemAnt2 = 1; GlobalData.LockPicoRSSIAnt2 = 1; GlobalData.ContadorPassagemAnt2 += 1; } } // Atualiza o valor minimo da frequência doppler e seu tempo. if (tag.RfDopplerFrequency < GlobalData.PicoNegFreqDopAnt2) { GlobalData.PicoNegFreqDopAnt2 = tag.RfDopplerFrequency; GlobalData.TempoPicoNegFreqDopAnt2 = DateTime.Now.ToString("HH-mm-ss-fff"); GlobalData.DateTimePicoNegFreqDopAnt2 = DateTime.Now; } } // Checa se a flag de passagem das duas antenas foram setadas. // Se sim, significa que houve a passagem da TAG pelas duas antenas. // Ou seja, significa que alguem entrou ou saiu do ambiente. if (GlobalData.FlagPassagemAnt1 == 1 && GlobalData.FlagPassagemAnt2 == 1) { // Checa os tempos de cada pico para saber se a TAG entrou ou saiu do ambiente. // Se a comparacao for negativa, significa que passaram primeiro pela antena 1 e depois // pela antena 2, ou seja, a pessoa entrou no ambiente. if (DateTime.Compare(GlobalData.DateTimePicoRSSIAnt1, GlobalData.DateTimePicoRSSIAnt2) < 0) { Console.WriteLine("\n\nLeitora endereço: {0}", sender.Address); bool passagem = true; // Verifica o EPC das tags que estao registradas para verificar quem entrou no ambiente, // e ai passa o nome da pessoa para a funcao MonitoramentoSALA. foreach (var tags in GlobalData.ListaTAGs) { if (tags.EPC == tag.Epc.ToString()) { TransicaoTags.transicao_sala(sender.Address, tag.Epc.ToString(), passagem, tags.Nome, tags); } } // Seta a flag que indica que esta ocorrendo uma transicao entre ambientes. GlobalData.FlagTrocaAmbiente = 1; // Inicializa a Thread que faz o descarte de reports das tags por 2 segundos. // Isso eh feito para que os dados dos reports durante a transicao da pessoa // nao atrapalhem a analise. GlobalData.TAGsReportsON = 0; Thread DescartaReportThread = new Thread(MonitoramentoTAG.DescartaReport); DescartaReportThread.Start(); } // Checa os tempos de cada pico para saber se a TAG entrou ou saiu do ambiente. // Se a comparacao for positiva, significa que passaram primeiro pela antena 2 e depois // pela antena 1, ou seja, a pessoa saiu do ambiente. if (DateTime.Compare(GlobalData.DateTimePicoRSSIAnt1, GlobalData.DateTimePicoRSSIAnt2) > 0) { Console.WriteLine("\n\nLeitora endereço: {0}", sender.Address); bool passagem = false; // Verifica o EPC das tags que estao registradas para verificar quem saiu do ambiente, // e ai passa o nome da pessoa para a funcao MonitoramentoSALA. foreach (var tags in GlobalData.ListaTAGs) { if (tags.EPC == tag.Epc.ToString()) { TransicaoTags.transicao_sala(sender.Address, tag.Epc.ToString(), passagem, tags.Nome, tags); } } // Seta a flag que indica que esta ocorrendo uma transicao entre ambientes. GlobalData.FlagTrocaAmbiente = 1; //Inicializa a Thread que faz o descarte de reports das tags por 2 segundos GlobalData.TAGsReportsON = 0; Thread DescartaReportThread = new Thread(MonitoramentoTAG.DescartaReport); DescartaReportThread.Start(); } } // Armazena o DateTime do tempo da ultima vez que foi feito uma leitura valida. GlobalData.LastSeen = DateTime.Now; //Escreve nos arquivos os dados. GlobalData.filehandler.WriteToFile(tag.Epc.ToString(), sender.Name, tag.AntennaPortNumber, tag.RfDopplerFrequency.ToString("0.00"), tag.PeakRssiInDbm.ToString(), GlobalData.ContadorPassagemAnt1.ToString(), GlobalData.ContadorPassagemAnt2.ToString()); } } }
// Faz a transicao dos ambientes de uma tag, dependendo da variavel "passagem" e da leitora que leu public static void transicao_sala(string leitora, string tag_epc, bool passagem, string nome, Tags_TG tag) { switch (leitora) { case "SpeedwayR-10-9F-C8.local": if (passagem == true) { GlobalData.tag_sala[tag_epc] = ConstantesAmbiente.SalaPrincipal; TransicaoTags.transicaoRemove(tag_epc, tag.Ambiente); TransicaoTags.transicaoADD(tag_epc, 1, tag); Console.WriteLine("{0} realizou uma transicao para a Sala Principal", nome); TransicaoTags.DisplayAmbientes(); } else { GlobalData.tag_sala[tag_epc] = ConstantesAmbiente.AmbienteExterno; TransicaoTags.transicaoRemove(tag_epc, tag.Ambiente); TransicaoTags.transicaoADD(tag_epc, 0, tag); Console.WriteLine("{0} realizou uma transicao para o Ambiente Externo", nome); TransicaoTags.DisplayAmbientes(); } break; case "SpeedwayR-10-9F-3F.local": if (passagem == true) { GlobalData.tag_sala[tag_epc] = ConstantesAmbiente.SalaDeReunioes; TransicaoTags.transicaoRemove(tag_epc, tag.Ambiente); TransicaoTags.transicaoADD(tag_epc, 2, tag); Console.WriteLine("{0} realizou uma transicao para a Sala De Reuniões", nome); TransicaoTags.DisplayAmbientes(); } else { GlobalData.tag_sala[tag_epc] = ConstantesAmbiente.SalaPrincipal; TransicaoTags.transicaoRemove(tag_epc, tag.Ambiente); TransicaoTags.transicaoADD(tag_epc, 1, tag); Console.WriteLine("{0} realizou uma transicao para a Sala Principal", nome); TransicaoTags.DisplayAmbientes(); } break; case "SpeedwayR-10-9F-BB.local": if (passagem == true) { GlobalData.tag_sala[tag_epc] = ConstantesAmbiente.CorredorDeBaias; TransicaoTags.transicaoRemove(tag_epc, tag.Ambiente); TransicaoTags.transicaoADD(tag_epc, 3, tag); Console.WriteLine("{0} realizou uma transicao para o Corredor De Baias", nome); TransicaoTags.DisplayAmbientes(); } else { GlobalData.tag_sala[tag_epc] = ConstantesAmbiente.SalaPrincipal; TransicaoTags.transicaoRemove(tag_epc, tag.Ambiente); TransicaoTags.transicaoADD(tag_epc, 1, tag); Console.WriteLine("{0} realizou uma transicao para a Sala Principal", nome); TransicaoTags.DisplayAmbientes(); } break; default: Console.Write("Caso não identificado"); break; } }
// Funcao que faz a analise dos reports das TAGs dado uma determinada leitora. private static void AnalisaDadosTAG(ImpinjReader sender, TagReport report) { switch (sender.Address) { // Caso o report da TAG seja relacionado a Leitora #1, entra aqui. case "SpeedwayR-10-9F-3F.local": foreach (Tag tag in report) { // Variavel do tipo Tags_TG que vai armazenar a tag que foi reportada agora. Tags_TG TagAtual; // Variavel que indica se aceita o report da TAG ou nao. int TAGsReportsON = 0; // Verifica o EPC das tags que estao registradas para verificar se o report dessa TAG // deve ser aceito ou nao dependendo da variavel ReportON da TAG. Caso seja true, // a variavel TAGReportON eh setada e o report eh aceito. foreach (var TagRegistrada in GlobalData.ListaTAGs) { if (TagRegistrada.EPC == tag.Epc.ToString()) { TagAtual = TagRegistrada; if (TagAtual.ReportON == true) { TAGsReportsON = 1; } } } // Condicional com um filtro para validar leitura. Valor de RSSI tem que estar acima // do valor do filtro e TAGsReportsON tem que ser verdadeiro. if (tag.PeakRssiInDbm > GlobalData.FiltroPassaBaixaRSSI && TAGsReportsON == 1) { // Checa se a antena 1 que está lendo if (tag.AntennaPortNumber == 1) { // Se o RSSI lido do report for maior que o pico atual // de RSSI, atualiza o valor máximo de RSSI e seu tempo. if (tag.PeakRssiInDbm > LeitoraUm.PicoRSSIAnt1 && LeitoraUm.LockPicoRSSIAnt1 == 0) { LeitoraUm.PicoRSSIAnt1 = tag.PeakRssiInDbm; LeitoraUm.TempoPicoRSSIAnt1 = DateTime.Now.ToString("HH-mm-ss-fff"); LeitoraUm.DateTimePicoRSSIAnt1 = DateTime.Now; // Verifica se o pico de RSSI da antena 1 é maior ou igual que o indicador RSSI de passagem. // Se for, atualiza a flag que indica que houve passagem pela primeira antena e // da "lock" nesse valor, para que nao pegue outras medidas desnecessariamente. if (LeitoraUm.PicoRSSIAnt1 >= GlobalData.IndicadorRSSIPassagem) { LeitoraUm.FlagPassagemAnt1 = 1; LeitoraUm.LockPicoRSSIAnt1 = 1; LeitoraUm.ContadorPassagemAnt1 += 1; } } // Atualiza o valor minimo da frequência doppler e seu tempo. if (tag.RfDopplerFrequency < LeitoraUm.PicoNegFreqDopAnt1) { LeitoraUm.PicoNegFreqDopAnt1 = tag.RfDopplerFrequency; LeitoraUm.TempoPicoNegFreqDopAnt1 = DateTime.Now.ToString("HH-mm-ss-fff"); LeitoraUm.DateTimePicoNegFreqDopAnt1 = DateTime.Now; } } // Checa se a antena 2 que está lendo. if (tag.AntennaPortNumber == 2) { // Se o RSSI lido do report for maior que o pico atual // de RSSI, atualiza o valor máximo de RSSI e seu tempo. if (tag.PeakRssiInDbm > LeitoraUm.PicoRSSIAnt2 && LeitoraUm.LockPicoRSSIAnt2 == 0) { LeitoraUm.PicoRSSIAnt2 = tag.PeakRssiInDbm; LeitoraUm.TempoPicoRSSIAnt2 = DateTime.Now.ToString("HH-mm-ss-fff"); LeitoraUm.DateTimePicoRSSIAnt2 = DateTime.Now; // Verifica se o pico de RSSI da antena 1 é maior ou igual que o indicador RSSI de passagem. // Se for, atualiza a flag que indica que houve passagem pela primeira antena e // da "lock" nesse valor, para que nao pegue outras medidas desnecessariamente. if (LeitoraUm.PicoRSSIAnt2 >= GlobalData.IndicadorRSSIPassagem) { LeitoraUm.FlagPassagemAnt2 = 1; LeitoraUm.LockPicoRSSIAnt2 = 1; LeitoraUm.ContadorPassagemAnt2 += 1; } } // Atualiza o valor minimo da frequência doppler e seu tempo. if (tag.RfDopplerFrequency < LeitoraUm.PicoNegFreqDopAnt2) { LeitoraUm.PicoNegFreqDopAnt2 = tag.RfDopplerFrequency; LeitoraUm.TempoPicoNegFreqDopAnt2 = DateTime.Now.ToString("HH-mm-ss-fff"); LeitoraUm.DateTimePicoNegFreqDopAnt2 = DateTime.Now; } } // Checa se a flag de passagem das duas antenas foram setadas. // Se sim, significa que houve a passagem da TAG pelas duas antenas. // Ou seja, significa que alguem entrou ou saiu do ambiente. if (LeitoraUm.FlagPassagemAnt1 == 1 && LeitoraUm.FlagPassagemAnt2 == 1) { // Checa os tempos de cada pico para saber se a TAG entrou ou saiu do ambiente. // Se a comparacao for negativa, significa que passaram primeiro pela antena 1 e depois // pela antena 2, ou seja, a pessoa entrou no ambiente. if (DateTime.Compare(LeitoraUm.DateTimePicoRSSIAnt1, LeitoraUm.DateTimePicoRSSIAnt2) < 0) { Console.WriteLine("\n\nLeitora endereço: {0}", sender.Address); bool passagem = true; // Verifica o EPC das tags que estao registradas para verificar quem entrou no ambiente, // e ai passa o nome da pessoa para a funcao MonitoramentoSALA. foreach (var tags in GlobalData.ListaTAGs) { if (tags.EPC == tag.Epc.ToString()) { TransicaoTags.transicao_sala(sender.Address, tag.Epc.ToString(), passagem, tags.Nome, tags); } } // Seta a flag que indica que esta ocorrendo uma transicao entre ambientes. LeitoraUm.FlagTrocaAmbiente = 1; // Inicializa a Thread que faz o descarte de reports das tags por 2 segundos. // Isso eh feito para que os dados dos reports durante a transicao da pessoa // nao atrapalhem a analise. foreach (var TagRegistrada in GlobalData.ListaTAGs) { if (TagRegistrada.EPC == tag.Epc.ToString()) { TagAtual = TagRegistrada; Thread DescartaReportThread = new Thread(() => MonitoramentoTAG.DescartaReport(TagAtual)); DescartaReportThread.Start(); } } } // Checa os tempos de cada pico para saber se a TAG entrou ou saiu do ambiente. // Se a comparacao for positiva, significa que passaram primeiro pela antena 2 e depois // pela antena 1, ou seja, a pessoa saiu do ambiente. if (DateTime.Compare(LeitoraUm.DateTimePicoRSSIAnt1, LeitoraUm.DateTimePicoRSSIAnt2) > 0) { Console.WriteLine("\n\nLeitora endereço: {0}", sender.Address); bool passagem = false; // Verifica o EPC das tags que estao registradas para verificar quem saiu do ambiente, // e ai passa o nome da pessoa para a funcao MonitoramentoSALA. foreach (var tags in GlobalData.ListaTAGs) { if (tags.EPC == tag.Epc.ToString()) { TransicaoTags.transicao_sala(sender.Address, tag.Epc.ToString(), passagem, tags.Nome, tags); } } // Seta a flag que indica que esta ocorrendo uma transicao entre ambientes. LeitoraUm.FlagTrocaAmbiente = 1; //Inicializa a Thread que faz o descarte de reports das tags por 2 segundos //Thread DescartaReportThread = new Thread(MonitoramentoTAG.DescartaReport); //Thread DescartaReportThread = new Thread(() => MonitoramentoTAG.DescartaReport(TagAtual)); //DescartaReportThread.Start(); // Inicializa a Thread que faz o descarte de reports das tags por 2 segundos. // Isso eh feito para que os dados dos reports durante a transicao da pessoa // nao atrapalhem a analise. foreach (var TagRegistrada in GlobalData.ListaTAGs) { if (TagRegistrada.EPC == tag.Epc.ToString()) { TagAtual = TagRegistrada; Thread DescartaReportThread = new Thread(() => MonitoramentoTAG.DescartaReport(TagAtual)); DescartaReportThread.Start(); } } } } // Armazena o DateTime do tempo da ultima vez que foi feito uma leitura valida. GlobalData.LastSeen = DateTime.Now; //Escreve nos arquivos os dados. //GlobalData.filehandler.WriteToFile(tag.Epc.ToString(), sender.Name, tag.AntennaPortNumber, tag.RfDopplerFrequency.ToString("0.00"), tag.PeakRssiInDbm.ToString(), LeitoraUm.ContadorPassagemAnt1.ToString(), LeitoraUm.ContadorPassagemAnt2.ToString()); } } break; // Caso o report da TAG seja relacionado a Leitora #2, entra aqui. case "SpeedwayR-10-9F-C8.local": foreach (Tag tag in report) { // Variavel do tipo Tags_TG que vai armazenar a tag que foi reportada agora. Tags_TG TagAtual; // Variavel que indica se aceita o report da TAG ou nao. int TAGsReportsON = 0; // Verifica o EPC das tags que estao registradas para verificar se o report dessa TAG // deve ser aceito ou nao dependendo da variavel ReportON da TAG. Caso seja true, // a variavel TAGReportON eh setada e o report eh aceito. foreach (var TagRegistrada in GlobalData.ListaTAGs) { if (TagRegistrada.EPC == tag.Epc.ToString()) { TagAtual = TagRegistrada; if (TagAtual.ReportON == true) { TAGsReportsON = 1; } } } // Condicional com um filtro para validar leitura. Valor de RSSI tem que estar acima // do valor do filtro e TAGsReportsON tem que ser verdadeiro. if (tag.PeakRssiInDbm > GlobalData.FiltroPassaBaixaRSSI && TAGsReportsON == 1) { // Checa se a antena 1 que está lendo if (tag.AntennaPortNumber == 1) { // Se o RSSI lido do report for maior que o pico atual // de RSSI, atualiza o valor máximo de RSSI e seu tempo. if (tag.PeakRssiInDbm > LeitoraDois.PicoRSSIAnt1 && LeitoraDois.LockPicoRSSIAnt1 == 0) { LeitoraDois.PicoRSSIAnt1 = tag.PeakRssiInDbm; LeitoraDois.TempoPicoRSSIAnt1 = DateTime.Now.ToString("HH-mm-ss-fff"); LeitoraDois.DateTimePicoRSSIAnt1 = DateTime.Now; // Verifica se o pico de RSSI da antena 1 é maior ou igual que o indicador RSSI de passagem. // Se for, atualiza a flag que indica que houve passagem pela primeira antena e // da "lock" nesse valor, para que nao pegue outras medidas desnecessariamente. if (LeitoraDois.PicoRSSIAnt1 >= GlobalData.IndicadorRSSIPassagem) { LeitoraDois.FlagPassagemAnt1 = 1; LeitoraDois.LockPicoRSSIAnt1 = 1; LeitoraDois.ContadorPassagemAnt1 += 1; } } // Atualiza o valor minimo da frequência doppler e seu tempo. if (tag.RfDopplerFrequency < LeitoraDois.PicoNegFreqDopAnt1) { LeitoraDois.PicoNegFreqDopAnt1 = tag.RfDopplerFrequency; LeitoraDois.TempoPicoNegFreqDopAnt1 = DateTime.Now.ToString("HH-mm-ss-fff"); LeitoraDois.DateTimePicoNegFreqDopAnt1 = DateTime.Now; } } // Checa se a antena 2 que está lendo. if (tag.AntennaPortNumber == 2) { // Se o RSSI lido do report for maior que o pico atual // de RSSI, atualiza o valor máximo de RSSI e seu tempo. if (tag.PeakRssiInDbm > LeitoraDois.PicoRSSIAnt2 && LeitoraDois.LockPicoRSSIAnt2 == 0) { LeitoraDois.PicoRSSIAnt2 = tag.PeakRssiInDbm; LeitoraDois.TempoPicoRSSIAnt2 = DateTime.Now.ToString("HH-mm-ss-fff"); LeitoraDois.DateTimePicoRSSIAnt2 = DateTime.Now; // Verifica se o pico de RSSI da antena 1 é maior ou igual que o indicador RSSI de passagem. // Se for, atualiza a flag que indica que houve passagem pela primeira antena e // da "lock" nesse valor, para que nao pegue outras medidas desnecessariamente. if (LeitoraDois.PicoRSSIAnt2 >= GlobalData.IndicadorRSSIPassagem) { LeitoraDois.FlagPassagemAnt2 = 1; LeitoraDois.LockPicoRSSIAnt2 = 1; LeitoraDois.ContadorPassagemAnt2 += 1; } } // Atualiza o valor minimo da frequência doppler e seu tempo. if (tag.RfDopplerFrequency < LeitoraDois.PicoNegFreqDopAnt2) { LeitoraDois.PicoNegFreqDopAnt2 = tag.RfDopplerFrequency; LeitoraDois.TempoPicoNegFreqDopAnt2 = DateTime.Now.ToString("HH-mm-ss-fff"); LeitoraDois.DateTimePicoNegFreqDopAnt2 = DateTime.Now; } } // Checa se a flag de passagem das duas antenas foram setadas. // Se sim, significa que houve a passagem da TAG pelas duas antenas. // Ou seja, significa que alguem entrou ou saiu do ambiente. if (LeitoraDois.FlagPassagemAnt1 == 1 && LeitoraDois.FlagPassagemAnt2 == 1) { // Checa os tempos de cada pico para saber se a TAG entrou ou saiu do ambiente. // Se a comparacao for negativa, significa que passaram primeiro pela antena 1 e depois // pela antena 2, ou seja, a pessoa entrou no ambiente. if (DateTime.Compare(LeitoraDois.DateTimePicoRSSIAnt1, LeitoraDois.DateTimePicoRSSIAnt2) < 0) { Console.WriteLine("\n\nLeitora endereço: {0}", sender.Address); bool passagem = true; // Verifica o EPC das tags que estao registradas para verificar quem entrou no ambiente, // e ai passa o nome da pessoa para a funcao MonitoramentoSALA. foreach (var tags in GlobalData.ListaTAGs) { if (tags.EPC == tag.Epc.ToString()) { TransicaoTags.transicao_sala(sender.Address, tag.Epc.ToString(), passagem, tags.Nome, tags); } } // Seta a flag que indica que esta ocorrendo uma transicao entre ambientes. LeitoraDois.FlagTrocaAmbiente = 1; // Inicializa a Thread que faz o descarte de reports das tags por 2 segundos. // Isso eh feito para que os dados dos reports durante a transicao da pessoa // nao atrapalhem a analise. foreach (var TagRegistrada in GlobalData.ListaTAGs) { if (TagRegistrada.EPC == tag.Epc.ToString()) { TagAtual = TagRegistrada; Thread DescartaReportThread = new Thread(() => MonitoramentoTAG.DescartaReport(TagAtual)); DescartaReportThread.Start(); } } } // Checa os tempos de cada pico para saber se a TAG entrou ou saiu do ambiente. // Se a comparacao for positiva, significa que passaram primeiro pela antena 2 e depois // pela antena 1, ou seja, a pessoa saiu do ambiente. if (DateTime.Compare(LeitoraDois.DateTimePicoRSSIAnt1, LeitoraDois.DateTimePicoRSSIAnt2) > 0) { Console.WriteLine("\n\nLeitora endereço: {0}", sender.Address); bool passagem = false; // Verifica o EPC das tags que estao registradas para verificar quem saiu do ambiente, // e ai passa o nome da pessoa para a funcao MonitoramentoSALA. foreach (var tags in GlobalData.ListaTAGs) { if (tags.EPC == tag.Epc.ToString()) { TransicaoTags.transicao_sala(sender.Address, tag.Epc.ToString(), passagem, tags.Nome, tags); } } // Seta a flag que indica que esta ocorrendo uma transicao entre ambientes. LeitoraDois.FlagTrocaAmbiente = 1; //Inicializa a Thread que faz o descarte de reports das tags por 2 segundos //Thread DescartaReportThread = new Thread(MonitoramentoTAG.DescartaReport); //Thread DescartaReportThread = new Thread(() => MonitoramentoTAG.DescartaReport(TagAtual)); //DescartaReportThread.Start(); // Inicializa a Thread que faz o descarte de reports das tags por 2 segundos. // Isso eh feito para que os dados dos reports durante a transicao da pessoa // nao atrapalhem a analise. foreach (var TagRegistrada in GlobalData.ListaTAGs) { if (TagRegistrada.EPC == tag.Epc.ToString()) { TagAtual = TagRegistrada; Thread DescartaReportThread = new Thread(() => MonitoramentoTAG.DescartaReport(TagAtual)); DescartaReportThread.Start(); } } } } // Armazena o DateTime do tempo da ultima vez que foi feito uma leitura valida. GlobalData.LastSeen = DateTime.Now; //Escreve nos arquivos os dados. //GlobalData.filehandler.WriteToFile(tag.Epc.ToString(), sender.Name, tag.AntennaPortNumber, tag.RfDopplerFrequency.ToString("0.00"), tag.PeakRssiInDbm.ToString(), LeitoraDois.ContadorPassagemAnt1.ToString(), LeitoraDois.ContadorPassagemAnt2.ToString()); } } break; // Caso o report da TAG seja relacionado a Leitora #3, entra aqui. case "SpeedwayR-10-9F-BB.local": foreach (Tag tag in report) { // Variavel do tipo Tags_TG que vai armazenar a tag que foi reportada agora. Tags_TG TagAtual; // Variavel que indica se aceita o report da TAG ou nao. int TAGsReportsON = 0; // Verifica o EPC das tags que estao registradas para verificar se o report dessa TAG // deve ser aceito ou nao dependendo da variavel ReportON da TAG. Caso seja true, // a variavel TAGReportON eh setada e o report eh aceito. foreach (var TagRegistrada in GlobalData.ListaTAGs) { if (TagRegistrada.EPC == tag.Epc.ToString()) { TagAtual = TagRegistrada; if (TagAtual.ReportON == true) { TAGsReportsON = 1; } } } // Condicional com um filtro para validar leitura. Valor de RSSI tem que estar acima // do valor do filtro e TAGsReportsON tem que ser verdadeiro. if (tag.PeakRssiInDbm > GlobalData.FiltroPassaBaixaRSSI && TAGsReportsON == 1) { // Checa se a antena 1 que está lendo if (tag.AntennaPortNumber == 1) { // Se o RSSI lido do report for maior que o pico atual // de RSSI, atualiza o valor máximo de RSSI e seu tempo. if (tag.PeakRssiInDbm > LeitoraTres.PicoRSSIAnt1 && LeitoraTres.LockPicoRSSIAnt1 == 0) { LeitoraTres.PicoRSSIAnt1 = tag.PeakRssiInDbm; LeitoraTres.TempoPicoRSSIAnt1 = DateTime.Now.ToString("HH-mm-ss-fff"); LeitoraTres.DateTimePicoRSSIAnt1 = DateTime.Now; // Verifica se o pico de RSSI da antena 1 é maior ou igual que o indicador RSSI de passagem. // Se for, atualiza a flag que indica que houve passagem pela primeira antena e // da "lock" nesse valor, para que nao pegue outras medidas desnecessariamente. if (LeitoraTres.PicoRSSIAnt1 >= GlobalData.IndicadorRSSIPassagem) { LeitoraTres.FlagPassagemAnt1 = 1; LeitoraTres.LockPicoRSSIAnt1 = 1; LeitoraTres.ContadorPassagemAnt1 += 1; } } // Atualiza o valor minimo da frequência doppler e seu tempo. if (tag.RfDopplerFrequency < LeitoraTres.PicoNegFreqDopAnt1) { LeitoraTres.PicoNegFreqDopAnt1 = tag.RfDopplerFrequency; LeitoraTres.TempoPicoNegFreqDopAnt1 = DateTime.Now.ToString("HH-mm-ss-fff"); LeitoraTres.DateTimePicoNegFreqDopAnt1 = DateTime.Now; } } // Checa se a antena 2 que está lendo. if (tag.AntennaPortNumber == 2) { // Se o RSSI lido do report for maior que o pico atual // de RSSI, atualiza o valor máximo de RSSI e seu tempo. if (tag.PeakRssiInDbm > LeitoraTres.PicoRSSIAnt2 && LeitoraTres.LockPicoRSSIAnt2 == 0) { LeitoraTres.PicoRSSIAnt2 = tag.PeakRssiInDbm; LeitoraTres.TempoPicoRSSIAnt2 = DateTime.Now.ToString("HH-mm-ss-fff"); LeitoraTres.DateTimePicoRSSIAnt2 = DateTime.Now; // Verifica se o pico de RSSI da antena 1 é maior ou igual que o indicador RSSI de passagem. // Se for, atualiza a flag que indica que houve passagem pela primeira antena e // da "lock" nesse valor, para que nao pegue outras medidas desnecessariamente. if (LeitoraTres.PicoRSSIAnt2 >= GlobalData.IndicadorRSSIPassagem) { LeitoraTres.FlagPassagemAnt2 = 1; LeitoraTres.LockPicoRSSIAnt2 = 1; LeitoraTres.ContadorPassagemAnt2 += 1; } } // Atualiza o valor minimo da frequência doppler e seu tempo. if (tag.RfDopplerFrequency < LeitoraTres.PicoNegFreqDopAnt2) { LeitoraTres.PicoNegFreqDopAnt2 = tag.RfDopplerFrequency; LeitoraTres.TempoPicoNegFreqDopAnt2 = DateTime.Now.ToString("HH-mm-ss-fff"); LeitoraTres.DateTimePicoNegFreqDopAnt2 = DateTime.Now; } } // Checa se a flag de passagem das duas antenas foram setadas. // Se sim, significa que houve a passagem da TAG pelas duas antenas. // Ou seja, significa que alguem entrou ou saiu do ambiente. if (LeitoraTres.FlagPassagemAnt1 == 1 && LeitoraTres.FlagPassagemAnt2 == 1) { // Checa os tempos de cada pico para saber se a TAG entrou ou saiu do ambiente. // Se a comparacao for negativa, significa que passaram primeiro pela antena 1 e depois // pela antena 2, ou seja, a pessoa entrou no ambiente. if (DateTime.Compare(LeitoraTres.DateTimePicoRSSIAnt1, LeitoraTres.DateTimePicoRSSIAnt2) < 0) { Console.WriteLine("\n\nLeitora endereço: {0}", sender.Address); bool passagem = true; // Verifica o EPC das tags que estao registradas para verificar quem entrou no ambiente, // e ai passa o nome da pessoa para a funcao MonitoramentoSALA. foreach (var tags in GlobalData.ListaTAGs) { if (tags.EPC == tag.Epc.ToString()) { TransicaoTags.transicao_sala(sender.Address, tag.Epc.ToString(), passagem, tags.Nome, tags); } } // Seta a flag que indica que esta ocorrendo uma transicao entre ambientes. LeitoraTres.FlagTrocaAmbiente = 1; // Inicializa a Thread que faz o descarte de reports das tags por 2 segundos. // Isso eh feito para que os dados dos reports durante a transicao da pessoa // nao atrapalhem a analise. foreach (var TagRegistrada in GlobalData.ListaTAGs) { if (TagRegistrada.EPC == tag.Epc.ToString()) { TagAtual = TagRegistrada; Thread DescartaReportThread = new Thread(() => MonitoramentoTAG.DescartaReport(TagAtual)); DescartaReportThread.Start(); } } } // Checa os tempos de cada pico para saber se a TAG entrou ou saiu do ambiente. // Se a comparacao for positiva, significa que passaram primeiro pela antena 2 e depois // pela antena 1, ou seja, a pessoa saiu do ambiente. if (DateTime.Compare(LeitoraTres.DateTimePicoRSSIAnt1, LeitoraTres.DateTimePicoRSSIAnt2) > 0) { Console.WriteLine("\n\nLeitora endereço: {0}", sender.Address); bool passagem = false; // Verifica o EPC das tags que estao registradas para verificar quem saiu do ambiente, // e ai passa o nome da pessoa para a funcao MonitoramentoSALA. foreach (var tags in GlobalData.ListaTAGs) { if (tags.EPC == tag.Epc.ToString()) { TransicaoTags.transicao_sala(sender.Address, tag.Epc.ToString(), passagem, tags.Nome, tags); } } // Seta a flag que indica que esta ocorrendo uma transicao entre ambientes. LeitoraTres.FlagTrocaAmbiente = 1; //Inicializa a Thread que faz o descarte de reports das tags por 2 segundos //Thread DescartaReportThread = new Thread(MonitoramentoTAG.DescartaReport); //Thread DescartaReportThread = new Thread(() => MonitoramentoTAG.DescartaReport(TagAtual)); //DescartaReportThread.Start(); // Inicializa a Thread que faz o descarte de reports das tags por 2 segundos. // Isso eh feito para que os dados dos reports durante a transicao da pessoa // nao atrapalhem a analise. foreach (var TagRegistrada in GlobalData.ListaTAGs) { if (TagRegistrada.EPC == tag.Epc.ToString()) { TagAtual = TagRegistrada; Thread DescartaReportThread = new Thread(() => MonitoramentoTAG.DescartaReport(TagAtual)); DescartaReportThread.Start(); } } } } // Armazena o DateTime do tempo da ultima vez que foi feito uma leitura valida. GlobalData.LastSeen = DateTime.Now; //Escreve nos arquivos os dados. //GlobalData.filehandler.WriteToFile(tag.Epc.ToString(), sender.Name, tag.AntennaPortNumber, tag.RfDopplerFrequency.ToString("0.00"), tag.PeakRssiInDbm.ToString(), LeitoraTres.ContadorPassagemAnt1.ToString(), LeitoraTres.ContadorPassagemAnt2.ToString()); } } break; default: Console.Write("Caso não identificado"); break; } }