Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Respiração Programada

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

Respiração Programada

Já parou para pensar em como/por que você está respirando agora? Para muitos essa atividade é tão banal que não fazem idéia do trabalho que seu corpo tem para coordenar e executar várias ações para a simples atividade de respirar. Nesta palestra pretendo falar um pouco sobre alguns desafios vividos durante 2 anos de desenvolvimento e aperfeiçoamento de um simulador virtual de ventilação mecânica voltado para ensino na área da saúde, o xlung.

Avatar for Marcelo Emanoel Bezerra Diniz

Marcelo Emanoel Bezerra Diniz

February 09, 2015
Tweet

More Decks by Marcelo Emanoel Bezerra Diniz

Other Decks in Technology

Transcript

  1. INSPIRAÇÃO Diafragma Contrai Pressão interna na caixa toráxica diminui Pressão

    atmosférica externa fica maior Diferença de pressão empurra o ar para os pulmões
  2. EXPIRAÇÃO Diafragma Relaxa Pressão interna na caixa toráxica aumenta Pressão

    atmosférica se iguala Pressão interna empurra o ar para fora dos pulmões
  3. –Manel Ventilador mecânico é uma máquina que, ligada a um

    paciente, auxilia a respiração injetando ar nos pulmões através do aumento da pressão nas vias aéreas.
  4. MOTIVAÇÕES PARA O USO DO SIMULADOR NO ENSINO Maior aprendizado

    dos alunos RISCO ZERO para pacientes Melhora substancial na qualidade de vida dos pacientes
  5. MOTIVAÇÕES PESSOAIS Trabalhar em algo que é desafiador Contribuir para

    a construção de algo útil para a sociedade e que afeta positivamente a vida de outras pessoas
  6. PVM

  7. PVM

  8. BUILD AUTOMÁGICO apply plugin: "eclipse" apply plugin: "idea" apply plugin:

    "java" apply plugin: "jacoco" apply plugin: 'ivy-publish' apply plugin: "sonar-runner" project.ext { repo = Grgit.open(project.file('.')) } group = "net.xlung" version = “${repo.head().id}" sourceCompatibility="1.8" targetCompatibility=“1.8" defaultTasks 'clean', ‘check’, 'publish' repositories { mavenCentral() }
  9. BUILD AUTOMÁGICO dependencies { testCompile("junit:junit:4.1+") { exclude(group: "org.hamcrest") } testCompile

    'org.hamcrest:hamcrest-all:1+' testCompile('org.mockito:mockito-core:1.9+') { exclude(group: "org.hamcrest") } } publishing { repositories { ivy { url "${System.properties['user.home']}/.ivy2/local" layout "pattern", { artifact "[organisation]/[module]/[revision]/jars/[artifact].[ext]" ivy "[organisation]/[module]/[revision]/ivys/ivy.xml" } } } publications { ivy(IvyPublication) { module "simulator" from components.java } } }
  10. DIAGRAMA DE ENTIDADES Tempo Real Vent. Mec. Paciente AC VCV

    AC PCV SIMV VCV SIMV PCV CPAP PSV Resp. Esp. Gráf. Alarme Freq. Alarme Vol. Alarme Fluxo
  11. DIAGRAMA DE ENTIDADES Tempo Real Vent. Mec. Paciente AC VCV

    AC PCV SIMV VCV SIMV PCV CPAP PSV Resp. Esp. Gráf. Alarme Freq. Alarme Vol. Alarme Fluxo Código Duplicado!
  12. ESTRATÉGIAS DE VENTILAÇÃO Tempo Real Vent. Mec. Paciente AC VCV

    AC PCV SIMV VCV SIMV PCV CPAP PSV Resp. Esp. Gráf. Alarme Freq. Alarme Vol. Alarme Fluxo
  13. ESTRATÉGIAS DE ALARMES Tempo Real Vent. Mec. Paciente AC VCV

    AC PCV SIMV VCV SIMV PCV CPAP PSV Resp. Esp. Gráf. Alarme Freq. Alarme Vol. Alarme Fluxo
  14. STRATEGY PATTERN Tempo Real Vent. Mec. Paciente AC VCV AC

    PCV SIMV VCV SIMV PCV CPAP PSV Resp. Esp. Gráf. Alarme Freq. Alarme Vol. Alarme Fluxo Alarme Modo Vent.
  15. STRATEGY PATTERN Tempo Real Vent. Mec. Paciente AC VCV AC

    PCV SIMV VCV SIMV PCV CPAP PSV Resp. Esp. Gráf. Alarme Freq. Alarme Vol. Alarme Fluxo Alarme Modo Vent. <<Interface>>
  16. VENTILADOR MECÂNICO /** * Atribui novo valor para a frequência.

    * @param freq Frequência. */ public void setFreq(float freq) { totalTime = (float) 60 / freq; cvvm.setFreq(freq); cpvm.setFreq(freq); simvv.setFreq(freq); simvp.setFreq(freq); }
  17. VENTILADOR MECÂNICO public float getFreq() { switch (mode) { case

    CONTROLLED_VOL_MODE: return cvvm.getFreq(); case CONTROLLED_PRES_MODE: return cpvm.getFreq(); case SIMV_VOL_MODE: return simvv.getFreq(); case SIMV_PRES_MODE: return simvp.getFreq(); case CPAP_MODE: return cpap.getFreq(); default: return 0; } }
  18. DIAGRAMA DE ENTIDADES Tempo Real Vent. Mec. Paciente AC VCV

    AC PCV SIMV VCV SIMV PCV CPAP PSV Resp. Esp. Gráf. Alarme Freq. Alarme Vol. Alarme Fluxo Alarme Modo Vent.
  19. DIAGRAMA DE ENTIDADES Tempo Real Vent. Mec. Paciente AC VCV

    AC PCV SIMV VCV SIMV PCV CPAP PSV Resp. Esp. Gráf. Alarme Freq. Alarme Vol. Alarme Fluxo Alarme Modo Vent. Entidade Desnecessária
  20. DIAGRAMA DE ENTIDADES Vent. Mec. Paciente AC VCV AC PCV

    SIMV VCV SIMV PCV CPAP PSV Resp. Esp. Gráf. Alarme Freq. Alarme Vol. Alarme Fluxo Alarme Modo Vent.
  21. DIAGRAMA DE ENTIDADES Vent. Mec. Paciente AC VCV AC PCV

    SIMV VCV SIMV PCV CPAP PSV Resp. Esp. Gráf. Alarme Freq. Alarme Vol. Alarme Fluxo Alarme Modo Vent. Thread! Thread! Thread! Thread! Thread! Thread! Thread! Thread! Thread! Thread! Thread! Thread!
  22. VENTILADOR MECÂNICO public class MechanicFan implements Runnable, Constants { /*

    Modo de ventilação. */ private int mode; private int newMode; /* Tempo total (inspiração + expiração). */ private float totalTime; /**/ private float fio2; /* Janela da apresentação gráfica. */ private Graphics graphics; /* Objeto de tempo real. */ private RealTime realTime; public LayoutWeb guiWeb; /* Objeto referênte ao modo de ventilação ciclada à volume controlado. */ private ControlledVolVentilationMode cvvm; /* Objeto referênte ao modo de ventilação ciclada à pressão controlada. */ private ControlledPresVentilationMode cpvm; /**/ private SIMVVolVentilationMode simvv; /**/ private SIMVPresVentilationMode simvp; /**/ private CPAP cpap; /* Threads responsável pela a geração dos sinais. */ private Thread cvvm_thread; private Thread cpvm_thread; private Thread simvv_thread; private Thread simvp_thread; private Thread cpap_thread; private NewMonitor monitor; private int stopmf = 0;
  23. VENTILADOR MECÂNICO public class MechanicFan implements Runnable, Constants { /*

    Modo de ventilação. */ private int mode; private int newMode; /* Tempo total (inspiração + expiração). */ private float totalTime; /**/ private float fio2; /* Janela da apresentação gráfica. */ private Graphics graphics; /* Objeto de tempo real. */ private RealTime realTime; public LayoutWeb guiWeb; /* Objeto referênte ao modo de ventilação ciclada à volume controlado. */ private ControlledVolVentilationMode cvvm; /* Objeto referênte ao modo de ventilação ciclada à pressão controlada. */ private ControlledPresVentilationMode cpvm; /**/ private SIMVVolVentilationMode simvv; /**/ private SIMVPresVentilationMode simvp; /**/ private CPAP cpap; /* Threads responsável pela a geração dos sinais. */ private Thread cvvm_thread; private Thread cpvm_thread; private Thread simvv_thread; private Thread simvp_thread; private Thread cpap_thread; private NewMonitor monitor; private int stopmf = 0; Sou uma Thread Que tem outras Threads!
  24. VENTILADOR MECÂNICO public class MechanicFan implements Runnable, Constants { /*

    Modo de ventilação. */ private int mode; private int newMode; /* Tempo total (inspiração + expiração). */ private float totalTime; /**/ private float fio2; /* Janela da apresentação gráfica. */ private Graphics graphics; /* Objeto de tempo real. */ private RealTime realTime; public LayoutWeb guiWeb; /* Objeto referênte ao modo de ventilação ciclada à volume controlado. */ private ControlledVolVentilationMode cvvm; /* Objeto referênte ao modo de ventilação ciclada à pressão controlada. */ private ControlledPresVentilationMode cpvm; /**/ private SIMVVolVentilationMode simvv; /**/ private SIMVPresVentilationMode simvp; /**/ private CPAP cpap; /* Threads responsável pela a geração dos sinais. */ private Thread cvvm_thread; private Thread cpvm_thread; private Thread simvv_thread; private Thread simvp_thread; private Thread cpap_thread; private NewMonitor monitor; private int stopmf = 0; Modos de ventilação
  25. VENTILADOR MECÂNICO /** * Troca o modo de operação do

    ventilador. */ public void switchMode() { /* Verifica qual é o modo atual e para a thread de execução. */ switch (this.mode) { case CONTROLLED_VOL_MODE: cvvm_thread.stop(); break; case CONTROLLED_PRES_MODE: cpvm_thread.stop(); break; case SIMV_VOL_MODE: simvv_thread.stop(); break; case SIMV_PRES_MODE: simvp_thread.stop(); break; case CPAP_MODE: cpap_thread.stop(); break; } }
  26. VENTILADOR MECÂNICO this.mode = newMode; /* Verifica qual o novo

    modo de operação e inicia uma nova thread de execução.*/ switch (this.mode) { case CONTROLLED_VOL_MODE: cvvm_thread = new Thread(cvvm); cvvm_thread.start(); break; case CONTROLLED_PRES_MODE: cpvm_thread = new Thread(cpvm); cpvm_thread.start(); break; case SIMV_VOL_MODE: simvv_thread = new Thread(simvv); simvv_thread.start(); break; case SIMV_PRES_MODE: simvp_thread = new Thread(simvp); simvp_thread.start(); break; case CPAP_MODE: cpap_thread = new Thread(cpap); cpap_thread.start(); break; } }
  27. Paciente AC VCV AC PCV SIMV VCV SIMV PCV CPAP

    PSV Resp. Esp. Gráf. Alarme Freq. Alarme Vol. Alarme Fluxo Vent. Mec. Thread! Modo Vent. Alarme Plotter
  28. String public static void main(String[] args) { String msg =

    "Hello World"; msg.replace("Hello ", ""); System.out.println(msg); }
  29. String public static void main(String[] args) { String msg =

    "Hello World"; msg.replace("Hello ", ""); System.out.println(msg); } "Hello World"
  30. BigDecimal public static void main(String[] args) { BigDecimal one =

    new BigDecimal(1); one.add(one); System.out.println(one); }
  31. BigDecimal public static void main(String[] args) { BigDecimal one =

    new BigDecimal(1); one.add(one); System.out.println(one); } 1
  32. CÁLCULO DO VOLUME EXPIRADO ANTES /** * Gera o sinal

    de volume durante a fase expiratória. */ public void volumeExpiration() { float timeInit = inspirationTime + inspiratoryPause; volume = (float) (volumeMax / (Math.exp((time - timeInit) / (timeConstant)))); volumeExp = volume; volume = volume + pacient.getEffortVol(); //System.out.println("V: " + pacient.getEffortVol()); volumeBase = volume; }
  33. CÁLCULO DO VOLUME EXPIRADO DEPOIS @Override public Decimal volumeExpiration(MechanicalVentilator ventilator,

    Decimal time) { Patient patient = ventilator.getPatient(); Decimal timeConstant = patient.getTimeConstant(); VentilationParameters parameters = ventilator.getVentilationParameters(); FlowMode flowMode = parameters.getFlowMode(); Decimal inspiratoryTime = flowMode.inspirationTime(mechanicalVentilator); Decimal inspiratoryPause = parameters.getInspiratoryPause(); Decimal maxVolume = ventilator.getMaxVolume(); Decimal inspirationTime = inspiratoryTime.add(inspiratoryPause); double exp = Math.exp(time.subtract(inspirationTime).divideBy(timeConstant).doubleValue()); return maxVolume.divideBy(exp); }
  34. TESTE public class ControlledVolumeVentilationModeSpec { @Mock private MechanicalVentilator ventilator; @Mock

    private Patient patient; @Mock private VentilationParameters ventilationParameters; @Mock private FlowMode flowMode; private ControlledVolumeVentilationMode ventilationMode; @Before public void setUp() { MockitoAnnotations.initMocks(this); when(ventilator.getPatient()).thenReturn(patient); when(ventilator.getVentilationParameters()) .thenReturn(ventilationParameters); when(ventilationParameters.getFlowMode()).thenReturn(flowMode); ventilationMode = new ControlledVolumeVentilationMode(); }
  35. TESTE /** * timeInit = inspirationTime + inspiratoryPause; * volume

    = patient.getEffortVolume() + * (maxVolume / Math.exp((time - timeInit) / patient.timeConstant)); */ @Test public void volumeInExpirationObeysTheFollowingEquation() { when(flowMode.inspirationTime(ventilator)).thenReturn(TEN); when(ventilationParameters.getInspiratoryPause()).thenReturn(ZERO); when(patient.getEffortVolume()).thenReturn(new Decimal(20)); when(patient.getTimeConstant()).thenReturn(new Decimal(45)); when(ventilator.getMaxVolume()).thenReturn(new Decimal(500)); assertThat(ventilationMode.volumeExpiration(ventilator, ZERO), is(new Decimal("624.42241"))); }
  36. SOMA DE FLOATS public class Main { public static void

    main(String[] args) { for(float v = 0; v < 1; v += 0.1) { System.out.println(v); } } }
  37. BIGDECIMAL PARA GANHAR PRECISÃO • Se precisão é um problema,

    em vez de usar números de ponto flutuante (float e double), recomenda-se a utilização de BigDecimal
  38. SOMA DE BIGDECIMALS public class Main { public static void

    main(String[] args) { BigDecimal limite = new BigDecimal(1); BigDecimal incremento = new BigDecimal("0.1"); for(BigDecimal soma = new BigDecimal("0.0"); soma.compareTo(limite) < 0; soma = soma.add(incremento)) { System.out.println(soma); } } }
  39. public class MyClass { public int FIRST = 1; //

    Inválido public int second = 2; // Válido }
  40. package my.company; import java.lang.String; // Inválido - classes do pacote

    java.lang são implicitamente importadas import my.company.SomeClass; // Inválido - arquivos do mesmo pacote são implicitamente importados import java.io.File; // Inválido - File não está sendo usado import my.company2.SomeType; import my.company2.SomeType; // Inválido - 'SomeType' já foi importado class ExampleClass { public String someString; public SomeType something; }
  41. PRECISAMOS SAIR DO APPLET Tecnologia de 10 anos atrás Difícil

    encontrar bibliotecas que se adequem ao problema Difícil de melhorar o layout
  42. SCALA Permite utilizar toda a base de código Java existente

    Introduz melhorias de legibilidade Permite usar programação funcional Favorece concorrência e escalabilidade
  43. FRAMEWORK WEB FULL STACK MVC Templates compilados Assets (javascripts, css,

    imagens) compilados Acesso a dados Java e Scala