Cambio de pantalla en una HTC P3300. Uno de bricomania…

Hace unos meses durante la ejecución del MobilityShow tuve la mala suerte, por las prisas, la lluvia, el frio y el ir corriendo de un lado a otro de “sentarme” encima de la PDA con la consiguiente rotura de la pantalla (y todo justificado ya que llevaba dos HTC Dyamond en cada uno de los bolsillos delanteros, cargado con el portátil y encima estaba lloviendo….) el caso es que la PDA termino en este terrible estado.

Pantalla seccionada, la parte táctil aún funcionaba pero eso no era de mucho consuelo, tras evaluar si me merecía la pena mandarla a reparar fuera de la garantía el mandarla a la casa salía por un ojo pero encontré por e-bay una pantalla para la PDA y por solo 25€ (gastos ya incluidos) así que me dije que era hora de hacer un poco de bricomanía,así que: Hola amigos aquí va el bricocapitulo, como cambiar la pantalla de tu HTC P3300 sin tener una turbosierradelmegacoponbendito en el garaje.

Lo primero decir que junto con la pantalla venían también dos destornilladores cabeza de tor para aflojar la tornillería y una pieza de plástico para facilitar la apertura de la PDA sin dañar demasiado el plástico.

Lo primero, apagamos la PDA, retiramos la tapa trasera y la batería .

Paso1

A continuación retiramos la tapa superior trasera, (Donde está el objetivo de la cámara), para ello nos ayudaremos con una pieza de plástico para evitar dañar la pieza.

Paso2

Una vez retirada procederemos a quitar los tornillos de sujección que se encuentran en las esquinas, (me niego a poner una foto de como desatornillar un tornillo jejeje)

Con los tornillos retirados (con esto nos acabamos de cargar la garantia, en caso de que aún estuviese vigente) debemos separar con cuidado la parte trasera de la cubierta, este es uno de los pasos “delicados”, ya que para evitar romperla deberemos encontrar las “patillas” que sujetan la carcasa e ir abriéndolas una a una.

Aquí os muestro algunas de ellas (se encuentran fácilmente) pero no forceis o las partiréis.

Paso3 

A ambos lados de la parte inferior (ojo con apretar demasiado)

Paso4

Y en los laterales, a ambos lados por la parte central. Finalmente os quedaréis por un lado con la parte frontal y por otro con la carcasa trasera.

Paso5

En este punto es en el que empiezas a pensar que tu PDA no volverá a encenderse jamás y pides ayuda para compartir las culpas (Gracias Mario por la ayuda jejeje)

Continuamos, ahora debemos retirar la carcasa frontal, par facilitarnos el trabajo aflojáremos las patillas laterales, podéis verlas en la imagen inferior.

Paso6A

Una vez aflojadas las patillas procedemos a ir separando la carcasa del núcleo de la PDA cuidadosamente.

Paso6 

Así hasta que terminemos separando la carcasa definitivamente.

Paso7

Una vez llegados aquí damos la vuelta y procederemos a desensamblar la pantalla del dispositivo, par ello lo primero es localizar la cinta de datos, aflojar las patillas que la sujetan y procederemos a retirarla con cuidado de no dañar el conector (la pantalla nos da igual… total esta rota).

Paso8

Paso9

Una vez retirada la cinta de datos procedemos a retirar la pantalla averiada, es muy sencillo pero debemos tener cuidado ya que la pantalla seguramente estará sujeta con algo de cola al soporte.

Paso10

Retiramos la lengueta.

Paso11 

Nos ayudamos con un destornillador plano para despegar la pantalla.

Paso12

Hasta que finalmente conseguimos retirar la vieja pantalla, a partir de aquí los pasos a seguir son básicamente los mismos en orden inverso, lo único deciros que mucha paciencia para colocar la cinta de datos de nuevo en su soporte, tomaroslo con mucha calma ya que sin práctica a la primera es complicado y podemos dañar el conector.

Una vez colocada la nueva pantalla antes de proceder a ensamblar todo colocaremos la batería y haremos una prueba de encendido para ver si todo esta correcto.

Paso13

Debemos sujetar la batería en su soporte para poder hacer la prueba.

Paso14 

Una vez que vemos que todo funciona correctamente procedemos a ensamblar todo de nuevo y listo, pantalla arreglada.

Paso15

 

Espero que esto os sirva, a mi me alegro el día jejeje, la verdad es que recuperarla ha sido todo una suerte que ya la daba por perdida.

Un saludo!

José Antonio Gallego

Mobile .NET Users Group

Nueva Actualización de la guía de Arquitectura para desarrollo Móvil 1.1

Si hace un par de meses en Codeplex se publicó la nueva guía de arquitectura para desarrollo Móvil ahora se acaba de lanzar la versión 1.1, por lo que me ha dado tiempo a revisar los cambios han ido orientados a la incorporación de recomendaciones sobre UI y nuevos métodos de comunicación SyncServices.

El orden de los capítulos es el mismo por lo que solo se han realizado modificaciones en la parte importante, en lo que se debe y no se debe hacer :)

Además ha contado con la colaboración de Rof Tiffany y Rabi Satter.

Aquí os dejo el enlace para la guía. Actualización de la guía de Arquitectura para desarrollo Móvil 1.1

A disfrutarla!!

Centinela Bluetooth para Windows Mobile, jugando con RegistryState

Se acabó el darte cuenta al llegar al trabajo que dejaste la mochila con el portátil en casa… y es que cansado ya de salir corriendo de casa y darme cuenta “demasiado tarde” de que no llevo el portátil encima se me ocurrió inspirado en la nueva idea de Nokia (bueno no tan nueva todos conocemos los busca llaves) que están desarrollando un sistema para localizar objetos con el móvil, el desarrollar algo similar para Windows Mobile y claro, sin tener que gastarme ni un euro que esta la cosa muy mal para hacer derroches.

image

 

El objetivo ha sido crear una aplicación capaz de avisarme en la PDA si me separo de mi manos libres Bluetooth, además el aviso debe saltar aunque la aplicación NO este corriendo en ese momento y aunque la PDA NO esté encendida… Con lo que dejando el manos libres en la mochila si me alejo saltara la alarma.

image

 

Así que manos a la obra, para hacerlo tan solo he necesitado en lo que a hardware se refiere mi PDA HTC P3300 con Windows Mobile 5.0 y el manos libres Bluetooth, para todo lo demás RegistryState de Microsoft.WindowsMobile.Status y algunas llamadas a Pinvoke.

Mediante RegistryState podemos detectar cuando se produce algún cambio en cualquier clave del registro de nuestro dispositivo, y además nos genera el evento correspondiente y nos provee de los métodos necesarios para recuperar los valores que deseemos, basándonos en esto, la clave del registro HKEY_LOCAL_MACHINESystemStateHardwareBluetooth se actualiza con los cambios de estado del Bluetooth de nuestro dispositivo por lo que empezaremos por ahí.

image

En nuestra aplicación para poder capturar dichos cambios tan solo necesitamos crear lo siguiente:

//Como detectar los cambios producidos en el registro

(…)

    const string registryKey = @”HKEY_LOCAL_MACHINESystemStateHardware”;
    const string registryValueName = @”Bluetooth”;

    Microsoft.WindowsMobile.Status.RegistryState rg;    
    rg = new RegistryState(registryKey, registryValueName);                       
    rg.Changed += new ChangeEventHandler(rg_Changed); 
(…)

void rg_Changed(object sender, ChangeEventArgs args)
{  

}

De este modo cada vez que se produzca un cambio en esta clave (Activemos o desactivemos el Bluetooth, conectemos o desconectemos un dispositivo) se ejecutara en nuestro caso la función rg_Changed.

Así que con esto ya tenemos la primera parte resuelta, en caso de tener la PDA emparejada con el manos libres, si nos dejamos el manos libres en la mochila y nos alejamos se perderá la conexión y se producirá un cambio en el estado ejecutándose el método rg_Changed, y ahí podemos poner que vibre la PDA o que suene la flauta si hace falta, pero que ocurre si nuestra aplicación NO se está ejecutando en ese momento… pues obviamente que no funcionara, pero también lo podemos resolver con cuatro líneas de código gracias al método EnableApplicationLauncher que nos permite asociar una aplicación a un evento del sistema. Es decir que si ocurre un cambio, como puede ser el del estado del Bluetooth, que ejecute la aplicación que especificaremos por código.

Para ello agregaremos

//Como hacer que se ejecute una aplicación al detectar un cambio en el estado del dispositivo

const string appId = “DetectorBT”;
const string applicationFileName = @”Archivos de programaDetectorBTDetectorBT.exe”;
rg.EnableApplicationLauncher(appId, applicationFileName);

Así aun cuando cerremos la aplicación si nuestra PDA está encendida si se ejecuta cualquier cambio en la clave Bluetooth nuestra aplicación se ejecutara y ya tenemos otro punto solucionado… pero ahora viene “lo gordo”, está claro que si nos acordamos de encender la PDA para ver que no se nos olvida nada nos acordaremos del portatil y esta claro que a las 7 de la mañana no te vas a acordar de encender la PDA por lo que debemos implementar “algo” que active la PDA para que veamos el aviso.

El como encender la pda lo podemos resolver con dos llamadas a nativo PowerPolicyNotify y SetSystemPowerState como se muestra a continuación

//Como encender la PDA mediante código

[DllImport(“coredll.dll”, CharSet = CharSet.Unicode)]
private static extern bool PowerPolicyNotify(int dwMessage, int dwData);

[DllImport(“coredll.dll”, SetLastError = true)]
static extern int SetSystemPowerState(string psState, int StateFlags, int Options);

/// <summary>
/// Despierta el dispositivo
/// </summary>
public void WakeUpPDA()
{
    PowerPolicyNotify((int)PPN_Message.PPN_UNATTENDEDMODE, 1);
    int iReturnResult = SetSystemPowerState(null, (int)PowerState.POWER_STATE_ON, (int)PowerRequirement.POWER_FORCE);
}

Así que de este modo si llamamos a WakeUpPDA cuando por ejemplo perdamos el control del manos libres y el estado vuelva a encendido y en espera (valor 9) despertamos la PDA y veremos el aviso que hayamos creado.

Con todo esto os dejo la aplicación de ejemplo Centinela Bluetooth para que alguno se anime a mejorarla, está claro que lo genial sería que fuese capaz de calcular la distancia a la que se encuentra pero en 2 horas no me ha dado tiempo a mucho mas.

Una de las opciones que estaba barajando era la de intentar estimar a que distancia se encuentra el dispositivo pero dadas las características del protocolo bluetooth y del tipo de dispositivo que estoy utilizando (uno de tipo 3 con alcance hasta 100 metros) no ha sido posible.

Todo esto está desarrollado para Windows Mobile 5.0 de ahí que utilice RegistryState en lugar de SystemSate para poder utilizar esta aplicación como ejemplo.

Saludos!!!

José Antonio Gallego

Ups, casi se me olvida aquí os dejo la solución con el ejemplo para Visual Studio 2008 y Windows Mobile 5.0 (MobileNUG.DetectorBT);

Modificando las SoftKeys en Windows Mobile

Todos nuestros dispositivos móviles dotados con Windows Mobile vienen con las SoftKeys configuradas de serie, bien con la configuración original de la ROM del fabricante, bien con la del proveedor. Es muy corriente que queramos que nuestra aplicación pueda ser activada utilizando alguna de las Softkeys. Para ello tan solo debemos hacer una pequeña modificación en el registro, aunque antes debemos localizar la ubicación correcta de las claves, estas son Keys112 para la tecla izquierda y 113 para la tecla derecha.

En Windows Mobile 5 y Windows Mobile 6 podemos encontrarla en [HKEY_CURRENT_USERSoftwareMicrosoftTodayKeys112 y 113 dentro de cada una de las claves encontraremos dos valores de cadena el primero (Default) contendrá el texto que se mostrará en el menú, si agregamos un nuevo valor llamado “open” podremos especificar el ejecutable o acceso directo a lanzar cuando se presione el botón.

image

Como podéis ver es una modificación muy sencilla, en caso de no encontrar esta entrada podremos crearlas, por ejemplo si hacemos la prueba con los emuladores, encontraremos la clave Today pero no la clave Keys.

image

Un saludo a todos!

José Antonio Gallego

Mobile .NET Users Group

Redimiento en Compact Framework – Carga de datos en un DataGrid

Siguiendo en la línea de “agradar” a nuestros clientes, y porque no decirlo a nuestros pequeños corazoncillos, algo que suele marcar la diferencia entre una solución aceptable y otra que caerá en el olvido es la velocidad con la que nuestra aplicación se mueva, por ello y para comenzar esta nueva línea he recopilado algunos de los ejemplos que tenia por ahí olvidados y me he dedicado a ponerlos en comparativa. El primer ejemplo que voy a tratar es la carga de datos en un DataGrid, utilizando tres métodos, carga de datos desde un DataSet mediante el asistente que nos da la herramienta de Visual Studio, es decir utilizando un tableadapter un bindignsource y el dataset correpondiente, el otro método consistirá en cargar los datos en un DataTable que definiremos y cargaremos en tiempo de ejecución, la carga de datos la realizaremos simplemente con un SqlCeDataReader para recorrer y asignar los datos y asignar el datatable al Datasource del DataGrid (vaya trabalenguas), y por último la misma operación pero utilizando como lector un SqlCeResultSet.

image

Como podéis ver el cargar un DataGrid directamente rellenando un DataTable creado en tiempo de ejecución reduce el tiempo de muestreo de los datos en nuestro DataGríd casi a la mitad que utilizando el asistente eso sin contar con la cantidad de memoria utilizada que no es el objetivo de esta prueba.

Por supuesto que esto solo nos puede resultar útil para mostrar grandes volúmenes de datos (cosa que en aplicaciones móviles no es muy recomendado) ya que para volúmenes de pequeños (menos de 500) no hay mucha diferencia, aunque personalmente una diferencia de ver los resultados de forma casi instantánea a esperar uno o dos segundos si que es importante.

Para lo demás os dejo que toméis vuestras propias conclusiones, las pruebas las he realizado contra un dispositivo real, mi pobre y resucitada HTC P3300 con un procesador OMAP850-210MHz. realizando cargas de 100, 1000 y 10000 registros de una tabla con cuatro campos, por lo que los resultados pueden variar en caso de utilizar otros dispositivos aunque siempre de forma proporcional, también lo he probado contra el emulador pero para este tipo de pruebas los resultados no son fiables.

Y eso es todo por hoy.

Saludos

José Antonio Gallego

Mobile .NET Users Group

Custom Controls en Compact Framework – personalizando un Listview

Como la mayoría de los desarrolladores el sentido del diseño lo tuve aparcado durante algún tiempo, pero a medida que te involucras en los desarrollos, y sobre todo cuando estas cerca del cliente de das cuenta que una buena funcionalidad no lo es todo, el cliente/usuario final, no tiene porque comprender la complejidad de un desarrollo y posiblemente no sepa valorarla, en cambio una interfaz de usuario atractiva cambia las cosas, algunas de las principales novedades respecto a tecnología móvil en estos últimos tiempos ha ido principalmente en esa dirección, creando nuevos medios de interacción con el usuario, como pueden ser los acelerometros, o interfaces de usuario atractivas como el Touch flow de htc… pero eso lo estoy dejando para un post posterior.


Este fin de semana rastreando por la msdn e recopilado unos cuantos métodos para crear un control Listview personalizado para Compact Framework.


Curiosamente todas las funcionalidades que vamos a utilizar para la creación de este control YA están contenidas en el mismo de forma nativa, pero por algún motivo que aún no he descubierto, estas propiedades no están accesibles en el control desde código manejado, por lo que únicamente tendremos que enviar los mensajes necesarios para activar las funcionalidades que deseemos y obtener un resultado como el de la imagen… (insisto… no soy diseñador jeje)


 


 


Ejemplo ListViewEx 

 


Para poder crear nuestro propio control listView crearemos un control personalizado que herede del control ListView y a continuación declararemos la funciones que harán las llamadas a nativo, para esto tan solo necesitamos la invocación a SendMessage (Manejado , Nativo)


Una vez agregada la llamada declararemos las propiedades que extenderán nuestro control Gradient, GridLines, BackgroundImage y DoubleBuffering éstas funciones hacen relación con las constantes LVS_EX_GRADIENT, LVS_EX_GRIDLINES, LVM_SETBKIMAGE y LVS_EX_DOUBLEBUFFER respectivamente. Si queréis ver todas las posibilidades visitar este enlace.


Como no soy muy dado a andarme por las ramas aquí os dejo un ejemplo con el código fuente del control y la aplicación de ejemplo, lo único destacar lo siguiente, he buscado los ejemplos para mostrar como utilizar la funcionalidad bien mediante p/invoke o bien mediante MessageWindow.SendMessage desde el espacio de nombres Microsoft.WindowsCE.Forms.


MobileNug.Controles.ListviewEx.zip


Un saludo a todos y espero que os sea útil, por su puesto si lo ampliáis seria fantástico que lo compartáis. Esto mismo se puede hacer con otros controles. Así que adelante.


José Antonio Gallego

Mobile .NET Users Group