Você pode detectar facilmente algumas formas de onda simples, detectando os flancos do sinal. Um quadrado tem flancos de subida e descida rápidos, um dente de serra tem apenas flancos de subida ou descida rápidas, dependendo do sinal.
Então você verifica se há flancos crescentes e decrescentes: se você detectar os dois, é quadrado. Se você detectar apenas um tipo, é triângulo, desde que você tenha certeza de que apenas esses sinais serão recebidos.
Tente com um circuito diferenciador, que é feito facilmente com um opamp. Veja aqui: http://www.physics.iitm.ac.in/courses_files/courses/eleclab03_odd/mathematical_operations.htm
A inclinação do flanco é representada na saída do diferenciador.
Alimente esse sinal e sua inversão em Schmitt-Triggers e / ou monoflops retriggeráveis, e você terá uma representação no nível lógico do RisingFlank e FallingFlank, que por sua vez poderá ser usado para cálculos ou exibição adicionais.